@@ -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