From 6e2e17d1152d46314b332ecaf11b80786386b919 Mon Sep 17 00:00:00 2001 From: Tyler Mandry Date: Wed, 17 Apr 2019 17:46:40 -0700 Subject: [PATCH] Make generator object debuginfo easier to read --- .../debuginfo/metadata.rs | 25 +++++++++++++------ src/test/debuginfo/generator-objects.rs | 8 +++--- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 0b1ac1ad788..85f38912d3d 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -1333,7 +1333,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { name: if fallback { String::new() } else { - variant_info.name_as_string() + variant_info.variant_name() }, type_metadata: variant_type_metadata, offset: Size::ZERO, @@ -1388,7 +1388,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { name: if fallback { String::new() } else { - variant_info.name_as_string() + variant_info.variant_name() }, type_metadata: variant_type_metadata, offset: Size::ZERO, @@ -1455,7 +1455,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { self.layout, self.layout.fields.offset(discr_index), self.layout.field(cx, discr_index).size); - variant_info_for(*niche_variants.start()).map_name(|variant_name| { + variant_info_for(*niche_variants.start()).map_struct_name(|variant_name| { name.push_str(variant_name); }); @@ -1506,7 +1506,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> { }; MemberDescription { - name: variant_info.name_as_string(), + name: variant_info.variant_name(), type_metadata: variant_type_metadata, offset: Size::ZERO, size: self.layout.size, @@ -1571,7 +1571,7 @@ enum VariantInfo<'tcx> { } impl<'tcx> VariantInfo<'tcx> { - fn map_name(&self, f: impl FnOnce(&str) -> R) -> R { + fn map_struct_name(&self, f: impl FnOnce(&str) -> R) -> R { match self { VariantInfo::Adt(variant) => f(&variant.ident.as_str()), VariantInfo::Generator(substs, variant_index) => @@ -1579,8 +1579,17 @@ impl<'tcx> VariantInfo<'tcx> { } } - fn name_as_string(&self) -> String { - self.map_name(|name| name.to_string()) + fn variant_name(&self) -> String { + match self { + VariantInfo::Adt(variant) => variant.ident.to_string(), + VariantInfo::Generator(_, variant_index) => { + // Since GDB currently prints out the raw discriminant along + // with every variant, make each variant name be just the value + // of the discriminant. The struct name for the variant includes + // the actual variant description. + format!("{}", variant_index.as_usize()).to_string() + } + } } fn field_name(&self, i: usize) -> String { @@ -1604,7 +1613,7 @@ fn describe_enum_variant( containing_scope: &'ll DIScope, span: Span, ) -> (&'ll DICompositeType, MemberDescriptionFactory<'ll, 'tcx>) { - let metadata_stub = variant.map_name(|variant_name| { + let metadata_stub = variant.map_struct_name(|variant_name| { let unique_type_id = debug_context(cx).type_map .borrow_mut() .get_unique_type_id_of_enum_variant( diff --git a/src/test/debuginfo/generator-objects.rs b/src/test/debuginfo/generator-objects.rs index a7c1ac1e902..b2837f42f94 100644 --- a/src/test/debuginfo/generator-objects.rs +++ b/src/test/debuginfo/generator-objects.rs @@ -10,16 +10,16 @@ // gdb-command:run // gdb-command:print b -// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <>: {__state: 0, Unresumed: generator_objects::main::generator::Unresumed, Returned: generator_objects::main::generator::Returned, Panicked: generator_objects::main::generator::Panicked, variant#3: generator_objects::main::generator::variant#3 ([...]), variant#4: generator_objects::main::generator::variant#4 ([...])}} +// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <>: {__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 ([...])}} // gdb-command:continue // gdb-command:print b -// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <>: {__state: 3, Unresumed: generator_objects::main::generator::Unresumed, Returned: generator_objects::main::generator::Returned, Panicked: generator_objects::main::generator::Panicked, variant#3: generator_objects::main::generator::variant#3 (6, 7), variant#4: generator_objects::main::generator::variant#4 ([...])}} +// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <>: {__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 ([...])}} // gdb-command:continue // gdb-command:print b -// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <>: {__state: 4, Unresumed: generator_objects::main::generator::Unresumed, Returned: generator_objects::main::generator::Returned, Panicked: generator_objects::main::generator::Panicked, variant#3: generator_objects::main::generator::variant#3 ([...]), variant#4: generator_objects::main::generator::variant#4 (7, 8)}} +// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <>: {__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)}} // gdb-command:continue // gdb-command:print b -// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <>: {__state: 1, Unresumed: generator_objects::main::generator::Unresumed, Returned: generator_objects::main::generator::Returned, Panicked: generator_objects::main::generator::Panicked, variant#3: generator_objects::main::generator::variant#3 ([...]), variant#4: generator_objects::main::generator::variant#4 ([...])}} +// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <>: {__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 ([...])}} // === LLDB TESTS ==================================================================================