@@ -12,12 +12,12 @@ use crate::MemFlags;
1212use  rustc_ast as  ast; 
1313use  rustc_ast:: { InlineAsmOptions ,  InlineAsmTemplatePiece } ; 
1414use  rustc_hir:: lang_items:: LangItem ; 
15- use  rustc_middle:: mir:: { self ,  AssertKind ,  SwitchTargets ,  UnwindTerminateReason } ; 
15+ use  rustc_middle:: mir:: { self ,  AssertKind ,  BasicBlock ,   SwitchTargets ,  UnwindTerminateReason } ; 
1616use  rustc_middle:: ty:: layout:: { HasTyCtxt ,  LayoutOf ,  ValidityRequirement } ; 
1717use  rustc_middle:: ty:: print:: { with_no_trimmed_paths,  with_no_visible_paths} ; 
1818use  rustc_middle:: ty:: { self ,  Instance ,  Ty } ; 
1919use  rustc_session:: config:: OptLevel ; 
20- use  rustc_span:: { source_map:: Spanned ,  sym,  Span ,   Symbol } ; 
20+ use  rustc_span:: { source_map:: Spanned ,  sym,  Span } ; 
2121use  rustc_target:: abi:: call:: { ArgAbi ,  FnAbi ,  PassMode ,  Reg } ; 
2222use  rustc_target:: abi:: { self ,  HasDataLayout ,  WrappingRange } ; 
2323use  rustc_target:: spec:: abi:: Abi ; 
@@ -672,7 +672,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
672672        & mut  self , 
673673        helper :  & TerminatorCodegenHelper < ' tcx > , 
674674        bx :  & mut  Bx , 
675-         intrinsic :  Option < Symbol > , 
675+         intrinsic :  Option < ty :: IntrinsicDef > , 
676676        instance :  Option < Instance < ' tcx > > , 
677677        source_info :  mir:: SourceInfo , 
678678        target :  Option < mir:: BasicBlock > , 
@@ -682,7 +682,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
682682        // Emit a panic or a no-op for `assert_*` intrinsics. 
683683        // These are intrinsics that compile to panics so that we can get a message 
684684        // which mentions the offending type, even from a const context. 
685-         let  panic_intrinsic = intrinsic. and_then ( |s | ValidityRequirement :: from_intrinsic ( s ) ) ; 
685+         let  panic_intrinsic = intrinsic. and_then ( |i | ValidityRequirement :: from_intrinsic ( i . name ) ) ; 
686686        if  let  Some ( requirement)  = panic_intrinsic { 
687687            let  ty = instance. unwrap ( ) . args . type_at ( 0 ) ; 
688688
@@ -818,14 +818,20 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
818818        // The arguments we'll be passing. Plus one to account for outptr, if used. 
819819        let  arg_count = fn_abi. args . len ( )  + fn_abi. ret . is_indirect ( )  as  usize ; 
820820
821-         if  intrinsic ==  Some ( sym:: caller_location)  { 
821+         if  matches ! ( intrinsic,   Some ( ty :: IntrinsicDef   {  name :   sym:: caller_location,  ..  } ) )  { 
822822            return  if  let  Some ( target)  = target { 
823823                let  location =
824824                    self . get_caller_location ( bx,  mir:: SourceInfo  {  span :  fn_span,  ..source_info } ) ; 
825825
826826                let  mut  llargs = Vec :: with_capacity ( arg_count) ; 
827-                 let  ret_dest =
828-                     self . make_return_dest ( bx,  destination,  & fn_abi. ret ,  & mut  llargs,  true ,  true ) ; 
827+                 let  ret_dest = self . make_return_dest ( 
828+                     bx, 
829+                     destination, 
830+                     & fn_abi. ret , 
831+                     & mut  llargs, 
832+                     intrinsic, 
833+                     Some ( target) , 
834+                 ) ; 
829835                assert_eq ! ( llargs,  [ ] ) ; 
830836                if  let  ReturnDest :: IndirectOperand ( tmp,  _)  = ret_dest { 
831837                    location. val . store ( bx,  tmp) ; 
@@ -838,16 +844,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
838844        } 
839845
840846        let  instance = match  intrinsic { 
841-             None  | Some ( sym:: drop_in_place)  => instance, 
847+             None  | Some ( ty :: IntrinsicDef   {   name :   sym:: drop_in_place,  ..  } )  => instance, 
842848            Some ( intrinsic)  => { 
843849                let  mut  llargs = Vec :: with_capacity ( 1 ) ; 
844850                let  ret_dest = self . make_return_dest ( 
845851                    bx, 
846852                    destination, 
847853                    & fn_abi. ret , 
848854                    & mut  llargs, 
849-                     true , 
850-                     target. is_some ( ) , 
855+                     Some ( intrinsic ) , 
856+                     target, 
851857                ) ; 
852858                let  dest = match  ret_dest { 
853859                    _ if  fn_abi. ret . is_indirect ( )  => llargs[ 0 ] , 
@@ -865,7 +871,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
865871                        // The indices passed to simd_shuffle in the 
866872                        // third argument must be constant. This is 
867873                        // checked by the type-checker. 
868-                         if  i == 2  && intrinsic == sym:: simd_shuffle { 
874+                         if  i == 2  && intrinsic. name  == sym:: simd_shuffle { 
869875                            if  let  mir:: Operand :: Constant ( constant)  = & arg. node  { 
870876                                let  ( llval,  ty)  = self . simd_shuffle_indices ( bx,  constant) ; 
871877                                return  OperandRef  { 
@@ -895,14 +901,33 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
895901                            MergingSucc :: False 
896902                        } ; 
897903                    } 
898-                     Err ( instance)  => Some ( instance) , 
904+                     Err ( instance)  => { 
905+                         if  intrinsic. must_be_overridden  { 
906+                             span_bug ! ( 
907+                                 span, 
908+                                 "intrinsic {} must be overridden by codegen backend, but isn't" , 
909+                                 intrinsic. name, 
910+                             ) ; 
911+                         } 
912+                         Some ( instance) 
913+                     } 
899914                } 
900915            } 
901916        } ; 
902917
903918        let  mut  llargs = Vec :: with_capacity ( arg_count) ; 
904919        let  destination = target. as_ref ( ) . map ( |& target| { 
905-             ( self . make_return_dest ( bx,  destination,  & fn_abi. ret ,  & mut  llargs,  false ,  true ) ,  target) 
920+             ( 
921+                 self . make_return_dest ( 
922+                     bx, 
923+                     destination, 
924+                     & fn_abi. ret , 
925+                     & mut  llargs, 
926+                     None , 
927+                     Some ( target) , 
928+                 ) , 
929+                 target, 
930+             ) 
906931        } ) ; 
907932
908933        // Split the rust-call tupled arguments off. 
@@ -1635,10 +1660,10 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
16351660        dest :  mir:: Place < ' tcx > , 
16361661        fn_ret :  & ArgAbi < ' tcx ,  Ty < ' tcx > > , 
16371662        llargs :  & mut  Vec < Bx :: Value > , 
1638-         is_intrinsic :   bool , 
1639-         has_target :   bool , 
1663+         intrinsic :   Option < ty :: IntrinsicDef > , 
1664+         target :   Option < BasicBlock > , 
16401665    )  -> ReturnDest < ' tcx ,  Bx :: Value >  { 
1641-         if  !has_target  { 
1666+         if  target . is_none ( )  { 
16421667            return  ReturnDest :: Nothing ; 
16431668        } 
16441669        // If the return is ignored, we can just return a do-nothing `ReturnDest`. 
@@ -1659,7 +1684,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
16591684                        tmp. storage_live ( bx) ; 
16601685                        llargs. push ( tmp. llval ) ; 
16611686                        ReturnDest :: IndirectOperand ( tmp,  index) 
1662-                     }  else  if  is_intrinsic  { 
1687+                     }  else  if  intrinsic . is_some ( )  { 
16631688                        // Currently, intrinsics always need a location to store 
16641689                        // the result, so we create a temporary `alloca` for the 
16651690                        // result. 
0 commit comments