Skip to content

Commit f353cbf

Browse files
committed
Generate better debuginfo for directly tagged enums
1 parent 1e13a9b commit f353cbf

File tree

5 files changed

+52
-22
lines changed

5 files changed

+52
-22
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15741574

15751575
MemberDescription {
15761576
name: if fallback {
1577-
String::new()
1577+
format!("Variant{}", i.as_u32())
15781578
} else {
15791579
variant_info.variant_name()
15801580
},
@@ -1886,8 +1886,9 @@ fn describe_enum_variant(
18861886
// We have the layout of an enum variant, we need the layout of the outer enum
18871887
let enum_layout = cx.layout_of(layout.ty);
18881888
let offset = enum_layout.fields.offset(tag_field.as_usize());
1889+
let tag_name = if cx.tcx.sess.target.is_like_msvc { "variant$" } else { "RUST$ENUM$DISR" };
18891890
let args =
1890-
("RUST$ENUM$DISR".to_owned(), enum_layout.field(cx, tag_field.as_usize()).ty);
1891+
(tag_name.to_owned(), enum_layout.field(cx, tag_field.as_usize()).ty);
18911892
(Some(offset), Some(args))
18921893
}
18931894
_ => (None, None),
@@ -2062,7 +2063,7 @@ fn prepare_enum_metadata(
20622063
unsafe {
20632064
llvm::LLVMRustDIBuilderCreateUnionType(
20642065
DIB(cx),
2065-
containing_scope,
2066+
None,
20662067
enum_name.as_ptr().cast(),
20672068
enum_name.len(),
20682069
file_metadata,
@@ -2437,7 +2438,7 @@ fn create_union_stub(
24372438

24382439
llvm::LLVMRustDIBuilderCreateUnionType(
24392440
DIB(cx),
2440-
containing_scope,
2441+
Some(containing_scope),
24412442
union_type_name.as_ptr().cast(),
24422443
union_type_name.len(),
24432444
unknown_file_metadata(cx),

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2038,7 +2038,7 @@ extern "C" {
20382038

20392039
pub fn LLVMRustDIBuilderCreateUnionType(
20402040
Builder: &DIBuilder<'a>,
2041-
Scope: &'a DIScope,
2041+
Scope: Option<&'a DIScope>,
20422042
Name: *const c_char,
20432043
NameLen: size_t,
20442044
File: &'a DIFile,

compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,16 @@ pub fn push_debuginfo_type_name<'tcx>(
4545
ty::Float(float_ty) => output.push_str(float_ty.name_str()),
4646
ty::Foreign(def_id) => push_item_name(tcx, def_id, qualified, output),
4747
ty::Adt(def, substs) => {
48+
if def.is_enum() && cpp_like_names {
49+
output.push_str("_enum<");
50+
}
51+
4852
push_item_name(tcx, def.did, qualified, output);
4953
push_type_params(tcx, substs, output, visited);
54+
55+
if def.is_enum() && cpp_like_names {
56+
output.push('>');
57+
}
5058
}
5159
ty::Tuple(component_types) => {
5260
if cpp_like_names {

src/etc/natvis/intrinsic.natvis

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,42 @@
149149
<Synthetic Name="[...]"><DisplayString>...</DisplayString></Synthetic>
150150
</Expand>
151151
</Type>
152+
<Type Name="_enum&lt;*&gt;">
153+
<Intrinsic Name="tag" Expression="Variant0.variant$" />
154+
<DisplayString Condition="tag() == 0">{tag(),en}</DisplayString>
155+
<DisplayString Condition="tag() == 1" Optional="true">{tag(),en}</DisplayString>
156+
<DisplayString Condition="tag() == 2" Optional="true">{tag(),en}</DisplayString>
157+
<DisplayString Condition="tag() == 3" Optional="true">{tag(),en}</DisplayString>
158+
<DisplayString Condition="tag() == 4" Optional="true">{tag(),en}</DisplayString>
159+
<DisplayString Condition="tag() == 5" Optional="true">{tag(),en}</DisplayString>
160+
<DisplayString Condition="tag() == 6" Optional="true">{tag(),en}</DisplayString>
161+
<DisplayString Condition="tag() == 7" Optional="true">{tag(),en}</DisplayString>
162+
<DisplayString Condition="tag() == 8" Optional="true">{tag(),en}</DisplayString>
163+
<DisplayString Condition="tag() == 9" Optional="true">{tag(),en}</DisplayString>
164+
<DisplayString Condition="tag() == 10" Optional="true">{tag(),en}</DisplayString>
165+
<DisplayString Condition="tag() == 11" Optional="true">{tag(),en}</DisplayString>
166+
<DisplayString Condition="tag() == 12" Optional="true">{tag(),en}</DisplayString>
167+
<DisplayString Condition="tag() == 13" Optional="true">{tag(),en}</DisplayString>
168+
<DisplayString Condition="tag() == 14" Optional="true">{tag(),en}</DisplayString>
169+
<DisplayString Condition="tag() == 15" Optional="true">{tag(),en}</DisplayString>
170+
171+
<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>
188+
</Expand>
189+
</Type>
152190
</AutoVisualizer>

src/etc/natvis/libcore.natvis

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,6 @@
1414
</Expand>
1515
</Type>
1616

17-
<Type Name="core::option::Option&lt;*&gt;">
18-
<DisplayString Condition="RUST$ENUM$DISR == 0x0">None</DisplayString>
19-
<DisplayString Condition="RUST$ENUM$DISR == 0x1">Some({__0})</DisplayString>
20-
<Expand>
21-
<Item Name="[value]" ExcludeView="simple" Condition="RUST$ENUM$DISR == 1">__0</Item>
22-
</Expand>
23-
</Type>
24-
2517
<Type Name="core::option::Option&lt;*&gt;" Priority="MediumLow">
2618
<DisplayString Condition="*(void**)this == nullptr">None</DisplayString>
2719
<DisplayString>Some({($T1 *)this})</DisplayString>
@@ -30,15 +22,6 @@
3022
</Expand>
3123
</Type>
3224

33-
<Type Name="core::result::Result&lt;*&gt;">
34-
<DisplayString Condition="RUST$ENUM$DISR == 0x0">Ok({__0})</DisplayString>
35-
<DisplayString Condition="RUST$ENUM$DISR == 0x1">Err({(*($T2*) &amp;__0)})</DisplayString>
36-
<Expand>
37-
<Item Name="[value]" Condition="RUST$ENUM$DISR == 0x0">__0</Item>
38-
<Item Name="[value]" Condition="RUST$ENUM$DISR == 0x1">(*($T2*) &amp;__0)</Item>
39-
</Expand>
40-
</Type>
41-
4225
<Type Name="core::ptr::non_null::NonNull&lt;*&gt;">
4326
<DisplayString>{(void*) pointer}</DisplayString>
4427
<Expand>

0 commit comments

Comments
 (0)