@@ -3,7 +3,7 @@ use rustc_codegen_ssa::traits::{AbiBuilderMethods, BaseTypeMethods};
3
3
use rustc_data_structures:: fx:: FxHashSet ;
4
4
use rustc_middle:: bug;
5
5
use rustc_middle:: ty:: Ty ;
6
- use rustc_target:: abi:: call:: { CastTarget , FnAbi , PassMode , Reg , RegKind } ;
6
+ use rustc_target:: abi:: call:: { ArgAttributes , CastTarget , FnAbi , PassMode , Reg , RegKind } ;
7
7
8
8
use crate :: builder:: Builder ;
9
9
use crate :: context:: CodegenCx ;
@@ -120,30 +120,49 @@ impl<'gcc, 'tcx> FnAbiGccExt<'gcc, 'tcx> for FnAbi<'tcx, Ty<'tcx>> {
120
120
}
121
121
} ;
122
122
123
+ #[ cfg( feature = "master" ) ]
124
+ let apply_attrs = |ty : Type < ' gcc > , attrs : & ArgAttributes | {
125
+ if attrs. regular . contains ( rustc_target:: abi:: call:: ArgAttribute :: NoAlias )
126
+ {
127
+ ty. make_restrict ( )
128
+ } else {
129
+ ty
130
+ }
131
+ } ;
132
+ #[ cfg( not( feature = "master" ) ) ]
133
+ let apply_attrs = |ty : Type < ' gcc > , _attrs : & ArgAttributes | {
134
+ ty
135
+ } ;
136
+
123
137
for arg in self . args . iter ( ) {
124
138
let arg_ty = match arg. mode {
125
139
PassMode :: Ignore => continue ,
126
- PassMode :: Direct ( _) => arg. layout . immediate_gcc_type ( cx) ,
127
- PassMode :: Pair ( ..) => {
128
- argument_tys. push ( arg. layout . scalar_pair_element_gcc_type ( cx, 0 , true ) ) ;
129
- argument_tys. push ( arg. layout . scalar_pair_element_gcc_type ( cx, 1 , true ) ) ;
140
+ PassMode :: Pair ( a, b) => {
141
+ argument_tys. push ( apply_attrs ( arg. layout . scalar_pair_element_gcc_type ( cx, 0 , true ) , & a) ) ;
142
+ argument_tys. push ( apply_attrs ( arg. layout . scalar_pair_element_gcc_type ( cx, 1 , true ) , & b) ) ;
130
143
continue ;
131
144
}
132
- PassMode :: Indirect { extra_attrs : Some ( _) , .. } => {
133
- unimplemented ! ( ) ;
134
- }
135
145
PassMode :: Cast ( ref cast, pad_i32) => {
136
146
// add padding
137
147
if pad_i32 {
138
148
argument_tys. push ( Reg :: i32 ( ) . gcc_type ( cx) ) ;
139
149
}
140
- cast. gcc_type ( cx)
150
+ let ty = cast. gcc_type ( cx) ;
151
+ apply_attrs ( ty, & cast. attrs )
141
152
}
142
- PassMode :: Indirect { extra_attrs : None , on_stack : true , .. } => {
153
+ PassMode :: Indirect { attrs : _, extra_attrs : None , on_stack : true } => {
154
+ // This is a "byval" argument, so we don't apply the `restrict` attribute on it.
143
155
on_stack_param_indices. insert ( argument_tys. len ( ) ) ;
144
156
arg. memory_ty ( cx)
145
157
} ,
146
- PassMode :: Indirect { extra_attrs : None , on_stack : false , .. } => cx. type_ptr_to ( arg. memory_ty ( cx) ) ,
158
+ PassMode :: Direct ( attrs) => apply_attrs ( arg. layout . immediate_gcc_type ( cx) , & attrs) ,
159
+ PassMode :: Indirect { attrs, extra_attrs : None , on_stack : false } => {
160
+ apply_attrs ( cx. type_ptr_to ( arg. memory_ty ( cx) ) , & attrs)
161
+ }
162
+ PassMode :: Indirect { attrs, extra_attrs : Some ( extra_attrs) , on_stack } => {
163
+ assert ! ( !on_stack) ;
164
+ apply_attrs ( apply_attrs ( cx. type_ptr_to ( arg. memory_ty ( cx) ) , & attrs) , & extra_attrs)
165
+ }
147
166
} ;
148
167
argument_tys. push ( arg_ty) ;
149
168
}
0 commit comments