Skip to content

Commit eba9af8

Browse files
authored
Rollup merge of rust-lang#72497 - RalfJung:tag-term, r=oli-obk
tag/niche terminology cleanup The term "discriminant" was used in two ways throughout the compiler: * every enum variant has a corresponding discriminant, that can be given explicitly with `Variant = N`. * that discriminant is then encoded in memory to store which variant is active -- but this encoded form of the discriminant was also often called "discriminant", even though it is conceptually quite different (e.g., it can be smaller in size, or even use niche-filling). After discussion with @eddyb, this renames the second term to "tag". The way the tag is encoded can be either `TagEncoding::Direct` (formerly `DiscriminantKind::Tag`) or `TagEncoding::Niche` (formerly `DiscrimianntKind::Niche`). This finally resolves some long-standing confusion I had about the handling of variant indices and discriminants, which surfaced in rust-lang#72419. (There is also a `DiscriminantKind` type in libcore, it remains unaffected. I think this corresponds to the discriminant, not the tag, so that seems all right.) r? @eddyb
2 parents 2edb58e + 10c8d2a commit eba9af8

File tree

13 files changed

+181
-180
lines changed

13 files changed

+181
-180
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

+53-55
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use self::EnumDiscriminantInfo::*;
1+
use self::EnumTagInfo::*;
22
use self::MemberDescriptionFactory::*;
33
use self::RecursiveTypeDescription::*;
44

@@ -40,7 +40,7 @@ use rustc_middle::{bug, span_bug};
4040
use rustc_session::config::{self, DebugInfo};
4141
use rustc_span::symbol::{Interner, Symbol};
4242
use rustc_span::{self, SourceFile, SourceFileHash, Span};
43-
use rustc_target::abi::{Abi, Align, DiscriminantKind, HasDataLayout, Integer, LayoutOf};
43+
use rustc_target::abi::{Abi, Align, HasDataLayout, Integer, LayoutOf, TagEncoding};
4444
use rustc_target::abi::{Int, Pointer, F32, F64};
4545
use rustc_target::abi::{Primitive, Size, VariantIdx, Variants};
4646

@@ -1335,7 +1335,7 @@ fn generator_layout_and_saved_local_names(
13351335
struct EnumMemberDescriptionFactory<'ll, 'tcx> {
13361336
enum_type: Ty<'tcx>,
13371337
layout: TyAndLayout<'tcx>,
1338-
discriminant_type_metadata: Option<&'ll DIType>,
1338+
tag_type_metadata: Option<&'ll DIType>,
13391339
containing_scope: &'ll DIScope,
13401340
span: Span,
13411341
}
@@ -1385,7 +1385,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
13851385
cx,
13861386
self.layout,
13871387
variant_info,
1388-
NoDiscriminant,
1388+
NoTag,
13891389
self_metadata,
13901390
self.span,
13911391
);
@@ -1409,19 +1409,19 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14091409
}]
14101410
}
14111411
Variants::Multiple {
1412-
discr_kind: DiscriminantKind::Tag,
1413-
discr_index,
1412+
tag_encoding: TagEncoding::Direct,
1413+
tag_field,
14141414
ref variants,
14151415
..
14161416
} => {
1417-
let discriminant_info = if fallback {
1418-
RegularDiscriminant {
1419-
discr_field: Field::from(discr_index),
1420-
discr_type_metadata: self.discriminant_type_metadata.unwrap(),
1417+
let tag_info = if fallback {
1418+
RegularTag {
1419+
tag_field: Field::from(tag_field),
1420+
tag_type_metadata: self.tag_type_metadata.unwrap(),
14211421
}
14221422
} else {
14231423
// This doesn't matter in this case.
1424-
NoDiscriminant
1424+
NoTag
14251425
};
14261426
variants
14271427
.iter_enumerated()
@@ -1432,7 +1432,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14321432
cx,
14331433
variant,
14341434
variant_info,
1435-
discriminant_info,
1435+
tag_info,
14361436
self_metadata,
14371437
self.span,
14381438
);
@@ -1467,11 +1467,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14671467
.collect()
14681468
}
14691469
Variants::Multiple {
1470-
discr_kind:
1471-
DiscriminantKind::Niche { ref niche_variants, niche_start, dataful_variant },
1472-
ref discr,
1470+
tag_encoding:
1471+
TagEncoding::Niche { ref niche_variants, niche_start, dataful_variant },
1472+
ref tag,
14731473
ref variants,
1474-
discr_index,
1474+
tag_field,
14751475
} => {
14761476
if fallback {
14771477
let variant = self.layout.for_variant(cx, dataful_variant);
@@ -1480,7 +1480,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14801480
cx,
14811481
variant,
14821482
variant_info_for(dataful_variant),
1483-
OptimizedDiscriminant,
1483+
OptimizedTag,
14841484
self.containing_scope,
14851485
self.span,
14861486
);
@@ -1524,8 +1524,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15241524
cx,
15251525
&mut name,
15261526
self.layout,
1527-
self.layout.fields.offset(discr_index),
1528-
self.layout.field(cx, discr_index).size,
1527+
self.layout.fields.offset(tag_field),
1528+
self.layout.field(cx, tag_field).size,
15291529
);
15301530
variant_info_for(*niche_variants.start()).map_struct_name(|variant_name| {
15311531
name.push_str(variant_name);
@@ -1552,7 +1552,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15521552
cx,
15531553
variant,
15541554
variant_info,
1555-
OptimizedDiscriminant,
1555+
OptimizedTag,
15561556
self_metadata,
15571557
self.span,
15581558
);
@@ -1573,7 +1573,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15731573
let value = (i.as_u32() as u128)
15741574
.wrapping_sub(niche_variants.start().as_u32() as u128)
15751575
.wrapping_add(niche_start);
1576-
let value = truncate(value, discr.value.size(cx));
1576+
let value = truncate(value, tag.value.size(cx));
15771577
// NOTE(eddyb) do *NOT* remove this assert, until
15781578
// we pass the full 128-bit value to LLVM, otherwise
15791579
// truncation will be silent and remain undetected.
@@ -1603,7 +1603,7 @@ struct VariantMemberDescriptionFactory<'ll, 'tcx> {
16031603
/// Cloned from the `layout::Struct` describing the variant.
16041604
offsets: Vec<Size>,
16051605
args: Vec<(String, Ty<'tcx>)>,
1606-
discriminant_type_metadata: Option<&'ll DIType>,
1606+
tag_type_metadata: Option<&'ll DIType>,
16071607
span: Span,
16081608
}
16091609

@@ -1617,7 +1617,7 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> {
16171617
MemberDescription {
16181618
name: name.to_string(),
16191619
type_metadata: if use_enum_fallback(cx) {
1620-
match self.discriminant_type_metadata {
1620+
match self.tag_type_metadata {
16211621
// Discriminant is always the first field of our variant
16221622
// when using the enum fallback.
16231623
Some(metadata) if i == 0 => metadata,
@@ -1637,11 +1637,14 @@ impl VariantMemberDescriptionFactory<'ll, 'tcx> {
16371637
}
16381638
}
16391639

1640+
// FIXME: terminology here should be aligned with `abi::TagEncoding`.
1641+
// `OptimizedTag` is `TagEncoding::Niche`, `RegularTag` is `TagEncoding::Direct`.
1642+
// `NoTag` should be removed; users should use `Option<EnumTagInfo>` instead.
16401643
#[derive(Copy, Clone)]
1641-
enum EnumDiscriminantInfo<'ll> {
1642-
RegularDiscriminant { discr_field: Field, discr_type_metadata: &'ll DIType },
1643-
OptimizedDiscriminant,
1644-
NoDiscriminant,
1644+
enum EnumTagInfo<'ll> {
1645+
RegularTag { tag_field: Field, tag_type_metadata: &'ll DIType },
1646+
OptimizedTag,
1647+
NoTag,
16451648
}
16461649

16471650
#[derive(Copy, Clone)]
@@ -1706,7 +1709,7 @@ fn describe_enum_variant(
17061709
cx: &CodegenCx<'ll, 'tcx>,
17071710
layout: layout::TyAndLayout<'tcx>,
17081711
variant: VariantInfo<'_, 'tcx>,
1709-
discriminant_info: EnumDiscriminantInfo<'ll>,
1712+
discriminant_info: EnumTagInfo<'ll>,
17101713
containing_scope: &'ll DIScope,
17111714
span: Span,
17121715
) -> (&'ll DICompositeType, MemberDescriptionFactory<'ll, 'tcx>) {
@@ -1722,12 +1725,12 @@ fn describe_enum_variant(
17221725
let (offsets, args) = if use_enum_fallback(cx) {
17231726
// If this is not a univariant enum, there is also the discriminant field.
17241727
let (discr_offset, discr_arg) = match discriminant_info {
1725-
RegularDiscriminant { discr_field, .. } => {
1728+
RegularTag { tag_field, .. } => {
17261729
// We have the layout of an enum variant, we need the layout of the outer enum
17271730
let enum_layout = cx.layout_of(layout.ty);
1728-
let offset = enum_layout.fields.offset(discr_field.as_usize());
1731+
let offset = enum_layout.fields.offset(tag_field.as_usize());
17291732
let args =
1730-
("RUST$ENUM$DISR".to_owned(), enum_layout.field(cx, discr_field.as_usize()).ty);
1733+
("RUST$ENUM$DISR".to_owned(), enum_layout.field(cx, tag_field.as_usize()).ty);
17311734
(Some(offset), Some(args))
17321735
}
17331736
_ => (None, None),
@@ -1757,8 +1760,8 @@ fn describe_enum_variant(
17571760
let member_description_factory = VariantMDF(VariantMemberDescriptionFactory {
17581761
offsets,
17591762
args,
1760-
discriminant_type_metadata: match discriminant_info {
1761-
RegularDiscriminant { discr_type_metadata, .. } => Some(discr_type_metadata),
1763+
tag_type_metadata: match discriminant_info {
1764+
RegularTag { tag_type_metadata, .. } => Some(tag_type_metadata),
17621765
_ => None,
17631766
},
17641767
span,
@@ -1880,18 +1883,18 @@ fn prepare_enum_metadata(
18801883

18811884
if let (
18821885
&Abi::Scalar(_),
1883-
&Variants::Multiple { discr_kind: DiscriminantKind::Tag, ref discr, .. },
1886+
&Variants::Multiple { tag_encoding: TagEncoding::Direct, ref tag, .. },
18841887
) = (&layout.abi, &layout.variants)
18851888
{
1886-
return FinalMetadata(discriminant_type_metadata(discr.value));
1889+
return FinalMetadata(discriminant_type_metadata(tag.value));
18871890
}
18881891

18891892
if use_enum_fallback(cx) {
18901893
let discriminant_type_metadata = match layout.variants {
18911894
Variants::Single { .. }
1892-
| Variants::Multiple { discr_kind: DiscriminantKind::Niche { .. }, .. } => None,
1893-
Variants::Multiple { discr_kind: DiscriminantKind::Tag, ref discr, .. } => {
1894-
Some(discriminant_type_metadata(discr.value))
1895+
| Variants::Multiple { tag_encoding: TagEncoding::Niche { .. }, .. } => None,
1896+
Variants::Multiple { tag_encoding: TagEncoding::Direct, ref tag, .. } => {
1897+
Some(discriminant_type_metadata(tag.value))
18951898
}
18961899
};
18971900

@@ -1927,7 +1930,7 @@ fn prepare_enum_metadata(
19271930
EnumMDF(EnumMemberDescriptionFactory {
19281931
enum_type,
19291932
layout,
1930-
discriminant_type_metadata,
1933+
tag_type_metadata: discriminant_type_metadata,
19311934
containing_scope,
19321935
span,
19331936
}),
@@ -1943,24 +1946,21 @@ fn prepare_enum_metadata(
19431946
Variants::Single { .. } => None,
19441947

19451948
Variants::Multiple {
1946-
discr_kind: DiscriminantKind::Niche { .. },
1947-
ref discr,
1948-
discr_index,
1949-
..
1949+
tag_encoding: TagEncoding::Niche { .. }, ref tag, tag_field, ..
19501950
} => {
19511951
// Find the integer type of the correct size.
1952-
let size = discr.value.size(cx);
1953-
let align = discr.value.align(cx);
1952+
let size = tag.value.size(cx);
1953+
let align = tag.value.align(cx);
19541954

1955-
let discr_type = match discr.value {
1955+
let tag_type = match tag.value {
19561956
Int(t, _) => t,
19571957
F32 => Integer::I32,
19581958
F64 => Integer::I64,
19591959
Pointer => cx.data_layout().ptr_sized_integer(),
19601960
}
19611961
.to_ty(cx.tcx, false);
19621962

1963-
let discr_metadata = basic_type_metadata(cx, discr_type);
1963+
let tag_metadata = basic_type_metadata(cx, tag_type);
19641964
unsafe {
19651965
Some(llvm::LLVMRustDIBuilderCreateMemberType(
19661966
DIB(cx),
@@ -1971,17 +1971,15 @@ fn prepare_enum_metadata(
19711971
UNKNOWN_LINE_NUMBER,
19721972
size.bits(),
19731973
align.abi.bits() as u32,
1974-
layout.fields.offset(discr_index).bits(),
1974+
layout.fields.offset(tag_field).bits(),
19751975
DIFlags::FlagArtificial,
1976-
discr_metadata,
1976+
tag_metadata,
19771977
))
19781978
}
19791979
}
19801980

1981-
Variants::Multiple {
1982-
discr_kind: DiscriminantKind::Tag, ref discr, discr_index, ..
1983-
} => {
1984-
let discr_type = discr.value.to_ty(cx.tcx);
1981+
Variants::Multiple { tag_encoding: TagEncoding::Direct, ref tag, tag_field, .. } => {
1982+
let discr_type = tag.value.to_ty(cx.tcx);
19851983
let (size, align) = cx.size_and_align_of(discr_type);
19861984

19871985
let discr_metadata = basic_type_metadata(cx, discr_type);
@@ -1995,7 +1993,7 @@ fn prepare_enum_metadata(
19951993
UNKNOWN_LINE_NUMBER,
19961994
size.bits(),
19971995
align.bits() as u32,
1998-
layout.fields.offset(discr_index).bits(),
1996+
layout.fields.offset(tag_field).bits(),
19991997
DIFlags::FlagArtificial,
20001998
discr_metadata,
20011999
))
@@ -2081,7 +2079,7 @@ fn prepare_enum_metadata(
20812079
EnumMDF(EnumMemberDescriptionFactory {
20822080
enum_type,
20832081
layout,
2084-
discriminant_type_metadata: None,
2082+
tag_type_metadata: None,
20852083
containing_scope,
20862084
span,
20872085
}),

0 commit comments

Comments
 (0)