1- use rustc_abi:: WrappingRange ;
1+ use rustc_abi:: { FieldIdx , WrappingRange } ;
22use rustc_middle:: mir:: SourceInfo ;
33use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
44use rustc_middle:: { bug, span_bug} ;
@@ -7,7 +7,7 @@ use rustc_span::sym;
77use rustc_target:: spec:: Arch ;
88
99use super :: FunctionCx ;
10- use super :: operand:: OperandRef ;
10+ use super :: operand:: { OperandRef , OperandRefBuilder } ;
1111use super :: place:: PlaceRef ;
1212use crate :: common:: { AtomicRmwBinOp , SynchronizationScope } ;
1313use crate :: errors:: InvalidMonomorphization ;
@@ -149,17 +149,26 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
149149
150150 sym:: va_start => bx. va_start ( args[ 0 ] . immediate ( ) ) ,
151151 sym:: va_end => bx. va_end ( args[ 0 ] . immediate ( ) ) ,
152- sym:: size_of_val => {
152+ sym:: size_of_val | sym :: align_of_val | sym :: layout_of_val => {
153153 let tp_ty = fn_args. type_at ( 0 ) ;
154154 let ( _, meta) = args[ 0 ] . val . pointer_parts ( ) ;
155- let ( llsize, _) = size_of_val:: size_and_align_of_dst ( bx, tp_ty, meta) ;
156- llsize
157- }
158- sym:: align_of_val => {
159- let tp_ty = fn_args. type_at ( 0 ) ;
160- let ( _, meta) = args[ 0 ] . val . pointer_parts ( ) ;
161- let ( _, llalign) = size_of_val:: size_and_align_of_dst ( bx, tp_ty, meta) ;
162- llalign
155+ let ( llsize, llalign) = size_of_val:: size_and_align_of_dst ( bx, tp_ty, meta) ;
156+ match name {
157+ sym:: size_of_val => llsize,
158+ sym:: align_of_val => llalign,
159+ sym:: layout_of_val => {
160+ // Use the builder so we're insulated from the in-memory field order
161+ let mut builder = OperandRefBuilder :: < ' _ , Bx :: Value > :: new ( result. layout ) ;
162+ builder. insert_imm ( FieldIdx :: from_u32 ( 0 ) , llsize) ;
163+ builder. insert_imm ( FieldIdx :: from_u32 ( 1 ) , llalign) ;
164+ let val = builder. build ( bx. cx ( ) ) . val ;
165+ // the match can only return a single `Bx::Value`,
166+ // so we need to do the store and return.
167+ val. store ( bx, result) ;
168+ return Ok ( ( ) ) ;
169+ }
170+ _ => bug ! ( ) ,
171+ }
163172 }
164173 sym:: vtable_size | sym:: vtable_align => {
165174 let vtable = args[ 0 ] . immediate ( ) ;
@@ -179,9 +188,10 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
179188 let size_bound = bx. data_layout ( ) . ptr_sized_integer ( ) . signed_max ( ) as u128 ;
180189 bx. range_metadata ( value, WrappingRange { start : 0 , end : size_bound } ) ;
181190 }
182- // Alignment is always nonzero .
191+ // Alignment is always a power of two, thus 1..=0x800…000 .
183192 sym:: vtable_align => {
184- bx. range_metadata ( value, WrappingRange { start : 1 , end : !0 } )
193+ let align_bound = bx. data_layout ( ) . ptr_sized_integer ( ) . signed_min ( ) as u128 ;
194+ bx. range_metadata ( value, WrappingRange { start : 1 , end : align_bound } )
185195 }
186196 _ => { }
187197 }
0 commit comments