99// except according to those terms.
1010
1111use llvm:: { self , AttributePlace } ;
12- use base;
13- use builder:: { Builder , MemFlags } ;
14- use common:: C_usize ;
12+ use rustc_codegen_ssa:: MemFlags ;
13+ use builder:: Builder ;
1514use context:: CodegenCx ;
16- use mir:: place:: PlaceRef ;
17- use mir:: operand:: OperandValue ;
15+ use rustc_codegen_ssa :: mir:: place:: PlaceRef ;
16+ use rustc_codegen_ssa :: mir:: operand:: OperandValue ;
1817use type_:: Type ;
1918use type_of:: { LayoutLlvmExt , PointerKind } ;
2019use value:: Value ;
20+ use rustc_target:: abi:: call:: ArgType ;
21+
22+ use rustc_codegen_ssa:: traits:: * ;
2123
2224use rustc_target:: abi:: { HasDataLayout , LayoutOf , Size , TyLayout , Abi as LayoutAbi } ;
23- use rustc:: ty:: { self , Ty } ;
25+ use rustc:: ty:: { self , Ty , Instance } ;
2426use rustc:: ty:: layout;
2527
2628use libc:: c_uint;
@@ -110,16 +112,16 @@ pub trait LlvmType {
110112impl LlvmType for Reg {
111113 fn llvm_type ( & self , cx : & CodegenCx < ' ll , ' _ > ) -> & ' ll Type {
112114 match self . kind {
113- RegKind :: Integer => Type :: ix ( cx , self . size . bits ( ) ) ,
115+ RegKind :: Integer => cx . type_ix ( self . size . bits ( ) ) ,
114116 RegKind :: Float => {
115117 match self . size . bits ( ) {
116- 32 => Type :: f32 ( cx ) ,
117- 64 => Type :: f64 ( cx ) ,
118+ 32 => cx . type_f32 ( ) ,
119+ 64 => cx . type_f64 ( ) ,
118120 _ => bug ! ( "unsupported float: {:?}" , self )
119121 }
120122 }
121123 RegKind :: Vector => {
122- Type :: vector ( Type :: i8 ( cx ) , self . size . bytes ( ) )
124+ cx . type_vector ( cx . type_i8 ( ) , self . size . bytes ( ) )
123125 }
124126 }
125127 }
@@ -143,7 +145,7 @@ impl LlvmType for CastTarget {
143145
144146 // Simplify to array when all chunks are the same size and type
145147 if rem_bytes == 0 {
146- return Type :: array ( rest_ll_unit, rest_count) ;
148+ return cx . type_array ( rest_ll_unit, rest_count) ;
147149 }
148150 }
149151
@@ -158,17 +160,27 @@ impl LlvmType for CastTarget {
158160 if rem_bytes != 0 {
159161 // Only integers can be really split further.
160162 assert_eq ! ( self . rest. unit. kind, RegKind :: Integer ) ;
161- args. push ( Type :: ix ( cx , rem_bytes * 8 ) ) ;
163+ args. push ( cx . type_ix ( rem_bytes * 8 ) ) ;
162164 }
163165
164- Type :: struct_ ( cx , & args, false )
166+ cx . type_struct ( & args, false )
165167 }
166168}
167169
168170pub trait ArgTypeExt < ' ll , ' tcx > {
169171 fn memory_ty ( & self , cx : & CodegenCx < ' ll , ' tcx > ) -> & ' ll Type ;
170- fn store ( & self , bx : & Builder < ' _ , ' ll , ' tcx > , val : & ' ll Value , dst : PlaceRef < ' ll , ' tcx > ) ;
171- fn store_fn_arg ( & self , bx : & Builder < ' _ , ' ll , ' tcx > , idx : & mut usize , dst : PlaceRef < ' ll , ' tcx > ) ;
172+ fn store (
173+ & self ,
174+ bx : & mut Builder < ' _ , ' ll , ' tcx > ,
175+ val : & ' ll Value ,
176+ dst : PlaceRef < ' tcx , & ' ll Value > ,
177+ ) ;
178+ fn store_fn_arg (
179+ & self ,
180+ bx : & mut Builder < ' _ , ' ll , ' tcx > ,
181+ idx : & mut usize ,
182+ dst : PlaceRef < ' tcx , & ' ll Value > ,
183+ ) ;
172184}
173185
174186impl ArgTypeExt < ' ll , ' tcx > for ArgType < ' tcx , Ty < ' tcx > > {
@@ -182,11 +194,15 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
182194 /// place for the original Rust type of this argument/return.
183195 /// Can be used for both storing formal arguments into Rust variables
184196 /// or results of call/invoke instructions into their destinations.
185- fn store ( & self , bx : & Builder < ' _ , ' ll , ' tcx > , val : & ' ll Value , dst : PlaceRef < ' ll , ' tcx > ) {
197+ fn store (
198+ & self ,
199+ bx : & mut Builder < ' _ , ' ll , ' tcx > ,
200+ val : & ' ll Value ,
201+ dst : PlaceRef < ' tcx , & ' ll Value > ,
202+ ) {
186203 if self . is_ignore ( ) {
187204 return ;
188205 }
189- let cx = bx. cx ;
190206 if self . is_sized_indirect ( ) {
191207 OperandValue :: Ref ( val, None , self . layout . align ) . store ( bx, dst)
192208 } else if self . is_unsized_indirect ( ) {
@@ -196,7 +212,8 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
196212 // uses it for i16 -> {i8, i8}, but not for i24 -> {i8, i8, i8}.
197213 let can_store_through_cast_ptr = false ;
198214 if can_store_through_cast_ptr {
199- let cast_dst = bx. pointercast ( dst. llval , cast. llvm_type ( cx) . ptr_to ( ) ) ;
215+ let cast_ptr_llty = bx. cx ( ) . type_ptr_to ( cast. llvm_type ( bx. cx ( ) ) ) ;
216+ let cast_dst = bx. pointercast ( dst. llval , cast_ptr_llty) ;
200217 bx. store ( val, cast_dst, self . layout . align ) ;
201218 } else {
202219 // The actual return type is a struct, but the ABI
@@ -214,22 +231,23 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
214231 // bitcasting to the struct type yields invalid cast errors.
215232
216233 // We instead thus allocate some scratch space...
217- let scratch_size = cast. size ( cx ) ;
218- let scratch_align = cast. align ( cx ) ;
219- let llscratch = bx. alloca ( cast. llvm_type ( cx ) , "abi_cast" , scratch_align) ;
234+ let scratch_size = cast. size ( bx . cx ( ) ) ;
235+ let scratch_align = cast. align ( bx . cx ( ) ) ;
236+ let llscratch = bx. alloca ( cast. llvm_type ( bx . cx ( ) ) , "abi_cast" , scratch_align) ;
220237 bx. lifetime_start ( llscratch, scratch_size) ;
221238
222239 // ...where we first store the value...
223240 bx. store ( val, llscratch, scratch_align) ;
224241
225242 // ...and then memcpy it to the intended destination.
226- base:: call_memcpy ( bx,
227- bx. pointercast ( dst. llval , Type :: i8p ( cx) ) ,
228- self . layout . align ,
229- bx. pointercast ( llscratch, Type :: i8p ( cx) ) ,
230- scratch_align,
231- C_usize ( cx, self . layout . size . bytes ( ) ) ,
232- MemFlags :: empty ( ) ) ;
243+ bx. memcpy (
244+ dst. llval ,
245+ self . layout . align ,
246+ llscratch,
247+ scratch_align,
248+ bx. cx ( ) . const_usize ( self . layout . size . bytes ( ) ) ,
249+ MemFlags :: empty ( )
250+ ) ;
233251
234252 bx. lifetime_end ( llscratch, scratch_size) ;
235253 }
@@ -238,7 +256,12 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
238256 }
239257 }
240258
241- fn store_fn_arg ( & self , bx : & Builder < ' a , ' ll , ' tcx > , idx : & mut usize , dst : PlaceRef < ' ll , ' tcx > ) {
259+ fn store_fn_arg (
260+ & self ,
261+ bx : & mut Builder < ' a , ' ll , ' tcx > ,
262+ idx : & mut usize ,
263+ dst : PlaceRef < ' tcx , & ' ll Value > ,
264+ ) {
242265 let mut next = || {
243266 let val = llvm:: get_param ( bx. llfn ( ) , * idx as c_uint ) ;
244267 * idx += 1 ;
@@ -259,6 +282,27 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
259282 }
260283}
261284
285+ impl ArgTypeMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
286+ fn store_fn_arg (
287+ & mut self ,
288+ ty : & ArgType < ' tcx , Ty < ' tcx > > ,
289+ idx : & mut usize , dst : PlaceRef < ' tcx , Self :: Value >
290+ ) {
291+ ty. store_fn_arg ( self , idx, dst)
292+ }
293+ fn store_arg_ty (
294+ & mut self ,
295+ ty : & ArgType < ' tcx , Ty < ' tcx > > ,
296+ val : & ' ll Value ,
297+ dst : PlaceRef < ' tcx , & ' ll Value >
298+ ) {
299+ ty. store ( self , val, dst)
300+ }
301+ fn memory_ty ( & self , ty : & ArgType < ' tcx , Ty < ' tcx > > ) -> & ' ll Type {
302+ ty. memory_ty ( self . cx ( ) )
303+ }
304+ }
305+
262306pub trait FnTypeExt < ' tcx > {
263307 fn of_instance ( cx : & CodegenCx < ' ll , ' tcx > , instance : & ty:: Instance < ' tcx > ) -> Self ;
264308 fn new ( cx : & CodegenCx < ' ll , ' tcx > ,
@@ -280,7 +324,7 @@ pub trait FnTypeExt<'tcx> {
280324 fn ptr_to_llvm_type ( & self , cx : & CodegenCx < ' ll , ' tcx > ) -> & ' ll Type ;
281325 fn llvm_cconv ( & self ) -> llvm:: CallConv ;
282326 fn apply_attrs_llfn ( & self , llfn : & ' ll Value ) ;
283- fn apply_attrs_callsite ( & self , bx : & Builder < ' a , ' ll , ' tcx > , callsite : & ' ll Value ) ;
327+ fn apply_attrs_callsite ( & self , bx : & mut Builder < ' a , ' ll , ' tcx > , callsite : & ' ll Value ) ;
284328}
285329
286330impl < ' tcx > FnTypeExt < ' tcx > for FnType < ' tcx , Ty < ' tcx > > {
@@ -614,14 +658,14 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
614658 ) ;
615659
616660 let llreturn_ty = match self . ret . mode {
617- PassMode :: Ignore => Type :: void ( cx ) ,
661+ PassMode :: Ignore => cx . type_void ( ) ,
618662 PassMode :: Direct ( _) | PassMode :: Pair ( ..) => {
619663 self . ret . layout . immediate_llvm_type ( cx)
620664 }
621665 PassMode :: Cast ( cast) => cast. llvm_type ( cx) ,
622666 PassMode :: Indirect ( ..) => {
623- llargument_tys. push ( self . ret . memory_ty ( cx) . ptr_to ( ) ) ;
624- Type :: void ( cx )
667+ llargument_tys. push ( cx . type_ptr_to ( self . ret . memory_ty ( cx) ) ) ;
668+ cx . type_void ( )
625669 }
626670 } ;
627671
@@ -647,15 +691,15 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
647691 continue ;
648692 }
649693 PassMode :: Cast ( cast) => cast. llvm_type ( cx) ,
650- PassMode :: Indirect ( _, None ) => arg. memory_ty ( cx) . ptr_to ( ) ,
694+ PassMode :: Indirect ( _, None ) => cx . type_ptr_to ( arg. memory_ty ( cx) ) ,
651695 } ;
652696 llargument_tys. push ( llarg_ty) ;
653697 }
654698
655699 if self . variadic {
656- Type :: variadic_func ( & llargument_tys, llreturn_ty)
700+ cx . type_variadic_func ( & llargument_tys, llreturn_ty)
657701 } else {
658- Type :: func ( & llargument_tys, llreturn_ty)
702+ cx . type_func ( & llargument_tys, llreturn_ty)
659703 }
660704 }
661705
@@ -717,7 +761,7 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
717761 }
718762 }
719763
720- fn apply_attrs_callsite ( & self , bx : & Builder < ' a , ' ll , ' tcx > , callsite : & ' ll Value ) {
764+ fn apply_attrs_callsite ( & self , bx : & mut Builder < ' a , ' ll , ' tcx > , callsite : & ' ll Value ) {
721765 let mut i = 0 ;
722766 let mut apply = |attrs : & ArgAttributes | {
723767 attrs. apply_callsite ( llvm:: AttributePlace :: Argument ( i) , callsite) ;
@@ -736,7 +780,7 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
736780 // by the LLVM verifier.
737781 if let layout:: Int ( ..) = scalar. value {
738782 if !scalar. is_bool ( ) {
739- let range = scalar. valid_range_exclusive ( bx. cx ) ;
783+ let range = scalar. valid_range_exclusive ( bx. cx ( ) ) ;
740784 if range. start != range. end {
741785 bx. range_metadata ( callsite, range) ;
742786 }
@@ -769,3 +813,29 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
769813 }
770814 }
771815}
816+
817+ impl AbiMethods < ' tcx > for CodegenCx < ' ll , ' tcx > {
818+ fn new_fn_type ( & self , sig : ty:: FnSig < ' tcx > , extra_args : & [ Ty < ' tcx > ] ) -> FnType < ' tcx , Ty < ' tcx > > {
819+ FnType :: new ( & self , sig, extra_args)
820+ }
821+ fn new_vtable (
822+ & self ,
823+ sig : ty:: FnSig < ' tcx > ,
824+ extra_args : & [ Ty < ' tcx > ]
825+ ) -> FnType < ' tcx , Ty < ' tcx > > {
826+ FnType :: new_vtable ( & self , sig, extra_args)
827+ }
828+ fn fn_type_of_instance ( & self , instance : & Instance < ' tcx > ) -> FnType < ' tcx , Ty < ' tcx > > {
829+ FnType :: of_instance ( & self , instance)
830+ }
831+ }
832+
833+ impl AbiBuilderMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
834+ fn apply_attrs_callsite (
835+ & mut self ,
836+ ty : & FnType < ' tcx , Ty < ' tcx > > ,
837+ callsite : Self :: Value
838+ ) {
839+ ty. apply_attrs_callsite ( self , callsite)
840+ }
841+ }
0 commit comments