@@ -94,7 +94,6 @@ fn align_of_uncached<'tcx>(
9494 assert ! ( size. bits( ) <= 128 ) ;
9595 Scalar :: Initialized { value, valid_range : WrappingRange :: full ( size) }
9696 } ;
97- let scalar = |value : Primitive | scalar_unit ( value) . align ( cx) ;
9897
9998 let univariant = |fields : & [ TyAndLayout < ' _ > ] , repr : & ReprOptions , kind| {
10099 Ok ( tcx. intern_layout ( univariant_uninterned ( cx, ty, fields, repr, kind) ?) )
@@ -110,64 +109,53 @@ fn align_of_uncached<'tcx>(
110109 ty:: Float ( fty) => match fty {
111110 ty:: FloatTy :: F32 => F32 ,
112111 ty:: FloatTy :: F64 => F64 ,
113- } . align ( cx) ,
114- ty:: FnPtr ( _) => {
115- let mut ptr = scalar_unit ( Pointer ( dl. instruction_address_space ) ) ;
116- ptr. valid_range_mut ( ) . start = 1 ;
117- tcx. intern_layout ( LayoutS :: scalar ( cx, ptr) ) . align ( )
118112 }
113+ . align ( cx) ,
114+ ty:: FnPtr ( _) => Pointer ( dl. instruction_address_space ) . align ( cx) ,
119115
120116 // The never type.
121117 ty:: Never => tcx. intern_layout ( cx. layout_of_never_type ( ) ) . align ( ) ,
122118
123119 // Potentially-wide pointers.
124120 ty:: Ref ( _, pointee, _) | ty:: RawPtr ( ty:: TypeAndMut { ty : pointee, .. } ) => {
125- let mut data_ptr = scalar_unit ( Pointer ( AddressSpace :: DATA ) ) ;
126- if !ty. is_unsafe_ptr ( ) {
127- data_ptr. valid_range_mut ( ) . start = 1 ;
128- }
121+ let data_ptr_align = Pointer ( AddressSpace :: DATA ) . align ( cx) ;
129122
130123 let pointee = tcx. normalize_erasing_regions ( param_env, pointee) ;
131124 if pointee. is_sized ( tcx, param_env) {
132- return Ok ( tcx . intern_layout ( LayoutS :: scalar ( cx , data_ptr ) ) . align ( ) ) ;
125+ return Ok ( data_ptr_align ) ;
133126 }
134127
135128 let unsized_part = tcx. struct_tail_erasing_lifetimes ( pointee, param_env) ;
136129
137- let metadata = if let Some ( metadata_def_id) = tcx. lang_items ( ) . metadata_type ( ) {
130+ let metadata_align = if let Some ( metadata_def_id) = tcx. lang_items ( ) . metadata_type ( ) {
138131 let metadata_ty = tcx. normalize_erasing_regions (
139132 param_env,
140133 tcx. mk_projection ( metadata_def_id, [ pointee] ) ,
141134 ) ;
142135 let metadata_layout = cx. layout_of ( metadata_ty) ?;
143136 // If the metadata is a 1-zst, then the pointer is thin.
144137 if metadata_layout. is_zst ( ) && metadata_layout. align . abi . bytes ( ) == 1 {
145- return Ok ( tcx . intern_layout ( LayoutS :: scalar ( cx , data_ptr ) ) . align ( ) ) ;
138+ return Ok ( data_ptr_align ) ;
146139 }
147140
148141 let Abi :: Scalar ( metadata) = metadata_layout. abi else {
149142 return Err ( LayoutError :: Unknown ( unsized_part) ) ;
150143 } ;
151- metadata
144+ metadata. align ( dl )
152145 } else {
153146 match unsized_part. kind ( ) {
154147 ty:: Foreign ( ..) => {
155- return Ok ( tcx. intern_layout ( LayoutS :: scalar ( cx, data_ptr) ) . align ( ) ) ;
156- }
157- ty:: Slice ( _) | ty:: Str => scalar_unit ( Int ( dl. ptr_sized_integer ( ) , false ) ) ,
158- ty:: Dynamic ( ..) => {
159- let mut vtable = scalar_unit ( Pointer ( AddressSpace :: DATA ) ) ;
160- vtable. valid_range_mut ( ) . start = 1 ;
161- vtable
148+ return Ok ( data_ptr_align) ;
162149 }
150+ ty:: Slice ( _) | ty:: Str => dl. ptr_sized_integer ( ) . align ( cx) ,
151+ ty:: Dynamic ( ..) => data_ptr_align,
163152 _ => {
164153 return Err ( LayoutError :: Unknown ( unsized_part) ) ;
165154 }
166155 }
167156 } ;
168-
169157 // Effectively a (ptr, meta) tuple.
170- tcx . intern_layout ( cx . scalar_pair ( data_ptr , metadata ) ) . align ( )
158+ data_ptr_align . max ( metadata_align ) . max ( dl . aggregate_align )
171159 }
172160
173161 ty:: Dynamic ( _, _, ty:: DynStar ) => {
0 commit comments