Skip to content

Commit 93db272

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 89e3bd3 commit 93db272

18 files changed

Lines changed: 14 additions & 441 deletions

compiler/rustc_abi/src/layout.rs

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

640640
let calculate_niche_filling_layout = || -> Option<LayoutData<FieldIdx, VariantIdx>> {
641+
struct VariantLayoutInfo {
642+
align_abi: Align,
643+
}
644+
641645
if repr.inhibit_enum_layout_opt() {
642646
return None;
643647
}
@@ -651,11 +655,14 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
651655
let mut unadjusted_abi_align = align;
652656
let mut combined_seed = repr.field_shuffle_seed;
653657

658+
let mut variants_info = IndexVec::<VariantIdx, _>::with_capacity(variants.len());
654659
let mut variant_layouts = variants
655660
.iter()
656661
.map(|v| {
657662
let st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?;
658663

664+
variants_info.push(VariantLayoutInfo { align_abi: st.align.abi });
665+
659666
align = align.max(st.align.abi);
660667
max_repr_align = max_repr_align.max(st.max_repr_align);
661668
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
@@ -699,7 +706,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
699706
}
700707

701708
// Determine if it'll fit after the niche.
702-
let this_align = layout.align.abi;
709+
let this_align = variants_info[i].align_abi;
703710
let this_offset = (niche_offset + niche_size).align_to(this_align);
704711

705712
if this_offset + layout.size > size {
@@ -730,7 +737,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
730737
.iter_enumerated()
731738
.all(|(i, layout)| i == largest_variant_index || layout.size == Size::ZERO);
732739
let same_size = size == variant_layouts[largest_variant_index].size;
733-
let same_align = align == variant_layouts[largest_variant_index].align.abi;
740+
let same_align = align == variants_info[largest_variant_index].align_abi;
734741

735742
let uninhabited = variant_layouts.iter().all(|v| v.is_uninhabited());
736743
let abi = if same_size && same_align && others_zst {
@@ -1080,10 +1087,8 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
10801087
if matches!(variant.backend_repr, BackendRepr::Memory { .. } if variant.has_fields())
10811088
{
10821089
variant.backend_repr = abi;
1083-
// Also need to bump up the size and alignment, so that the entire value fits
1084-
// in here.
1090+
// Also need to bump up the size, so that the entire value fits in here.
10851091
variant.size = cmp::max(variant.size, size);
1086-
variant.align.abi = cmp::max(variant.align.abi, align);
10871092
}
10881093
}
10891094
}

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
@@ -2345,14 +2345,11 @@ pub enum AbiFromStrErr {
23452345
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
23462346
pub struct VariantLayout<FieldIdx: Idx> {
23472347
pub size: Size,
2348-
pub align: AbiAlign,
23492348
pub backend_repr: BackendRepr,
23502349
pub field_offsets: IndexVec<FieldIdx, Size>,
23512350
fields_in_memory_order: IndexVec<u32, FieldIdx>,
23522351
largest_niche: Option<Niche>,
23532352
uninhabited: bool,
2354-
max_repr_align: Option<Align>,
2355-
unadjusted_abi_align: Align,
23562353
}
23572354

23582355
impl<FieldIdx: Idx> VariantLayout<FieldIdx> {
@@ -2363,14 +2360,11 @@ impl<FieldIdx: Idx> VariantLayout<FieldIdx> {
23632360

23642361
Self {
23652362
size: layout.size,
2366-
align: layout.align,
23672363
backend_repr: layout.backend_repr,
23682364
field_offsets: offsets,
23692365
fields_in_memory_order: in_memory_order,
23702366
largest_niche: layout.largest_niche,
23712367
uninhabited: layout.uninhabited,
2372-
max_repr_align: layout.max_repr_align,
2373-
unadjusted_abi_align: layout.unadjusted_abi_align,
23742368
}
23752369
}
23762370

compiler/rustc_ty_utils/src/layout/invariant.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -302,22 +302,14 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou
302302
}
303303
}
304304
for variant in variants.iter() {
305-
// Variants should have the same or a smaller size as the full thing,
306-
// and same for alignment.
305+
// Variants should have the same or a smaller size as the full thing.
307306
if variant.size > layout.size {
308307
bug!(
309308
"Type with size {} bytes has variant with size {} bytes: {layout:#?}",
310309
layout.size.bytes(),
311310
variant.size.bytes(),
312311
)
313312
}
314-
if variant.align.abi > layout.align.abi {
315-
bug!(
316-
"Type with alignment {} bytes has variant with alignment {} bytes: {layout:#?}",
317-
layout.align.bytes(),
318-
variant.align.bytes(),
319-
)
320-
}
321313
// Skip empty variants.
322314
if variant.size == Size::ZERO || !variant.has_fields() || variant.is_uninhabited() {
323315
// 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 & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -60,24 +60,16 @@ error: layout_of(E) = Layout {
6060
variants: [
6161
VariantLayout {
6262
size: Size(4 bytes),
63-
align: AbiAlign {
64-
abi: Align(1 bytes),
65-
},
6663
backend_repr: Memory {
6764
sized: true,
6865
},
6966
field_offsets: [],
7067
fields_in_memory_order: [],
7168
largest_niche: None,
7269
uninhabited: false,
73-
max_repr_align: None,
74-
unadjusted_abi_align: Align(1 bytes),
7570
},
7671
VariantLayout {
7772
size: Size(12 bytes),
78-
align: AbiAlign {
79-
abi: Align(4 bytes),
80-
},
8173
backend_repr: Memory {
8274
sized: true,
8375
},
@@ -93,8 +85,6 @@ error: layout_of(E) = Layout {
9385
],
9486
largest_niche: None,
9587
uninhabited: true,
96-
max_repr_align: None,
97-
unadjusted_abi_align: Align(4 bytes),
9888
},
9989
],
10090
},
@@ -232,9 +222,6 @@ error: layout_of(Result<i32, i32>) = Layout {
232222
variants: [
233223
VariantLayout {
234224
size: Size(8 bytes),
235-
align: AbiAlign {
236-
abi: Align(4 bytes),
237-
},
238225
backend_repr: ScalarPair(
239226
Initialized {
240227
value: Int(
@@ -259,14 +246,9 @@ error: layout_of(Result<i32, i32>) = Layout {
259246
],
260247
largest_niche: None,
261248
uninhabited: false,
262-
max_repr_align: None,
263-
unadjusted_abi_align: Align(4 bytes),
264249
},
265250
VariantLayout {
266251
size: Size(8 bytes),
267-
align: AbiAlign {
268-
abi: Align(4 bytes),
269-
},
270252
backend_repr: ScalarPair(
271253
Initialized {
272254
value: Int(
@@ -291,8 +273,6 @@ error: layout_of(Result<i32, i32>) = Layout {
291273
],
292274
largest_niche: None,
293275
uninhabited: false,
294-
max_repr_align: None,
295-
unadjusted_abi_align: Align(4 bytes),
296276
},
297277
],
298278
},
@@ -640,24 +620,16 @@ error: layout_of(Option<bool>) = Layout {
640620
variants: [
641621
VariantLayout {
642622
size: Size(0 bytes),
643-
align: AbiAlign {
644-
abi: Align(1 bytes),
645-
},
646623
backend_repr: Memory {
647624
sized: true,
648625
},
649626
field_offsets: [],
650627
fields_in_memory_order: [],
651628
largest_niche: None,
652629
uninhabited: false,
653-
max_repr_align: None,
654-
unadjusted_abi_align: Align(1 bytes),
655630
},
656631
VariantLayout {
657632
size: Size(1 bytes),
658-
align: AbiAlign {
659-
abi: Align(1 bytes),
660-
},
661633
backend_repr: Scalar(
662634
Initialized {
663635
value: Int(
@@ -684,8 +656,6 @@ error: layout_of(Option<bool>) = Layout {
684656
},
685657
),
686658
uninhabited: false,
687-
max_repr_align: None,
688-
unadjusted_abi_align: Align(1 bytes),
689659
},
690660
],
691661
},
@@ -748,24 +718,16 @@ error: layout_of(Option<char>) = Layout {
748718
variants: [
749719
VariantLayout {
750720
size: Size(0 bytes),
751-
align: AbiAlign {
752-
abi: Align(1 bytes),
753-
},
754721
backend_repr: Memory {
755722
sized: true,
756723
},
757724
field_offsets: [],
758725
fields_in_memory_order: [],
759726
largest_niche: None,
760727
uninhabited: false,
761-
max_repr_align: None,
762-
unadjusted_abi_align: Align(1 bytes),
763728
},
764729
VariantLayout {
765730
size: Size(4 bytes),
766-
align: AbiAlign {
767-
abi: Align(4 bytes),
768-
},
769731
backend_repr: Scalar(
770732
Initialized {
771733
value: Int(
@@ -792,8 +754,6 @@ error: layout_of(Option<char>) = Layout {
792754
},
793755
),
794756
uninhabited: false,
795-
max_repr_align: None,
796-
unadjusted_abi_align: Align(4 bytes),
797757
},
798758
],
799759
},

0 commit comments

Comments
 (0)