@@ -2735,6 +2735,7 @@ where
27352735 can_unwind : fn_can_unwind ( cx. tcx ( ) . sess . panic_strategy ( ) , codegen_fn_attr_flags, conv) ,
27362736 } ;
27372737 fn_abi. adjust_for_abi ( cx, sig. abi ) ;
2738+ debug ! ( "FnAbi::new_internal = {:?}" , fn_abi) ;
27382739 fn_abi
27392740 }
27402741
@@ -2748,7 +2749,7 @@ where
27482749 || abi == SpecAbi :: RustIntrinsic
27492750 || abi == SpecAbi :: PlatformIntrinsic
27502751 {
2751- let fixup = |arg : & mut ArgAbi < ' tcx , Ty < ' tcx > > | {
2752+ let fixup = |arg : & mut ArgAbi < ' tcx , Ty < ' tcx > > , is_ret : bool | {
27522753 if arg. is_ignore ( ) {
27532754 return ;
27542755 }
@@ -2786,8 +2787,11 @@ where
27862787 _ => return ,
27872788 }
27882789
2790+ let max_by_val_size =
2791+ if is_ret { call:: max_ret_by_val ( cx) } else { Pointer . size ( cx) } ;
27892792 let size = arg. layout . size ;
2790- if arg. layout . is_unsized ( ) || size > Pointer . size ( cx) {
2793+
2794+ if arg. layout . is_unsized ( ) || size > max_by_val_size {
27912795 arg. make_indirect ( ) ;
27922796 } else {
27932797 // We want to pass small aggregates as immediates, but using
@@ -2796,9 +2800,9 @@ where
27962800 arg. cast_to ( Reg { kind : RegKind :: Integer , size } ) ;
27972801 }
27982802 } ;
2799- fixup ( & mut self . ret ) ;
2803+ fixup ( & mut self . ret , true ) ;
28002804 for arg in & mut self . args {
2801- fixup ( arg) ;
2805+ fixup ( arg, false ) ;
28022806 }
28032807 if let PassMode :: Indirect ( ref mut attrs, _) = self . ret . mode {
28042808 attrs. set ( ArgAttribute :: StructRet ) ;
0 commit comments