@@ -94,7 +94,6 @@ fn align_of_uncached<'tcx>(
94
94
assert ! ( size. bits( ) <= 128 ) ;
95
95
Scalar :: Initialized { value, valid_range : WrappingRange :: full ( size) }
96
96
} ;
97
- let scalar = |value : Primitive | scalar_unit ( value) . align ( cx) ;
98
97
99
98
let univariant = |fields : & [ TyAndLayout < ' _ > ] , repr : & ReprOptions , kind| {
100
99
Ok ( tcx. intern_layout ( univariant_uninterned ( cx, ty, fields, repr, kind) ?) )
@@ -110,64 +109,53 @@ fn align_of_uncached<'tcx>(
110
109
ty:: Float ( fty) => match fty {
111
110
ty:: FloatTy :: F32 => F32 ,
112
111
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 ( )
118
112
}
113
+ . align ( cx) ,
114
+ ty:: FnPtr ( _) => Pointer ( dl. instruction_address_space ) . align ( cx) ,
119
115
120
116
// The never type.
121
117
ty:: Never => tcx. intern_layout ( cx. layout_of_never_type ( ) ) . align ( ) ,
122
118
123
119
// Potentially-wide pointers.
124
120
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) ;
129
122
130
123
let pointee = tcx. normalize_erasing_regions ( param_env, pointee) ;
131
124
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 ) ;
133
126
}
134
127
135
128
let unsized_part = tcx. struct_tail_erasing_lifetimes ( pointee, param_env) ;
136
129
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 ( ) {
138
131
let metadata_ty = tcx. normalize_erasing_regions (
139
132
param_env,
140
133
tcx. mk_projection ( metadata_def_id, [ pointee] ) ,
141
134
) ;
142
135
let metadata_layout = cx. layout_of ( metadata_ty) ?;
143
136
// If the metadata is a 1-zst, then the pointer is thin.
144
137
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 ) ;
146
139
}
147
140
148
141
let Abi :: Scalar ( metadata) = metadata_layout. abi else {
149
142
return Err ( LayoutError :: Unknown ( unsized_part) ) ;
150
143
} ;
151
- metadata
144
+ metadata. align ( dl )
152
145
} else {
153
146
match unsized_part. kind ( ) {
154
147
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) ;
162
149
}
150
+ ty:: Slice ( _) | ty:: Str => dl. ptr_sized_integer ( ) . align ( cx) ,
151
+ ty:: Dynamic ( ..) => data_ptr_align,
163
152
_ => {
164
153
return Err ( LayoutError :: Unknown ( unsized_part) ) ;
165
154
}
166
155
}
167
156
} ;
168
-
169
157
// 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 )
171
159
}
172
160
173
161
ty:: Dynamic ( _, _, ty:: DynStar ) => {
0 commit comments