1
1
use crate :: abi:: call:: { FnType , ArgType , Uniform } ;
2
2
use crate :: abi:: { HasDataLayout , LayoutOf , TyLayout , TyLayoutMethods } ;
3
3
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
5
5
where Ty : TyLayoutMethods < ' a , C > + Copy ,
6
6
C : LayoutOf < Ty = Ty , TyLayout = TyLayout < ' a , Ty > > + HasDataLayout
7
7
{
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 ;
11
11
if unit. size == size {
12
- ret . cast_to ( Uniform {
12
+ val . cast_to ( Uniform {
13
13
unit,
14
14
total : size
15
15
} ) ;
16
- return ;
16
+ return true ;
17
17
}
18
18
}
19
+ }
20
+ false
21
+ }
19
22
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
+ }
21
33
}
22
34
}
23
35
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 ) ;
25
41
if arg. layout . is_aggregate ( ) {
26
- arg. make_indirect_byval ( ) ;
42
+ if !unwrap_trivial_aggregate ( cx, arg) {
43
+ arg. make_indirect_byval ( ) ;
44
+ }
27
45
}
28
46
}
29
47
@@ -37,6 +55,6 @@ pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
37
55
38
56
for arg in & mut fty. args {
39
57
if arg. is_ignore ( ) { continue ; }
40
- classify_arg_ty ( arg) ;
58
+ classify_arg_ty ( cx , arg) ;
41
59
}
42
60
}
0 commit comments