11use crate :: abi:: call:: { FnType , ArgType , Uniform } ;
22use crate :: abi:: { HasDataLayout , LayoutOf , TyLayout , TyLayoutMethods } ;
33
4- fn classify_ret_ty < ' a , Ty , C > ( cx : & C , ret : & mut ArgType < ' a , Ty > )
4+ fn unwrap_trivial_aggregate < ' a , Ty , C > ( cx : & C , val : & mut ArgType < ' a , Ty > ) -> bool
55 where Ty : TyLayoutMethods < ' a , C > + Copy ,
66 C : LayoutOf < Ty = Ty , TyLayout = TyLayout < ' a , Ty > > + HasDataLayout
77{
8- if ret . layout . is_aggregate ( ) {
9- if let Some ( unit) = ret . layout . homogeneous_aggregate ( cx) . unit ( ) {
10- let size = ret . layout . size ;
8+ if val . layout . is_aggregate ( ) {
9+ if let Some ( unit) = val . layout . homogeneous_aggregate ( cx) . unit ( ) {
10+ let size = val . layout . size ;
1111 if unit. size == size {
12- ret . cast_to ( Uniform {
12+ val . cast_to ( Uniform {
1313 unit,
1414 total : size
1515 } ) ;
16- return ;
16+ return true ;
1717 }
1818 }
19+ }
20+ false
21+ }
1922
20- ret. make_indirect ( ) ;
23+
24+ fn classify_ret_ty < ' a , Ty , C > ( cx : & C , ret : & mut ArgType < ' a , Ty > )
25+ where Ty : TyLayoutMethods < ' a , C > + Copy ,
26+ C : LayoutOf < Ty = Ty , TyLayout = TyLayout < ' a , Ty > > + HasDataLayout
27+ {
28+ ret. extend_integer_width_to ( 32 ) ;
29+ if ret. layout . is_aggregate ( ) {
30+ if !unwrap_trivial_aggregate ( cx, ret) {
31+ ret. make_indirect ( ) ;
32+ }
2133 }
2234}
2335
24- fn classify_arg_ty < Ty > ( arg : & mut ArgType < ' _ , Ty > ) {
36+ fn classify_arg_ty < ' a , Ty , C > ( cx : & C , arg : & mut ArgType < ' a , Ty > )
37+ where Ty : TyLayoutMethods < ' a , C > + Copy ,
38+ C : LayoutOf < Ty = Ty , TyLayout = TyLayout < ' a , Ty > > + HasDataLayout
39+ {
40+ arg. extend_integer_width_to ( 32 ) ;
2541 if arg. layout . is_aggregate ( ) {
26- arg. make_indirect_byval ( ) ;
42+ if !unwrap_trivial_aggregate ( cx, arg) {
43+ arg. make_indirect_byval ( ) ;
44+ }
2745 }
2846}
2947
@@ -37,6 +55,6 @@ pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
3755
3856 for arg in & mut fty. args {
3957 if arg. is_ignore ( ) { continue ; }
40- classify_arg_ty ( arg) ;
58+ classify_arg_ty ( cx , arg) ;
4159 }
4260}
0 commit comments