Skip to content

Commit e4c2822

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

20 files changed

Lines changed: 143 additions & 85 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, Primitive, ReprOptions, Scalar, Size, StructKind, TagEncoding,
14-
TargetDataLayout, Variants, WrappingRange,
14+
TargetDataLayout, VariantLayout, Variants, WrappingRange,
1515
};
1616

1717
mod coroutine;
@@ -597,7 +597,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
597597
max_repr_align = max_repr_align.max(st.max_repr_align);
598598
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
599599

600-
Some(st)
600+
Some(VariantLayout::from_layout(st))
601601
})
602602
.collect::<Option<IndexVec<VariantIdx, _>>>()?;
603603

@@ -837,7 +837,7 @@ impl<Cx: HasDataLayout> LayoutCalculator<Cx> {
837837
align = align.max(st.align.abi);
838838
max_repr_align = max_repr_align.max(st.max_repr_align);
839839
unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align);
840-
Ok(st)
840+
Ok(VariantLayout::from_layout(st))
841841
})
842842
.collect::<Result<IndexVec<VariantIdx, _>, _>>()?;
843843

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
@@ -1875,7 +1875,7 @@ pub enum Variants<FieldIdx: Idx, VariantIdx: Idx> {
18751875
tag: Scalar,
18761876
tag_encoding: TagEncoding<VariantIdx>,
18771877
tag_field: FieldIdx,
1878-
variants: IndexVec<VariantIdx, LayoutData<FieldIdx, VariantIdx>>,
1878+
variants: IndexVec<VariantIdx, VariantLayout<FieldIdx, VariantIdx>>,
18791879
},
18801880
}
18811881

@@ -2230,3 +2230,40 @@ pub enum AbiFromStrErr {
22302230
/// no "-unwind" variant can be used here
22312231
NoExplicitUnwind,
22322232
}
2233+
2234+
// NOTE: This struct is generic over the FieldIdx and VariantIdx for rust-analyzer usage.
2235+
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
2236+
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
2237+
pub struct VariantLayout<FieldIdx: Idx, VariantIdx: Idx> {
2238+
pub size: Size,
2239+
pub align: AbiAlign,
2240+
pub backend_repr: BackendRepr,
2241+
pub fields: FieldsShape<FieldIdx>,
2242+
largest_niche: Option<Niche>,
2243+
uninhabited: bool,
2244+
pub variants: Variants<FieldIdx, VariantIdx>,
2245+
max_repr_align: Option<Align>,
2246+
unadjusted_abi_align: Align,
2247+
randomization_seed: Hash64,
2248+
}
2249+
2250+
impl<FieldIdx: Idx, VariantIdx: Idx> VariantLayout<FieldIdx, VariantIdx> {
2251+
pub fn from_layout(layout: LayoutData<FieldIdx, VariantIdx>) -> Self {
2252+
Self {
2253+
size: layout.size,
2254+
align: layout.align,
2255+
backend_repr: layout.backend_repr,
2256+
fields: layout.fields,
2257+
largest_niche: layout.largest_niche,
2258+
uninhabited: layout.uninhabited,
2259+
variants: layout.variants,
2260+
max_repr_align: layout.max_repr_align,
2261+
unadjusted_abi_align: layout.unadjusted_abi_align,
2262+
randomization_seed: layout.randomization_seed,
2263+
}
2264+
}
2265+
2266+
pub fn is_uninhabited(&self) -> bool {
2267+
self.uninhabited
2268+
}
2269+
}

compiler/rustc_middle/src/ty/layout.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,8 +803,8 @@ where
803803
tcx.mk_layout(LayoutData::uninhabited_variant(cx, variant_index, fields))
804804
}
805805

806-
Variants::Multiple { ref variants, .. } => {
807-
cx.tcx().mk_layout(variants[variant_index].clone())
806+
Variants::Multiple { .. } => {
807+
cx.tcx().mk_layout(LayoutData::for_variant(&this, variant_index))
808808
}
809809
};
810810

src/librustdoc/html/render/type_layout.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub(crate) fn document_type_layout(cx: &Context<'_>, ty_def_id: DefId) -> impl f
5555
span_bug!(tcx.def_span(ty_def_id), "not an adt")
5656
};
5757
let name = adt.variant(variant_idx).name;
58-
let is_unsized = variant_layout.is_unsized();
58+
let is_unsized = variant_layout.backend_repr.is_unsized();
5959
let is_uninhabited = variant_layout.is_uninhabited();
6060
let size = variant_layout.size.bytes() - tag_size;
6161
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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ error: layout_of(E) = Layout {
4242
tag_encoding: Direct,
4343
tag_field: 0,
4444
variants: [
45-
Layout {
45+
VariantLayout {
4646
size: Size(4 bytes),
4747
align: AbiAlign {
4848
abi: Align(1 bytes),
@@ -63,7 +63,7 @@ error: layout_of(E) = Layout {
6363
unadjusted_abi_align: Align(1 bytes),
6464
randomization_seed: $SEED,
6565
},
66-
Layout {
66+
VariantLayout {
6767
size: Size(12 bytes),
6868
align: AbiAlign {
6969
abi: Align(4 bytes),
@@ -226,7 +226,7 @@ error: layout_of(Result<i32, i32>) = Layout {
226226
tag_encoding: Direct,
227227
tag_field: 0,
228228
variants: [
229-
Layout {
229+
VariantLayout {
230230
size: Size(8 bytes),
231231
align: AbiAlign {
232232
abi: Align(4 bytes),
@@ -264,7 +264,7 @@ error: layout_of(Result<i32, i32>) = Layout {
264264
unadjusted_abi_align: Align(4 bytes),
265265
randomization_seed: $SEED,
266266
},
267-
Layout {
267+
VariantLayout {
268268
size: Size(8 bytes),
269269
align: AbiAlign {
270270
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),

tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ error: layout_of(MissingPayloadField) = Layout {
4848
tag_encoding: Direct,
4949
tag_field: 0,
5050
variants: [
51-
Layout {
51+
VariantLayout {
5252
size: Size(2 bytes),
5353
align: AbiAlign {
5454
abi: Align(1 bytes),
@@ -85,7 +85,7 @@ error: layout_of(MissingPayloadField) = Layout {
8585
unadjusted_abi_align: Align(1 bytes),
8686
randomization_seed: $SEED,
8787
},
88-
Layout {
88+
VariantLayout {
8989
size: Size(1 bytes),
9090
align: AbiAlign {
9191
abi: Align(1 bytes),
@@ -168,7 +168,7 @@ error: layout_of(CommonPayloadField) = Layout {
168168
tag_encoding: Direct,
169169
tag_field: 0,
170170
variants: [
171-
Layout {
171+
VariantLayout {
172172
size: Size(2 bytes),
173173
align: AbiAlign {
174174
abi: Align(1 bytes),
@@ -206,7 +206,7 @@ error: layout_of(CommonPayloadField) = Layout {
206206
unadjusted_abi_align: Align(1 bytes),
207207
randomization_seed: $SEED,
208208
},
209-
Layout {
209+
VariantLayout {
210210
size: Size(2 bytes),
211211
align: AbiAlign {
212212
abi: Align(1 bytes),
@@ -305,7 +305,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
305305
tag_encoding: Direct,
306306
tag_field: 0,
307307
variants: [
308-
Layout {
308+
VariantLayout {
309309
size: Size(2 bytes),
310310
align: AbiAlign {
311311
abi: Align(1 bytes),
@@ -342,7 +342,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout {
342342
unadjusted_abi_align: Align(1 bytes),
343343
randomization_seed: $SEED,
344344
},
345-
Layout {
345+
VariantLayout {
346346
size: Size(2 bytes),
347347
align: AbiAlign {
348348
abi: Align(1 bytes),
@@ -444,7 +444,7 @@ error: layout_of(NicheFirst) = Layout {
444444
},
445445
tag_field: 0,
446446
variants: [
447-
Layout {
447+
VariantLayout {
448448
size: Size(2 bytes),
449449
align: AbiAlign {
450450
abi: Align(1 bytes),
@@ -493,7 +493,7 @@ error: layout_of(NicheFirst) = Layout {
493493
unadjusted_abi_align: Align(1 bytes),
494494
randomization_seed: $SEED,
495495
},
496-
Layout {
496+
VariantLayout {
497497
size: Size(0 bytes),
498498
align: AbiAlign {
499499
abi: Align(1 bytes),
@@ -514,7 +514,7 @@ error: layout_of(NicheFirst) = Layout {
514514
unadjusted_abi_align: Align(1 bytes),
515515
randomization_seed: $SEED,
516516
},
517-
Layout {
517+
VariantLayout {
518518
size: Size(0 bytes),
519519
align: AbiAlign {
520520
abi: Align(1 bytes),
@@ -600,7 +600,7 @@ error: layout_of(NicheSecond) = Layout {
600600
},
601601
tag_field: 0,
602602
variants: [
603-
Layout {
603+
VariantLayout {
604604
size: Size(2 bytes),
605605
align: AbiAlign {
606606
abi: Align(1 bytes),
@@ -649,7 +649,7 @@ error: layout_of(NicheSecond) = Layout {
649649
unadjusted_abi_align: Align(1 bytes),
650650
randomization_seed: $SEED,
651651
},
652-
Layout {
652+
VariantLayout {
653653
size: Size(0 bytes),
654654
align: AbiAlign {
655655
abi: Align(1 bytes),
@@ -670,7 +670,7 @@ error: layout_of(NicheSecond) = Layout {
670670
unadjusted_abi_align: Align(1 bytes),
671671
randomization_seed: $SEED,
672672
},
673-
Layout {
673+
VariantLayout {
674674
size: Size(0 bytes),
675675
align: AbiAlign {
676676
abi: Align(1 bytes),

0 commit comments

Comments
 (0)