Skip to content

Commit 060deec

Browse files
committed
Move outer fields of enums into variant parts in debuginfo
All fields except the discriminant (including `outer_fields`) should be put into structures inside the variant part, which gives an equivalent layout but offers us much better integration with debuggers.
1 parent a45f0d7 commit 060deec

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

+26-5
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ impl RecursiveTypeDescription<'ll, 'tcx> {
309309
unfinished_type,
310310
member_holding_stub,
311311
member_descriptions,
312+
None,
312313
);
313314
MetadataCreationResult::new(metadata_stub, true)
314315
}
@@ -1459,6 +1460,7 @@ struct EnumMemberDescriptionFactory<'ll, 'tcx> {
14591460
layout: TyAndLayout<'tcx>,
14601461
tag_type_metadata: Option<&'ll DIType>,
14611462
containing_scope: &'ll DIScope,
1463+
common_members: Vec<Option<&'ll DIType>>,
14621464
span: Span,
14631465
}
14641466

@@ -1523,6 +1525,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15231525
self.enum_type,
15241526
variant_type_metadata,
15251527
member_descriptions,
1528+
Some(&self.common_members),
15261529
);
15271530
vec![MemberDescription {
15281531
name: if fallback { String::new() } else { variant_info.variant_name() },
@@ -1572,6 +1575,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
15721575
self.enum_type,
15731576
variant_type_metadata,
15741577
member_descriptions,
1578+
Some(&self.common_members),
15751579
);
15761580

15771581
MemberDescription {
@@ -1621,6 +1625,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16211625
self.enum_type,
16221626
variant_type_metadata,
16231627
variant_member_descriptions,
1628+
Some(&self.common_members),
16241629
);
16251630

16261631
// Encode the information about the null variant in the union
@@ -1695,6 +1700,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
16951700
self.enum_type,
16961701
variant_type_metadata,
16971702
member_descriptions,
1703+
Some(&self.common_members),
16981704
);
16991705

17001706
let niche_value = if i == dataful_variant {
@@ -2102,6 +2108,7 @@ fn prepare_enum_metadata(
21022108
layout,
21032109
tag_type_metadata: discriminant_type_metadata,
21042110
containing_scope,
2111+
common_members: vec![],
21052112
span,
21062113
}),
21072114
);
@@ -2171,7 +2178,7 @@ fn prepare_enum_metadata(
21712178
}
21722179
};
21732180

2174-
let mut outer_fields = match layout.variants {
2181+
let outer_fields = match layout.variants {
21752182
Variants::Single { .. } => vec![],
21762183
Variants::Multiple { .. } => {
21772184
let tuple_mdf = TupleMemberDescriptionFactory {
@@ -2210,11 +2217,14 @@ fn prepare_enum_metadata(
22102217
variant_part_unique_type_id_str.len(),
22112218
)
22122219
};
2213-
outer_fields.push(Some(variant_part));
22142220

22152221
let struct_wrapper = {
22162222
// The variant part must be wrapped in a struct according to DWARF.
2217-
let type_array = create_DIArray(DIB(cx), &outer_fields);
2223+
// All fields except the discriminant (including `outer_fields`)
2224+
// should be put into structures inside the variant part, which gives
2225+
// an equivalent layout but offers us much better integration with
2226+
// debuggers.
2227+
let type_array = create_DIArray(DIB(cx), &[Some(variant_part)]);
22182228

22192229
let type_map = debug_context(cx).type_map.borrow();
22202230
let unique_type_id_str = type_map.get_unique_type_id_as_string(unique_type_id);
@@ -2251,6 +2261,7 @@ fn prepare_enum_metadata(
22512261
layout,
22522262
tag_type_metadata: None,
22532263
containing_scope,
2264+
common_members: outer_fields,
22542265
span,
22552266
}),
22562267
)
@@ -2283,7 +2294,13 @@ fn composite_type_metadata(
22832294
DIFlags::FlagZero,
22842295
);
22852296
// ... and immediately create and add the member descriptions.
2286-
set_members_of_composite_type(cx, composite_type, composite_type_metadata, member_descriptions);
2297+
set_members_of_composite_type(
2298+
cx,
2299+
composite_type,
2300+
composite_type_metadata,
2301+
member_descriptions,
2302+
None,
2303+
);
22872304

22882305
composite_type_metadata
22892306
}
@@ -2293,6 +2310,7 @@ fn set_members_of_composite_type(
22932310
composite_type: Ty<'tcx>,
22942311
composite_type_metadata: &'ll DICompositeType,
22952312
member_descriptions: Vec<MemberDescription<'ll>>,
2313+
common_members: Option<&Vec<Option<&'ll DIType>>>,
22962314
) {
22972315
// In some rare cases LLVM metadata uniquing would lead to an existing type
22982316
// description being used instead of a new one created in
@@ -2311,10 +2329,13 @@ fn set_members_of_composite_type(
23112329
}
23122330
}
23132331

2314-
let member_metadata: Vec<_> = member_descriptions
2332+
let mut member_metadata: Vec<_> = member_descriptions
23152333
.into_iter()
23162334
.map(|desc| Some(desc.into_metadata(cx, composite_type_metadata)))
23172335
.collect();
2336+
if let Some(other_members) = common_members {
2337+
member_metadata.extend(other_members.iter());
2338+
}
23182339

23192340
let type_params = compute_type_parameters(cx, composite_type);
23202341
unsafe {

src/test/debuginfo/generator-objects.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@
77

88
// gdb-command:run
99
// gdb-command:print b
10-
// gdb-check:$1 = generator_objects::main::generator-0 {__0: 0x[...], <<variant>>: {__state: 0, 0: generator_objects::main::generator-0::Unresumed, 1: generator_objects::main::generator-0::Returned, 2: generator_objects::main::generator-0::Panicked, 3: generator_objects::main::generator-0::Suspend0 {[...]}, 4: generator_objects::main::generator-0::Suspend1 {[...]}}}
10+
// gdb-check:$1 = <error reading variable>
1111
// gdb-command:continue
1212
// gdb-command:print b
13-
// gdb-check:$2 = generator_objects::main::generator-0 {__0: 0x[...], <<variant>>: {__state: 3, 0: generator_objects::main::generator-0::Unresumed, 1: generator_objects::main::generator-0::Returned, 2: generator_objects::main::generator-0::Panicked, 3: generator_objects::main::generator-0::Suspend0 {c: 6, d: 7}, 4: generator_objects::main::generator-0::Suspend1 {[...]}}}
13+
// gdb-check:$2 = <error reading variable>
1414
// gdb-command:continue
1515
// gdb-command:print b
16-
// gdb-check:$3 = generator_objects::main::generator-0 {__0: 0x[...], <<variant>>: {__state: 4, 0: generator_objects::main::generator-0::Unresumed, 1: generator_objects::main::generator-0::Returned, 2: generator_objects::main::generator-0::Panicked, 3: generator_objects::main::generator-0::Suspend0 {[...]}, 4: generator_objects::main::generator-0::Suspend1 {c: 7, d: 8}}}
16+
// gdb-check:$3 = <error reading variable>
1717
// gdb-command:continue
1818
// gdb-command:print b
19-
// gdb-check:$4 = generator_objects::main::generator-0 {__0: 0x[...], <<variant>>: {__state: 1, 0: generator_objects::main::generator-0::Unresumed, 1: generator_objects::main::generator-0::Returned, 2: generator_objects::main::generator-0::Panicked, 3: generator_objects::main::generator-0::Suspend0 {[...]}, 4: generator_objects::main::generator-0::Suspend1 {[...]}}}
19+
// gdb-check:$4 = <error reading variable>
2020

2121
// === LLDB TESTS ==================================================================================
2222

2323
// lldb-command:run
2424
// lldb-command:print b
25-
// lldbg-check:(generator_objects::main::generator-0) $0 = { 0 = 0x[...] }
25+
// lldbg-check:(generator_objects::main::generator-0) $0 =
2626
// lldb-command:continue
2727
// lldb-command:print b
28-
// lldbg-check:(generator_objects::main::generator-0) $1 = { 0 = 0x[...] }
28+
// lldbg-check:(generator_objects::main::generator-0) $1 =
2929
// lldb-command:continue
3030
// lldb-command:print b
31-
// lldbg-check:(generator_objects::main::generator-0) $2 = { 0 = 0x[...] }
31+
// lldbg-check:(generator_objects::main::generator-0) $2 =
3232
// lldb-command:continue
3333
// lldb-command:print b
34-
// lldbg-check:(generator_objects::main::generator-0) $3 = { 0 = 0x[...] }
34+
// lldbg-check:(generator_objects::main::generator-0) $3 =
3535

3636
#![feature(omit_gdb_pretty_printer_section, generators, generator_trait)]
3737
#![omit_gdb_pretty_printer_section]

src/test/debuginfo/issue-57822.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// gdb-check:$1 = issue_57822::main::closure-1 (issue_57822::main::closure-0 (1))
1515

1616
// gdb-command:print b
17-
// gdb-check:$2 = issue_57822::main::generator-3 {__0: issue_57822::main::generator-2 {__0: 2, <<variant>>: {[...]}}, <<variant>>: {[...]}}
17+
// gdb-check:$2 = <error reading variable>
1818

1919
// === LLDB TESTS ==================================================================================
2020

@@ -24,7 +24,7 @@
2424
// lldbg-check:(issue_57822::main::closure-1) $0 = { 0 = { 0 = 1 } }
2525

2626
// lldb-command:print b
27-
// lldbg-check:(issue_57822::main::generator-3) $1 = { 0 = { 0 = 2 } }
27+
// lldbg-check:(issue_57822::main::generator-3) $1 =
2828

2929
#![feature(omit_gdb_pretty_printer_section, generators, generator_trait)]
3030
#![omit_gdb_pretty_printer_section]

0 commit comments

Comments
 (0)