Skip to content

Commit d87d0cf

Browse files
committed
Remove per-variant alignment in VariantLayout
Reusing the alignment of the enclosing enum in `LayoutData::for_variant` doesn't appear to cause any issues.
1 parent bd7310c commit d87d0cf

18 files changed

Lines changed: 14 additions & 421 deletions

compiler/rustc_abi/src/layout.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,10 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
575575
}
576576

577577
let calculate_niche_filling_layout = || -> Option<LayoutData<FieldIdx, VariantIdx>> {
578+
struct VariantLayoutInfo {
579+
align_abi: Align,
580+
}
581+
578582
if repr.inhibit_enum_layout_opt() {
579583
return None;
580584
}
@@ -588,11 +592,14 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
588592
let mut unadjusted_abi_align = align;
589593
let mut combined_seed = repr.field_shuffle_seed;
590594

595+
let mut variants_info = IndexVec::<VariantIdx, _>::with_capacity(variants.len());
591596
let mut variant_layouts = variants
592597
.iter()
593598
.map(|v| {
594599
let st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?;
595600

601+
variants_info.push(VariantLayoutInfo { align_abi: st.align.abi });
602+
596603
align = align.max(st.align.abi);
597604
max_repr_align = max_repr_align.max(st.max_repr_align);
598605
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
@@ -636,7 +643,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
636643
}
637644

638645
// Determine if it'll fit after the niche.
639-
let this_align = layout.align.abi;
646+
let this_align = variants_info[i].align_abi;
640647
let this_offset = (niche_offset + niche_size).align_to(this_align);
641648

642649
if this_offset + layout.size > size {
@@ -667,7 +674,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
667674
.iter_enumerated()
668675
.all(|(i, layout)| i == largest_variant_index || layout.size == Size::ZERO);
669676
let same_size = size == variant_layouts[largest_variant_index].size;
670-
let same_align = align == variant_layouts[largest_variant_index].align.abi;
677+
let same_align = align == variants_info[largest_variant_index].align_abi;
671678

672679
let uninhabited = variant_layouts.iter().all(|v| v.is_uninhabited());
673680
let abi = if same_size && same_align && others_zst {
@@ -1017,10 +1024,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
10171024
if matches!(variant.backend_repr, BackendRepr::Memory { .. } if variant.has_fields())
10181025
{
10191026
variant.backend_repr = abi;
1020-
// Also need to bump up the size and alignment, so that the entire value fits
1021-
// in here.
1027+
// Also need to bump up the size, so that the entire value fits in here.
10221028
variant.size = cmp::max(variant.size, size);
1023-
variant.align.abi = cmp::max(variant.align.abi, align);
10241029
}
10251030
}
10261031
}

compiler/rustc_abi/src/layout/simple.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
163163
backend_repr: layout.backend_repr,
164164
largest_niche: layout.largest_niche,
165165
uninhabited: layout.uninhabited,
166-
align: layout.align,
167166
size: layout.size,
168-
max_repr_align: layout.max_repr_align,
169-
unadjusted_abi_align: layout.unadjusted_abi_align,
167+
align: parent.align,
168+
max_repr_align: parent.max_repr_align,
169+
unadjusted_abi_align: parent.unadjusted_abi_align,
170170
randomization_seed: Hash64::ZERO,
171171
}
172172
}

compiler/rustc_abi/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,14 +2236,11 @@ pub enum AbiFromStrErr {
22362236
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
22372237
pub struct VariantLayout<FieldIdx: Idx> {
22382238
pub size: Size,
2239-
pub align: AbiAlign,
22402239
pub backend_repr: BackendRepr,
22412240
pub field_offsets: IndexVec<FieldIdx, Size>,
22422241
fields_in_memory_order: IndexVec<u32, FieldIdx>,
22432242
largest_niche: Option<Niche>,
22442243
uninhabited: bool,
2245-
max_repr_align: Option<Align>,
2246-
unadjusted_abi_align: Align,
22472244
}
22482245

22492246
impl<FieldIdx: Idx> VariantLayout<FieldIdx> {
@@ -2254,14 +2251,11 @@ impl<FieldIdx: Idx> VariantLayout<FieldIdx> {
22542251

22552252
Self {
22562253
size: layout.size,
2257-
align: layout.align,
22582254
backend_repr: layout.backend_repr,
22592255
field_offsets: offsets,
22602256
fields_in_memory_order: in_memory_order,
22612257
largest_niche: layout.largest_niche,
22622258
uninhabited: layout.uninhabited,
2263-
max_repr_align: layout.max_repr_align,
2264-
unadjusted_abi_align: layout.unadjusted_abi_align,
22652259
}
22662260
}
22672261

compiler/rustc_ty_utils/src/layout/invariant.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,22 +293,14 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou
293293
}
294294
}
295295
for variant in variants.iter() {
296-
// Variants should have the same or a smaller size as the full thing,
297-
// and same for alignment.
296+
// Variants should have the same or a smaller size as the full thing.
298297
if variant.size > layout.size {
299298
bug!(
300299
"Type with size {} bytes has variant with size {} bytes: {layout:#?}",
301300
layout.size.bytes(),
302301
variant.size.bytes(),
303302
)
304303
}
305-
if variant.align.abi > layout.align.abi {
306-
bug!(
307-
"Type with alignment {} bytes has variant with alignment {} bytes: {layout:#?}",
308-
layout.align.bytes(),
309-
variant.align.bytes(),
310-
)
311-
}
312304
// Skip empty variants.
313305
if variant.size == Size::ZERO || !variant.has_fields() || variant.is_uninhabited() {
314306
// These are never actually accessed anyway, so we can skip the coherence check

tests/ui/enum-discriminant/wrapping_niche.stderr

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -44,48 +44,33 @@ error: layout_of(UnsignedAroundZero) = Layout {
4444
variants: [
4545
VariantLayout {
4646
size: Size(2 bytes),
47-
align: AbiAlign {
48-
abi: Align(2 bytes),
49-
},
5047
backend_repr: Memory {
5148
sized: true,
5249
},
5350
field_offsets: [],
5451
fields_in_memory_order: [],
5552
largest_niche: None,
5653
uninhabited: false,
57-
max_repr_align: None,
58-
unadjusted_abi_align: Align(2 bytes),
5954
},
6055
VariantLayout {
6156
size: Size(2 bytes),
62-
align: AbiAlign {
63-
abi: Align(2 bytes),
64-
},
6557
backend_repr: Memory {
6658
sized: true,
6759
},
6860
field_offsets: [],
6961
fields_in_memory_order: [],
7062
largest_niche: None,
7163
uninhabited: false,
72-
max_repr_align: None,
73-
unadjusted_abi_align: Align(2 bytes),
7464
},
7565
VariantLayout {
7666
size: Size(2 bytes),
77-
align: AbiAlign {
78-
abi: Align(2 bytes),
79-
},
8067
backend_repr: Memory {
8168
sized: true,
8269
},
8370
field_offsets: [],
8471
fields_in_memory_order: [],
8572
largest_niche: None,
8673
uninhabited: false,
87-
max_repr_align: None,
88-
unadjusted_abi_align: Align(2 bytes),
8974
},
9075
],
9176
},
@@ -144,48 +129,33 @@ error: layout_of(SignedAroundZero) = Layout {
144129
variants: [
145130
VariantLayout {
146131
size: Size(2 bytes),
147-
align: AbiAlign {
148-
abi: Align(2 bytes),
149-
},
150132
backend_repr: Memory {
151133
sized: true,
152134
},
153135
field_offsets: [],
154136
fields_in_memory_order: [],
155137
largest_niche: None,
156138
uninhabited: false,
157-
max_repr_align: None,
158-
unadjusted_abi_align: Align(2 bytes),
159139
},
160140
VariantLayout {
161141
size: Size(2 bytes),
162-
align: AbiAlign {
163-
abi: Align(2 bytes),
164-
},
165142
backend_repr: Memory {
166143
sized: true,
167144
},
168145
field_offsets: [],
169146
fields_in_memory_order: [],
170147
largest_niche: None,
171148
uninhabited: false,
172-
max_repr_align: None,
173-
unadjusted_abi_align: Align(2 bytes),
174149
},
175150
VariantLayout {
176151
size: Size(2 bytes),
177-
align: AbiAlign {
178-
abi: Align(2 bytes),
179-
},
180152
backend_repr: Memory {
181153
sized: true,
182154
},
183155
field_offsets: [],
184156
fields_in_memory_order: [],
185157
largest_niche: None,
186158
uninhabited: false,
187-
max_repr_align: None,
188-
unadjusted_abi_align: Align(2 bytes),
189159
},
190160
],
191161
},

tests/ui/layout/debug.stderr

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,16 @@ error: layout_of(E) = Layout {
4444
variants: [
4545
VariantLayout {
4646
size: Size(4 bytes),
47-
align: AbiAlign {
48-
abi: Align(1 bytes),
49-
},
5047
backend_repr: Memory {
5148
sized: true,
5249
},
5350
field_offsets: [],
5451
fields_in_memory_order: [],
5552
largest_niche: None,
5653
uninhabited: false,
57-
max_repr_align: None,
58-
unadjusted_abi_align: Align(1 bytes),
5954
},
6055
VariantLayout {
6156
size: Size(12 bytes),
62-
align: AbiAlign {
63-
abi: Align(4 bytes),
64-
},
6557
backend_repr: Memory {
6658
sized: true,
6759
},
@@ -77,8 +69,6 @@ error: layout_of(E) = Layout {
7769
],
7870
largest_niche: None,
7971
uninhabited: true,
80-
max_repr_align: None,
81-
unadjusted_abi_align: Align(4 bytes),
8272
},
8373
],
8474
},
@@ -216,9 +206,6 @@ error: layout_of(Result<i32, i32>) = Layout {
216206
variants: [
217207
VariantLayout {
218208
size: Size(8 bytes),
219-
align: AbiAlign {
220-
abi: Align(4 bytes),
221-
},
222209
backend_repr: ScalarPair(
223210
Initialized {
224211
value: Int(
@@ -243,14 +230,9 @@ error: layout_of(Result<i32, i32>) = Layout {
243230
],
244231
largest_niche: None,
245232
uninhabited: false,
246-
max_repr_align: None,
247-
unadjusted_abi_align: Align(4 bytes),
248233
},
249234
VariantLayout {
250235
size: Size(8 bytes),
251-
align: AbiAlign {
252-
abi: Align(4 bytes),
253-
},
254236
backend_repr: ScalarPair(
255237
Initialized {
256238
value: Int(
@@ -275,8 +257,6 @@ error: layout_of(Result<i32, i32>) = Layout {
275257
],
276258
largest_niche: None,
277259
uninhabited: false,
278-
max_repr_align: None,
279-
unadjusted_abi_align: Align(4 bytes),
280260
},
281261
],
282262
},

tests/ui/layout/hexagon-enum.stderr

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,13 @@ error: layout_of(A) = Layout {
4444
variants: [
4545
VariantLayout {
4646
size: Size(1 bytes),
47-
align: AbiAlign {
48-
abi: Align(1 bytes),
49-
},
5047
backend_repr: Memory {
5148
sized: true,
5249
},
5350
field_offsets: [],
5451
fields_in_memory_order: [],
5552
largest_niche: None,
5653
uninhabited: false,
57-
max_repr_align: None,
58-
unadjusted_abi_align: Align(1 bytes),
5954
},
6055
],
6156
},
@@ -114,18 +109,13 @@ error: layout_of(B) = Layout {
114109
variants: [
115110
VariantLayout {
116111
size: Size(1 bytes),
117-
align: AbiAlign {
118-
abi: Align(1 bytes),
119-
},
120112
backend_repr: Memory {
121113
sized: true,
122114
},
123115
field_offsets: [],
124116
fields_in_memory_order: [],
125117
largest_niche: None,
126118
uninhabited: false,
127-
max_repr_align: None,
128-
unadjusted_abi_align: Align(1 bytes),
129119
},
130120
],
131121
},
@@ -184,18 +174,13 @@ error: layout_of(C) = Layout {
184174
variants: [
185175
VariantLayout {
186176
size: Size(2 bytes),
187-
align: AbiAlign {
188-
abi: Align(2 bytes),
189-
},
190177
backend_repr: Memory {
191178
sized: true,
192179
},
193180
field_offsets: [],
194181
fields_in_memory_order: [],
195182
largest_niche: None,
196183
uninhabited: false,
197-
max_repr_align: None,
198-
unadjusted_abi_align: Align(2 bytes),
199184
},
200185
],
201186
},
@@ -254,18 +239,13 @@ error: layout_of(P) = Layout {
254239
variants: [
255240
VariantLayout {
256241
size: Size(4 bytes),
257-
align: AbiAlign {
258-
abi: Align(4 bytes),
259-
},
260242
backend_repr: Memory {
261243
sized: true,
262244
},
263245
field_offsets: [],
264246
fields_in_memory_order: [],
265247
largest_niche: None,
266248
uninhabited: false,
267-
max_repr_align: None,
268-
unadjusted_abi_align: Align(4 bytes),
269249
},
270250
],
271251
},
@@ -324,18 +304,13 @@ error: layout_of(T) = Layout {
324304
variants: [
325305
VariantLayout {
326306
size: Size(4 bytes),
327-
align: AbiAlign {
328-
abi: Align(4 bytes),
329-
},
330307
backend_repr: Memory {
331308
sized: true,
332309
},
333310
field_offsets: [],
334311
fields_in_memory_order: [],
335312
largest_niche: None,
336313
uninhabited: false,
337-
max_repr_align: None,
338-
unadjusted_abi_align: Align(4 bytes),
339314
},
340315
],
341316
},

0 commit comments

Comments
 (0)