3
3
use crate :: prelude:: * ;
4
4
use crate :: value_and_place:: assert_assignable;
5
5
6
- use cranelift_codegen:: ir:: ArgumentPurpose ;
7
- use rustc_target:: abi:: call:: { ArgAbi , CastTarget , PassMode , Reg , RegKind } ;
6
+ use cranelift_codegen:: ir:: { ArgumentExtension , ArgumentPurpose } ;
7
+ use rustc_target:: abi:: call:: {
8
+ ArgAbi , ArgAttributes , ArgExtension as RustcArgExtension , CastTarget , PassMode , Reg , RegKind ,
9
+ } ;
8
10
use smallvec:: { smallvec, SmallVec } ;
9
11
10
12
pub ( super ) trait ArgAbiExt < ' tcx > {
@@ -27,6 +29,15 @@ fn reg_to_abi_param(reg: Reg) -> AbiParam {
27
29
AbiParam :: new ( clif_ty)
28
30
}
29
31
32
+ fn apply_arg_attrs_to_abi_param ( mut param : AbiParam , arg_attrs : ArgAttributes ) -> AbiParam {
33
+ match arg_attrs. arg_ext {
34
+ RustcArgExtension :: None => { }
35
+ RustcArgExtension :: Zext => param. extension = ArgumentExtension :: Uext ,
36
+ RustcArgExtension :: Sext => param. extension = ArgumentExtension :: Sext ,
37
+ }
38
+ param
39
+ }
40
+
30
41
fn cast_target_to_abi_params ( cast : CastTarget ) -> SmallVec < [ AbiParam ; 2 ] > {
31
42
let ( rest_count, rem_bytes) = if cast. rest . unit . size . bytes ( ) == 0 {
32
43
( 0 , 0 )
@@ -82,55 +93,62 @@ fn cast_target_to_abi_params(cast: CastTarget) -> SmallVec<[AbiParam; 2]> {
82
93
args
83
94
}
84
95
85
- // FIXME respect argument extension mode
86
-
87
96
impl < ' tcx > ArgAbiExt < ' tcx > for ArgAbi < ' tcx , Ty < ' tcx > > {
88
97
fn get_abi_param ( & self , tcx : TyCtxt < ' tcx > ) -> SmallVec < [ AbiParam ; 2 ] > {
89
98
match self . mode {
90
99
PassMode :: Ignore => smallvec ! [ ] ,
91
- PassMode :: Direct ( _ ) => match & self . layout . abi {
100
+ PassMode :: Direct ( attrs ) => match & self . layout . abi {
92
101
Abi :: Scalar ( scalar) => {
93
- smallvec ! [ AbiParam :: new( scalar_to_clif_type( tcx, scalar. clone( ) ) ) ]
102
+ smallvec ! [ apply_arg_attrs_to_abi_param(
103
+ AbiParam :: new( scalar_to_clif_type( tcx, scalar. clone( ) ) ) ,
104
+ attrs
105
+ ) ]
94
106
}
95
107
Abi :: Vector { .. } => {
96
108
let vector_ty = crate :: intrinsics:: clif_vector_type ( tcx, self . layout ) . unwrap ( ) ;
97
109
smallvec ! [ AbiParam :: new( vector_ty) ]
98
110
}
99
111
_ => unreachable ! ( "{:?}" , self . layout. abi) ,
100
112
} ,
101
- PassMode :: Pair ( _ , _ ) => match & self . layout . abi {
113
+ PassMode :: Pair ( attrs_a , attrs_b ) => match & self . layout . abi {
102
114
Abi :: ScalarPair ( a, b) => {
103
115
let a = scalar_to_clif_type ( tcx, a. clone ( ) ) ;
104
116
let b = scalar_to_clif_type ( tcx, b. clone ( ) ) ;
105
- smallvec ! [ AbiParam :: new( a) , AbiParam :: new( b) ]
117
+ smallvec ! [
118
+ apply_arg_attrs_to_abi_param( AbiParam :: new( a) , attrs_a) ,
119
+ apply_arg_attrs_to_abi_param( AbiParam :: new( b) , attrs_b) ,
120
+ ]
106
121
}
107
122
_ => unreachable ! ( "{:?}" , self . layout. abi) ,
108
123
} ,
109
124
PassMode :: Cast ( cast) => cast_target_to_abi_params ( cast) ,
110
125
PassMode :: Indirect {
111
- attrs : _ ,
126
+ attrs,
112
127
extra_attrs : None ,
113
128
on_stack,
114
129
} => {
115
130
if on_stack {
116
131
let size = u32:: try_from ( self . layout . size . bytes ( ) ) . unwrap ( ) ;
117
- smallvec ! [ AbiParam :: special (
118
- pointer_ty( tcx) ,
119
- ArgumentPurpose :: StructArgument ( size ) ,
132
+ smallvec ! [ apply_arg_attrs_to_abi_param (
133
+ AbiParam :: special ( pointer_ty( tcx) , ArgumentPurpose :: StructArgument ( size ) , ) ,
134
+ attrs
120
135
) ]
121
136
} else {
122
- smallvec ! [ AbiParam :: new( pointer_ty( tcx) ) ]
137
+ smallvec ! [ apply_arg_attrs_to_abi_param(
138
+ AbiParam :: new( pointer_ty( tcx) ) ,
139
+ attrs
140
+ ) ]
123
141
}
124
142
}
125
143
PassMode :: Indirect {
126
- attrs : _ ,
127
- extra_attrs : Some ( _ ) ,
144
+ attrs,
145
+ extra_attrs : Some ( extra_attrs ) ,
128
146
on_stack,
129
147
} => {
130
148
assert ! ( !on_stack) ;
131
149
smallvec ! [
132
- AbiParam :: new( pointer_ty( tcx) ) ,
133
- AbiParam :: new( pointer_ty( tcx) ) ,
150
+ apply_arg_attrs_to_abi_param ( AbiParam :: new( pointer_ty( tcx) ) , attrs ) ,
151
+ apply_arg_attrs_to_abi_param ( AbiParam :: new( pointer_ty( tcx) ) , extra_attrs ) ,
134
152
]
135
153
}
136
154
}
0 commit comments