Skip to content

Commit f772c39

Browse files
committed
Include generator locals as field names in debuginfo
1 parent 6e2e17d commit f772c39

File tree

3 files changed

+22
-13
lines changed

3 files changed

+22
-13
lines changed

src/librustc/mir/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2997,7 +2997,7 @@ pub struct UnsafetyCheckResult {
29972997
/// The layout of generator state
29982998
#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
29992999
pub struct GeneratorLayout<'tcx> {
3000-
pub variant_fields: Vec<Vec<LocalDecl<'tcx>>>,
3000+
pub variant_fields: IndexVec<VariantIdx, Vec<LocalDecl<'tcx>>>,
30013001
}
30023002

30033003
#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]

src/librustc_codegen_llvm/debuginfo/metadata.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use rustc::hir::def::CtorKind;
2323
use rustc::hir::def_id::{DefId, CrateNum, LOCAL_CRATE};
2424
use rustc::ich::NodeIdHashingMode;
2525
use rustc::mir::Field;
26+
use rustc::mir::GeneratorLayout;
2627
use rustc::mir::interpret::truncate;
2728
use rustc_data_structures::fingerprint::Fingerprint;
2829
use rustc::ty::Instance;
@@ -1291,7 +1292,10 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
12911292
let variant_info_for = |index: VariantIdx| {
12921293
match &self.enum_type.sty {
12931294
ty::Adt(adt, _) => VariantInfo::Adt(&adt.variants[index]),
1294-
ty::Generator(_, substs, _) => VariantInfo::Generator(*substs, index),
1295+
ty::Generator(def_id, substs, _) => {
1296+
let generator_layout = cx.tcx.generator_layout(*def_id);
1297+
VariantInfo::Generator(*substs, generator_layout, index)
1298+
}
12951299
_ => bug!(),
12961300
}
12971301
};
@@ -1567,22 +1571,22 @@ enum EnumDiscriminantInfo<'ll> {
15671571
#[derive(Copy, Clone)]
15681572
enum VariantInfo<'tcx> {
15691573
Adt(&'tcx ty::VariantDef),
1570-
Generator(ty::GeneratorSubsts<'tcx>, VariantIdx),
1574+
Generator(ty::GeneratorSubsts<'tcx>, &'tcx GeneratorLayout<'tcx>, VariantIdx),
15711575
}
15721576

15731577
impl<'tcx> VariantInfo<'tcx> {
15741578
fn map_struct_name<R>(&self, f: impl FnOnce(&str) -> R) -> R {
15751579
match self {
15761580
VariantInfo::Adt(variant) => f(&variant.ident.as_str()),
1577-
VariantInfo::Generator(substs, variant_index) =>
1581+
VariantInfo::Generator(substs, _, variant_index) =>
15781582
substs.map_variant_name(*variant_index, f),
15791583
}
15801584
}
15811585

15821586
fn variant_name(&self) -> String {
15831587
match self {
15841588
VariantInfo::Adt(variant) => variant.ident.to_string(),
1585-
VariantInfo::Generator(_, variant_index) => {
1589+
VariantInfo::Generator(_, _, variant_index) => {
15861590
// Since GDB currently prints out the raw discriminant along
15871591
// with every variant, make each variant name be just the value
15881592
// of the discriminant. The struct name for the variant includes
@@ -1593,11 +1597,16 @@ impl<'tcx> VariantInfo<'tcx> {
15931597
}
15941598

15951599
fn field_name(&self, i: usize) -> String {
1596-
match self {
1600+
let field_name = match self {
15971601
VariantInfo::Adt(variant) if variant.ctor_kind != CtorKind::Fn =>
1598-
variant.fields[i].ident.to_string(),
1599-
_ => format!("__{}", i),
1600-
}
1602+
Some(variant.fields[i].ident.to_string()),
1603+
VariantInfo::Generator(_, generator_layout, variant_index) => {
1604+
let variant_decls = &generator_layout.variant_fields[*variant_index];
1605+
variant_decls[i].name.map(|name| name.to_string())
1606+
}
1607+
_ => None,
1608+
};
1609+
field_name.unwrap_or_else(|| format!("__{}", i))
16011610
}
16021611
}
16031612

src/test/debuginfo/generator-objects.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010

1111
// gdb-command:run
1212
// gdb-command:print b
13-
// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 0, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 ([...]), 4: generator_objects::main::generator::variant#4 ([...])}}
13+
// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 0, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {[...]}}}
1414
// gdb-command:continue
1515
// gdb-command:print b
16-
// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 3, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 (6, 7), 4: generator_objects::main::generator::variant#4 ([...])}}
16+
// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 3, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {c: 6, d: 7}, 4: generator_objects::main::generator::variant#4 {[...]}}}
1717
// gdb-command:continue
1818
// gdb-command:print b
19-
// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 4, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 ([...]), 4: generator_objects::main::generator::variant#4 (7, 8)}}
19+
// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 4, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {c: 7, d: 8}}}
2020
// gdb-command:continue
2121
// gdb-command:print b
22-
// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 1, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 ([...]), 4: generator_objects::main::generator::variant#4 ([...])}}
22+
// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 1, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {[...]}}}
2323

2424
// === LLDB TESTS ==================================================================================
2525

0 commit comments

Comments
 (0)