@@ -3,7 +3,7 @@ use rustc_codegen_ssa::traits::{AbiBuilderMethods, BaseTypeMethods};
33use rustc_data_structures:: fx:: FxHashSet ;
44use rustc_middle:: bug;
55use 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 } ;
77
88use crate :: builder:: Builder ;
99use crate :: context:: CodegenCx ;
@@ -120,30 +120,49 @@ impl<'gcc, 'tcx> FnAbiGccExt<'gcc, 'tcx> for FnAbi<'tcx, Ty<'tcx>> {
120120 }
121121 } ;
122122
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+ && ty. get_pointee ( ) . is_some ( )
127+ {
128+ ty. make_restrict ( )
129+ } else {
130+ ty
131+ }
132+ } ;
133+ #[ cfg( not( feature = "master" ) ) ]
134+ let apply_attrs = |ty : Type < ' gcc > , _attrs : & ArgAttributes | {
135+ ty
136+ } ;
137+
123138 for arg in self . args . iter ( ) {
124139 let arg_ty = match arg. mode {
125140 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 ) ) ;
141+ PassMode :: Pair ( a, b) => {
142+ argument_tys. push ( apply_attrs ( arg. layout . scalar_pair_element_gcc_type ( cx, 0 , true ) , & a) ) ;
143+ argument_tys. push ( apply_attrs ( arg. layout . scalar_pair_element_gcc_type ( cx, 1 , true ) , & b) ) ;
130144 continue ;
131145 }
132- PassMode :: Indirect { extra_attrs : Some ( _) , .. } => {
133- unimplemented ! ( ) ;
134- }
135146 PassMode :: Cast ( ref cast, pad_i32) => {
136147 // add padding
137148 if pad_i32 {
138149 argument_tys. push ( Reg :: i32 ( ) . gcc_type ( cx) ) ;
139150 }
140- cast. gcc_type ( cx)
151+ let ty = cast. gcc_type ( cx) ;
152+ apply_attrs ( ty, & cast. attrs )
141153 }
142- PassMode :: Indirect { extra_attrs : None , on_stack : true , .. } => {
154+ PassMode :: Indirect { attrs , extra_attrs : None , on_stack : true } => {
143155 on_stack_param_indices. insert ( argument_tys. len ( ) ) ;
144- arg. memory_ty ( cx)
156+ apply_attrs ( arg. memory_ty ( cx) , & attrs )
145157 } ,
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+ }
147166 } ;
148167 argument_tys. push ( arg_ty) ;
149168 }
0 commit comments