Skip to content

Commit 1c613d1

Browse files
committed
Introduce VariantLayout struct
For now, this is a 1-to-1 copy of `LayoutData`, but this will change.
1 parent 03c609a commit 1c613d1

20 files changed

Lines changed: 147 additions & 89 deletions

compiler/rustc_abi/src/layout.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use tracing::{debug, trace};
1111
use crate::{
1212
AbiAlign, Align, BackendRepr, FieldsShape, HasDataLayout, IndexSlice, IndexVec, Integer,
1313
LayoutData, Niche, NonZeroUsize, NumScalableVectors, Primitive, ReprOptions, Scalar, Size,
14-
StructKind, TagEncoding, TargetDataLayout, Variants, WrappingRange,
14+
StructKind, TagEncoding, TargetDataLayout, VariantLayout, Variants, WrappingRange,
1515
};
1616

1717
mod coroutine;
@@ -660,7 +660,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
660660
max_repr_align = max_repr_align.max(st.max_repr_align);
661661
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
662662

663-
Some(st)
663+
Some(VariantLayout::from_layout(st))
664664
})
665665
.collect::<Option<IndexVec<VariantIdx, _>>>()?;
666666

@@ -900,7 +900,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
900900
align = align.max(st.align.abi);
901901
max_repr_align = max_repr_align.max(st.max_repr_align);
902902
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
903-
Ok(st)
903+
Ok(VariantLayout::from_layout(st))
904904
})
905905
.collect::<Result<IndexVec<VariantIdx, _>, _>>()?;
906906

compiler/rustc_abi/src/layout/coroutine.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use tracing::{debug, trace};
2727

2828
use crate::{
2929
BackendRepr, FieldsShape, HasDataLayout, Integer, LayoutData, Primitive, ReprOptions, Scalar,
30-
StructKind, TagEncoding, Variants, WrappingRange,
30+
StructKind, TagEncoding, VariantLayout, Variants, WrappingRange,
3131
};
3232

3333
/// Overlap eligibility and variant assignment for each CoroutineSavedLocal.
@@ -281,7 +281,7 @@ pub(super) fn layout<
281281

282282
size = size.max(variant.size);
283283
align = align.max(variant.align);
284-
Ok(variant)
284+
Ok(VariantLayout::from_layout(variant))
285285
})
286286
.collect::<Result<IndexVec<VariantIdx, _>, _>>()?;
287287

compiler/rustc_abi/src/layout/simple.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,25 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
146146
randomization_seed: Hash64::ZERO,
147147
}
148148
}
149+
150+
/// Returns a layout for an inhabited variant.
151+
pub fn for_variant(parent: &Self, index: VariantIdx) -> Self {
152+
let layout = match &parent.variants {
153+
Variants::Multiple { variants, .. } => &variants[index],
154+
_ => panic!("Expected multi-variant layout in `Layout::for_variant`"),
155+
};
156+
157+
Self {
158+
fields: layout.fields.clone(),
159+
variants: layout.variants.clone(),
160+
backend_repr: layout.backend_repr,
161+
largest_niche: layout.largest_niche,
162+
uninhabited: layout.uninhabited,
163+
align: layout.align,
164+
size: layout.size,
165+
max_repr_align: layout.max_repr_align,
166+
unadjusted_abi_align: layout.unadjusted_abi_align,
167+
randomization_seed: layout.randomization_seed,
168+
}
169+
}
149170
}

compiler/rustc_abi/src/lib.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1974,7 +1974,7 @@ pub enum Variants<FieldIdx: Idx, VariantIdx: Idx> {
19741974
tag: Scalar,
19751975
tag_encoding: TagEncoding<VariantIdx>,
19761976
tag_field: FieldIdx,
1977-
variants: IndexVec<VariantIdx, LayoutData<FieldIdx, VariantIdx>>,
1977+
variants: IndexVec<VariantIdx, VariantLayout<FieldIdx, VariantIdx>>,
19781978
},
19791979
}
19801980

@@ -2339,3 +2339,40 @@ pub enum AbiFromStrErr {
23392339
/// no "-unwind" variant can be used here
23402340
NoExplicitUnwind,
23412341
}
2342+
2343+
// NOTE: This struct is generic over the FieldIdx and VariantIdx for rust-analyzer usage.
2344+
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
2345+
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
2346+
pub struct VariantLayout<FieldIdx: Idx, VariantIdx: Idx> {
2347+
pub size: Size,
2348+
pub align: AbiAlign,
2349+
pub backend_repr: BackendRepr,
2350+
pub fields: FieldsShape<FieldIdx>,
2351+
largest_niche: Option<Niche>,
2352+
uninhabited: bool,
2353+
pub variants: Variants<FieldIdx, VariantIdx>,
2354+
max_repr_align: Option<Align>,
2355+
unadjusted_abi_align: Align,
2356+
randomization_seed: Hash64,
2357+
}
2358+
2359+
impl<FieldIdx: Idx, VariantIdx: Idx> VariantLayout<FieldIdx, VariantIdx> {
2360+
pub fn from_layout(layout: LayoutData<FieldIdx, VariantIdx>) -> Self {
2361+
Self {
2362+
size: layout.size,
2363+
align: layout.align,
2364+
backend_repr: layout.backend_repr,
2365+
fields: layout.fields,
2366+
largest_niche: layout.largest_niche,
2367+
uninhabited: layout.uninhabited,
2368+
variants: layout.variants,
2369+
max_repr_align: layout.max_repr_align,
2370+
unadjusted_abi_align: layout.unadjusted_abi_align,
2371+
randomization_seed: layout.randomization_seed,
2372+
}
2373+
}
2374+
2375+
pub fn is_uninhabited(&self) -> bool {
2376+
self.uninhabited
2377+
}
2378+
}

compiler/rustc_middle/src/ty/layout.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -765,8 +765,8 @@ where
765765
tcx.mk_layout(LayoutData::uninhabited_variant(cx, variant_index, fields))
766766
}
767767

768-
Variants::Multiple { ref variants, .. } => {
769-
cx.tcx().mk_layout(variants[variant_index].clone())
768+
Variants::Multiple { .. } => {
769+
cx.tcx().mk_layout(LayoutData::for_variant(&this, variant_index))
770770
}
771771
};
772772

src/librustdoc/html/render/type_layout.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ pub(crate) fn document_type_layout(cx: &Context<'_>, ty_def_id: DefId) -> impl f
5454
span_bug!(tcx.def_span(ty_def_id), "not an adt")
5555
};
5656
let name = adt.variant(variant_idx).name;
57-
let is_unsized = variant_layout.is_unsized();
57+
let is_unsized = variant_layout.backend_repr.is_unsized();
5858
let is_uninhabited = variant_layout.is_uninhabited();
5959
let size = variant_layout.size.bytes() - tag_size;
6060
let type_layout_size = TypeLayoutSize { is_unsized, is_uninhabited, size };

tests/ui/enum-discriminant/wrapping_niche.stderr

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ error: layout_of(UnsignedAroundZero) = Layout {
4242
tag_encoding: Direct,
4343
tag_field: 0,
4444
variants: [
45-
Layout {
45+
VariantLayout {
4646
size: Size(2 bytes),
4747
align: AbiAlign {
4848
abi: Align(2 bytes),
@@ -63,7 +63,7 @@ error: layout_of(UnsignedAroundZero) = Layout {
6363
unadjusted_abi_align: Align(2 bytes),
6464
randomization_seed: 9885373149222004003,
6565
},
66-
Layout {
66+
VariantLayout {
6767
size: Size(2 bytes),
6868
align: AbiAlign {
6969
abi: Align(2 bytes),
@@ -84,7 +84,7 @@ error: layout_of(UnsignedAroundZero) = Layout {
8484
unadjusted_abi_align: Align(2 bytes),
8585
randomization_seed: 9885373149222004003,
8686
},
87-
Layout {
87+
VariantLayout {
8888
size: Size(2 bytes),
8989
align: AbiAlign {
9090
abi: Align(2 bytes),
@@ -160,7 +160,7 @@ error: layout_of(SignedAroundZero) = Layout {
160160
tag_encoding: Direct,
161161
tag_field: 0,
162162
variants: [
163-
Layout {
163+
VariantLayout {
164164
size: Size(2 bytes),
165165
align: AbiAlign {
166166
abi: Align(2 bytes),
@@ -181,7 +181,7 @@ error: layout_of(SignedAroundZero) = Layout {
181181
unadjusted_abi_align: Align(2 bytes),
182182
randomization_seed: 2684536712112553499,
183183
},
184-
Layout {
184+
VariantLayout {
185185
size: Size(2 bytes),
186186
align: AbiAlign {
187187
abi: Align(2 bytes),
@@ -202,7 +202,7 @@ error: layout_of(SignedAroundZero) = Layout {
202202
unadjusted_abi_align: Align(2 bytes),
203203
randomization_seed: 2684536712112553499,
204204
},
205-
Layout {
205+
VariantLayout {
206206
size: Size(2 bytes),
207207
align: AbiAlign {
208208
abi: Align(2 bytes),

tests/ui/layout/debug.stderr

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ error: layout_of(E) = Layout {
5858
tag_encoding: Direct,
5959
tag_field: 0,
6060
variants: [
61-
Layout {
61+
VariantLayout {
6262
size: Size(4 bytes),
6363
align: AbiAlign {
6464
abi: Align(1 bytes),
@@ -79,7 +79,7 @@ error: layout_of(E) = Layout {
7979
unadjusted_abi_align: Align(1 bytes),
8080
randomization_seed: $SEED,
8181
},
82-
Layout {
82+
VariantLayout {
8383
size: Size(12 bytes),
8484
align: AbiAlign {
8585
abi: Align(4 bytes),
@@ -242,7 +242,7 @@ error: layout_of(Result<i32, i32>) = Layout {
242242
tag_encoding: Direct,
243243
tag_field: 0,
244244
variants: [
245-
Layout {
245+
VariantLayout {
246246
size: Size(8 bytes),
247247
align: AbiAlign {
248248
abi: Align(4 bytes),
@@ -280,7 +280,7 @@ error: layout_of(Result<i32, i32>) = Layout {
280280
unadjusted_abi_align: Align(4 bytes),
281281
randomization_seed: $SEED,
282282
},
283-
Layout {
283+
VariantLayout {
284284
size: Size(8 bytes),
285285
align: AbiAlign {
286286
abi: Align(4 bytes),
@@ -662,7 +662,7 @@ error: layout_of(Option<bool>) = Layout {
662662
},
663663
tag_field: 0,
664664
variants: [
665-
Layout {
665+
VariantLayout {
666666
size: Size(0 bytes),
667667
align: AbiAlign {
668668
abi: Align(1 bytes),
@@ -683,7 +683,7 @@ error: layout_of(Option<bool>) = Layout {
683683
unadjusted_abi_align: Align(1 bytes),
684684
randomization_seed: $SEED,
685685
},
686-
Layout {
686+
VariantLayout {
687687
size: Size(1 bytes),
688688
align: AbiAlign {
689689
abi: Align(1 bytes),
@@ -782,7 +782,7 @@ error: layout_of(Option<char>) = Layout {
782782
},
783783
tag_field: 0,
784784
variants: [
785-
Layout {
785+
VariantLayout {
786786
size: Size(0 bytes),
787787
align: AbiAlign {
788788
abi: Align(1 bytes),
@@ -803,7 +803,7 @@ error: layout_of(Option<char>) = Layout {
803803
unadjusted_abi_align: Align(1 bytes),
804804
randomization_seed: $SEED,
805805
},
806-
Layout {
806+
VariantLayout {
807807
size: Size(4 bytes),
808808
align: AbiAlign {
809809
abi: Align(4 bytes),

tests/ui/layout/hexagon-enum.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ error: layout_of(A) = Layout {
4242
tag_encoding: Direct,
4343
tag_field: 0,
4444
variants: [
45-
Layout {
45+
VariantLayout {
4646
size: Size(1 bytes),
4747
align: AbiAlign {
4848
abi: Align(1 bytes),
@@ -118,7 +118,7 @@ error: layout_of(B) = Layout {
118118
tag_encoding: Direct,
119119
tag_field: 0,
120120
variants: [
121-
Layout {
121+
VariantLayout {
122122
size: Size(1 bytes),
123123
align: AbiAlign {
124124
abi: Align(1 bytes),
@@ -194,7 +194,7 @@ error: layout_of(C) = Layout {
194194
tag_encoding: Direct,
195195
tag_field: 0,
196196
variants: [
197-
Layout {
197+
VariantLayout {
198198
size: Size(2 bytes),
199199
align: AbiAlign {
200200
abi: Align(2 bytes),
@@ -270,7 +270,7 @@ error: layout_of(P) = Layout {
270270
tag_encoding: Direct,
271271
tag_field: 0,
272272
variants: [
273-
Layout {
273+
VariantLayout {
274274
size: Size(4 bytes),
275275
align: AbiAlign {
276276
abi: Align(4 bytes),
@@ -346,7 +346,7 @@ error: layout_of(T) = Layout {
346346
tag_encoding: Direct,
347347
tag_field: 0,
348348
variants: [
349-
Layout {
349+
VariantLayout {
350350
size: Size(4 bytes),
351351
align: AbiAlign {
352352
abi: Align(4 bytes),

0 commit comments

Comments
 (0)