Skip to content

Commit 3127419

Browse files
committed
Respond to review feedback
1 parent ef053fd commit 3127419

File tree

4 files changed

+61
-98
lines changed

4 files changed

+61
-98
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

+28-62
Original file line numberDiff line numberDiff line change
@@ -1485,8 +1485,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
14851485
_ => bug!(),
14861486
};
14871487

1488-
// This will always find the metadata in the type map.
14891488
let fallback = use_enum_fallback(cx);
1489+
// This will always find the metadata in the type map.
14901490
let self_metadata = type_metadata(cx, self.enum_type, self.span);
14911491

14921492
match self.layout.variants {
@@ -1541,11 +1541,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15411541
// struct {variant 0 name} {
15421542
// tag$ variant$;
15431543
// <variant 0 fields>
1544-
// } Variant0;
1544+
// } variant0;
15451545
// <other variant structs>
15461546
// }
15471547
// ```
1548-
// The natvis in `intrinsic.nativs` then matches on `this.Variant0.variant$` to
1548+
// The natvis in `intrinsic.nativs` then matches on `this.variant0.variant$` to
15491549
// determine which variant is active and then displays it.
15501550
Some(DirectTag {
15511551
tag_field: Field::from(tag_field),
@@ -1582,7 +1582,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15821582

15831583
MemberDescription {
15841584
name: if fallback {
1585-
format!("Variant{}", i.as_u32())
1585+
format!("variant{}", i.as_u32())
15861586
} else {
15871587
variant_info.variant_name()
15881588
},
@@ -1623,43 +1623,27 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16231623
}
16241624
};
16251625

1626-
// For MSVC, we will generate a union of two structs, one for the dataful variant and one that just points to
1627-
// the discriminant field. We also create an enum that contains tag values for the non-dataful variants and
1628-
// make the discriminant field that type. We then use natvis to render the enum type correctly in Windbg/VS.
1626+
// For MSVC, we will generate a union of two fields, one for the dataful variant
1627+
// and one that just points to the discriminant. We also create an enum that
1628+
// contains tag values for the non-dataful variants and make the discriminant field
1629+
// that type. We then use natvis to render the enum type correctly in Windbg/VS.
16291630
// This will generate debuginfo roughly equivalent to the following C:
16301631
// ```c
1631-
// union enum$<{name}, {min niche}, {max niche}, {dataful variant name} {
1632-
// struct dataful_variant {
1632+
// union enum$<{name}, {min niche}, {max niche}, {dataful variant name}> {
1633+
// struct <dataful variant name> {
16331634
// <fields in dataful variant>
1634-
// },
1635-
// struct discriminant$ {
1636-
// enum tag$ {
1637-
// <non-dataful variants>
1638-
// } discriminant;
1639-
// }
1635+
// } dataful_variant;
1636+
// enum Discriminant$ {
1637+
// <non-dataful variants>
1638+
// } discriminant;
16401639
// }
16411640
// ```
16421641
// The natvis in `intrinsic.natvis` matches on the type name `enum$<*, *, *, *>`
1643-
// and evaluates `this.discriminant$.discriminant`. If the value is between
1644-
// the min niche and max niche, then the enum is in the dataful variant and
1645-
// `this.dataful_variant` is rendered. Otherwise, the enum is in one of the
1646-
// non-dataful variants. In that case, we just need to render the name of the
1647-
// `this.discriminant$.discriminant` enum.
1642+
// and evaluates `this.discriminant`. If the value is between the min niche and max
1643+
// niche, then the enum is in the dataful variant and `this.dataful_variant` is
1644+
// rendered. Otherwise, the enum is in one of the non-dataful variants. In that
1645+
// case, we just need to render the name of the `this.discriminant` enum.
16481646
if fallback {
1649-
let unique_type_id = debug_context(cx)
1650-
.type_map
1651-
.borrow_mut()
1652-
.get_unique_type_id_of_enum_variant(cx, self.enum_type, "discriminant$");
1653-
1654-
let variant_metadata = create_struct_stub(
1655-
cx,
1656-
self.layout.ty,
1657-
&"discriminant$",
1658-
unique_type_id,
1659-
Some(self_metadata),
1660-
DIFlags::FlagArtificial,
1661-
);
1662-
16631647
let dataful_variant_layout = self.layout.for_variant(cx, dataful_variant);
16641648

16651649
let mut discr_enum_ty = tag.value.to_ty(cx.tcx);
@@ -1694,8 +1678,8 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16941678
llvm::LLVMRustDIBuilderCreateEnumerationType(
16951679
DIB(cx),
16961680
self_metadata,
1697-
"tag$".as_ptr().cast(),
1698-
"tag$".len(),
1681+
"Discriminant$".as_ptr().cast(),
1682+
"Discriminant$".len(),
16991683
unknown_file_metadata(cx),
17001684
UNKNOWN_LINE_NUMBER,
17011685
tag.value.size(cx).bits(),
@@ -1706,27 +1690,6 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
17061690
)
17071691
};
17081692

1709-
let (size, align) =
1710-
cx.size_and_align_of(dataful_variant_layout.field(cx, tag_field).ty);
1711-
let members = vec![MemberDescription {
1712-
name: "discriminant".to_string(),
1713-
type_metadata: discr_enum,
1714-
offset: dataful_variant_layout.fields.offset(tag_field),
1715-
size,
1716-
align,
1717-
flags: DIFlags::FlagArtificial,
1718-
discriminant: None,
1719-
source_info: None,
1720-
}];
1721-
1722-
set_members_of_composite_type(
1723-
cx,
1724-
self.enum_type,
1725-
variant_metadata,
1726-
members,
1727-
None,
1728-
);
1729-
17301693
let variant_info = variant_info_for(dataful_variant);
17311694
let (variant_type_metadata, member_desc_factory) = describe_enum_variant(
17321695
cx,
@@ -1747,6 +1710,9 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
17471710
Some(&self.common_members),
17481711
);
17491712

1713+
let (size, align) =
1714+
cx.size_and_align_of(dataful_variant_layout.field(cx, tag_field).ty);
1715+
17501716
vec![
17511717
MemberDescription {
17521718
// Name the dataful variant so that we can identify it for natvis
@@ -1760,11 +1726,11 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
17601726
source_info: variant_info.source_info(cx),
17611727
},
17621728
MemberDescription {
1763-
name: "discriminant$".into(),
1764-
type_metadata: variant_metadata,
1765-
offset: Size::ZERO,
1766-
size: self.layout.size,
1767-
align: self.layout.align.abi,
1729+
name: "discriminant".into(),
1730+
type_metadata: discr_enum,
1731+
offset: dataful_variant_layout.fields.offset(tag_field),
1732+
size,
1733+
align,
17681734
flags: DIFlags::FlagZero,
17691735
discriminant: None,
17701736
source_info: None,

compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs

+4
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ pub fn push_debuginfo_type_name<'tcx>(
238238
}
239239
}
240240

241+
/// MSVC names enums differently than other platforms so that the debugging visualization
242+
// format (natvis) is able to understand enums and render the active variant correctly in the
243+
// debugger. For more information, look in `src/etc/natvis/intrinsic.natvis` and
244+
// `EnumMemberDescriptionFactor::create_member_descriptions`.
241245
fn msvc_enum_fallback(
242246
tcx: TyCtxt<'tcx>,
243247
ty: Ty<'tcx>,

src/etc/natvis/intrinsic.natvis

+21-20
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@
150150
</Expand>
151151
</Type>
152152
<Type Name="enum$&lt;*&gt;">
153-
<Intrinsic Name="tag" Expression="Variant0.variant$" />
153+
<Intrinsic Name="tag" Expression="variant0.variant$" />
154154
<DisplayString Condition="tag() == 0">{tag(),en}</DisplayString>
155155
<DisplayString Condition="tag() == 1" Optional="true">{tag(),en}</DisplayString>
156156
<DisplayString Condition="tag() == 2" Optional="true">{tag(),en}</DisplayString>
@@ -169,31 +169,32 @@
169169
<DisplayString Condition="tag() == 15" Optional="true">{tag(),en}</DisplayString>
170170

171171
<Expand>
172-
<ExpandedItem Condition="tag() == 0">Variant0</ExpandedItem>
173-
<ExpandedItem Condition="tag() == 1" Optional="true">Variant1</ExpandedItem>
174-
<ExpandedItem Condition="tag() == 2" Optional="true">Variant2</ExpandedItem>
175-
<ExpandedItem Condition="tag() == 3" Optional="true">Variant3</ExpandedItem>
176-
<ExpandedItem Condition="tag() == 4" Optional="true">Variant4</ExpandedItem>
177-
<ExpandedItem Condition="tag() == 5" Optional="true">Variant5</ExpandedItem>
178-
<ExpandedItem Condition="tag() == 6" Optional="true">Variant6</ExpandedItem>
179-
<ExpandedItem Condition="tag() == 7" Optional="true">Variant7</ExpandedItem>
180-
<ExpandedItem Condition="tag() == 8" Optional="true">Variant8</ExpandedItem>
181-
<ExpandedItem Condition="tag() == 9" Optional="true">Variant9</ExpandedItem>
182-
<ExpandedItem Condition="tag() == 10" Optional="true">Variant10</ExpandedItem>
183-
<ExpandedItem Condition="tag() == 11" Optional="true">Variant11</ExpandedItem>
184-
<ExpandedItem Condition="tag() == 12" Optional="true">Variant12</ExpandedItem>
185-
<ExpandedItem Condition="tag() == 13" Optional="true">Variant13</ExpandedItem>
186-
<ExpandedItem Condition="tag() == 14" Optional="true">Variant14</ExpandedItem>
187-
<ExpandedItem Condition="tag() == 15" Optional="true">Variant15</ExpandedItem>
172+
<ExpandedItem Condition="tag() == 0">variant0</ExpandedItem>
173+
<ExpandedItem Condition="tag() == 1" Optional="true">variant1</ExpandedItem>
174+
<ExpandedItem Condition="tag() == 2" Optional="true">variant2</ExpandedItem>
175+
<ExpandedItem Condition="tag() == 3" Optional="true">variant3</ExpandedItem>
176+
<ExpandedItem Condition="tag() == 4" Optional="true">variant4</ExpandedItem>
177+
<ExpandedItem Condition="tag() == 5" Optional="true">variant5</ExpandedItem>
178+
<ExpandedItem Condition="tag() == 6" Optional="true">variant6</ExpandedItem>
179+
<ExpandedItem Condition="tag() == 7" Optional="true">variant7</ExpandedItem>
180+
<ExpandedItem Condition="tag() == 8" Optional="true">variant8</ExpandedItem>
181+
<ExpandedItem Condition="tag() == 9" Optional="true">variant9</ExpandedItem>
182+
<ExpandedItem Condition="tag() == 10" Optional="true">variant10</ExpandedItem>
183+
<ExpandedItem Condition="tag() == 11" Optional="true">variant11</ExpandedItem>
184+
<ExpandedItem Condition="tag() == 12" Optional="true">variant12</ExpandedItem>
185+
<ExpandedItem Condition="tag() == 13" Optional="true">variant13</ExpandedItem>
186+
<ExpandedItem Condition="tag() == 14" Optional="true">variant14</ExpandedItem>
187+
<ExpandedItem Condition="tag() == 15" Optional="true">variant15</ExpandedItem>
188188
</Expand>
189189
</Type>
190190

191-
<!-- $T1 is the name of the enum, $T2 is the low value of the dataful variant tag, $T3 is the high value of the dataful variant tag, $T4 is the name of the dataful variant -->
191+
<!-- $T1 is the name of the enum, $T2 is the low value of the dataful variant tag,
192+
$T3 is the high value of the dataful variant tag, $T4 is the name of the dataful variant -->
192193
<Type Name="enum$&lt;*, *, *, *&gt;">
193-
<Intrinsic Name="tag" Expression="discriminant$.discriminant" />
194+
<Intrinsic Name="tag" Expression="discriminant" />
194195
<Intrinsic Name="is_dataful" Expression="tag() &gt;= $T2 &amp;&amp; tag() &lt;= $T3" />
195196
<DisplayString Condition="is_dataful()">{"$T4",sb}({dataful_variant})</DisplayString>
196-
<DisplayString Condition="!is_dataful()">{discriminant$.discriminant,en}</DisplayString>
197+
<DisplayString Condition="!is_dataful()">{discriminant,en}</DisplayString>
197198
<Expand>
198199
<ExpandedItem Condition="is_dataful()">dataful_variant</ExpandedItem>
199200
<Synthetic Condition="is_dataful()" Name="[variant]">

src/test/debuginfo/msvc-pretty-enums.rs

+8-16
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,43 @@
1111
// cdb-check:a,! [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>]
1212
// cdb-check: [+0x000] dataful_variant [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::Some]
1313
// cdb-check: [+0x000] __0 : Low (0x2) [Type: msvc_pretty_enums::CStyleEnum]
14-
// cdb-check: [+0x000] discriminant$ [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::discriminant$]
15-
// cdb-check: [+0x000] discriminant : 0x2 [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::tag$]
14+
// cdb-check: [+0x000] discriminant : 0x2 [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::Discriminant$]
1615

1716
// cdb-command: dx -r2 b,!
1817
// cdb-check:b,! [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>]
1918
// cdb-check: [+0x000] dataful_variant [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::Some]
2019
// cdb-check: [+0x000] __0 : 0x11 [Type: msvc_pretty_enums::CStyleEnum]
21-
// cdb-check: [+0x000] discriminant$ [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::discriminant$]
22-
// cdb-check: [+0x000] discriminant : None (0x11) [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::tag$]
20+
// cdb-check: [+0x000] discriminant : None (0x11) [Type: enum$<core::option::Option<enum$<msvc_pretty_enums::CStyleEnum>>, 2, 16, Some>::Discriminant$]
2321

2422
// cdb-command: dx -r2 c,!
2523
// cdb-check:c,! [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>]
2624
// cdb-check: [+0x000] dataful_variant [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Data]
2725
// cdb-check: [+0x000] my_data : 0x11 [Type: msvc_pretty_enums::CStyleEnum]
28-
// cdb-check: [+0x000] discriminant$ [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::discriminant$]
29-
// cdb-check: [+0x000] discriminant : Tag1 (0x11) [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::tag$]
26+
// cdb-check: [+0x000] discriminant : Tag1 (0x11) [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Discriminant$]
3027

3128
// cdb-command: dx -r2 d,!
3229
// cdb-check:d,! [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>]
3330
// cdb-check: [+0x000] dataful_variant [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Data]
3431
// cdb-check: [+0x000] my_data : High (0x10) [Type: msvc_pretty_enums::CStyleEnum]
35-
// cdb-check: [+0x000] discriminant$ [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::discriminant$]
36-
// cdb-check: [+0x000] discriminant : 0x10 [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::tag$]
32+
// cdb-check: [+0x000] discriminant : 0x10 [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Discriminant$]
3733

3834
// cdb-command: dx -r2 e,!
3935
// cdb-check:e,! [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>]
4036
// cdb-check: [+0x000] dataful_variant [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Data]
4137
// cdb-check: [+0x000] my_data : 0x13 [Type: msvc_pretty_enums::CStyleEnum]
42-
// cdb-check: [+0x000] discriminant$ [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::discriminant$]
43-
// cdb-check: [+0x000] discriminant : Tag2 (0x13) [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::tag$]
38+
// cdb-check: [+0x000] discriminant : Tag2 (0x13) [Type: enum$<msvc_pretty_enums::NicheLayoutEnum, 2, 16, Data>::Discriminant$]
4439

4540
// cdb-command: dx -r2 f,!
4641
// cdb-check:f,! [Type: enum$<core::option::Option<u32*>, 1, [...], Some>]
4742
// cdb-check: [+0x000] dataful_variant [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::Some]
4843
// cdb-check: [+0x000] __0 : 0x[...] : 0x1 [Type: unsigned int *]
49-
// cdb-check: [+0x000] discriminant$ [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::discriminant$]
50-
// cdb-check: [+0x000] discriminant : 0x[...] [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::tag$]
44+
// cdb-check: [+0x000] discriminant : 0x[...] [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::Discriminant$]
5145

5246
// cdb-command: dx -r2 g,!
5347
// cdb-check:g,! [Type: enum$<core::option::Option<u32*>, 1, [...], Some>]
5448
// cdb-check: [+0x000] dataful_variant [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::Some]
5549
// cdb-check: [+0x000] __0 : 0x0 [Type: unsigned int *]
56-
// cdb-check: [+0x000] discriminant$ [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::discriminant$]
57-
// cdb-check: [+0x000] discriminant : None (0x0) [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::tag$]
50+
// cdb-check: [+0x000] discriminant : None (0x0) [Type: enum$<core::option::Option<u32*>, 1, [...], Some>::Discriminant$]
5851

5952
// cdb-command: dx h
6053
// cdb-check:h : Some [Type: enum$<core::option::Option<u32>>]
@@ -72,8 +65,7 @@
7265
// cdb-check:k,! [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>]
7366
// cdb-check: [+0x000] dataful_variant [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>::Some]
7467
// cdb-check: [+0x000] __0 [Type: alloc::string::String]
75-
// cdb-check: [+0x000] discriminant$ [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>::discriminant$]
76-
// cdb-check: [+0x000] discriminant : 0x[...] [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>::tag$]
68+
// cdb-check: [+0x000] discriminant : 0x[...] [Type: enum$<core::option::Option<alloc::string::String>, 1, [...], Some>::Discriminant$]
7769

7870
pub enum CStyleEnum {
7971
Low = 2,

0 commit comments

Comments
 (0)