]> git.lizzy.rs Git - rust.git/commitdiff
Make generator object debuginfo easier to read
authorTyler Mandry <tmandry@gmail.com>
Thu, 18 Apr 2019 00:46:40 +0000 (17:46 -0700)
committerTyler Mandry <tmandry@gmail.com>
Thu, 25 Apr 2019 17:28:09 +0000 (10:28 -0700)
src/librustc_codegen_llvm/debuginfo/metadata.rs
src/test/debuginfo/generator-objects.rs

index 0b1ac1ad788660e66c2e1cd66870ed1642d684bd..85f38912d3d76f756b8b992fa3c5995d1cbf9876 100644 (file)
@@ -1333,7 +1333,7 @@ fn create_member_descriptions(&self, cx: &CodegenCx<'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 @@ fn create_member_descriptions(&self, cx: &CodegenCx<'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 @@ fn compute_field_path<'a, 'tcx>(cx: &CodegenCx<'a, '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 @@ fn compute_field_path<'a, 'tcx>(cx: &CodegenCx<'a, '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<R>(&self, f: impl FnOnce(&str) -> R) -> R {
+    fn map_struct_name<R>(&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 @@ fn map_name<R>(&self, f: impl FnOnce(&str) -> R) -> R {
         }
     }
 
-    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(
index a7c1ac1e902bdbf3b95af1c42db19f339bf4e864..b2837f42f94c749ade80adf0c11b994412216234 100644 (file)
 
 // gdb-command:run
 // gdb-command:print b
-// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__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[...], <<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 ([...])}}
 // gdb-command:continue
 // gdb-command:print b
-// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__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[...], <<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 ([...])}}
 // gdb-command:continue
 // gdb-command:print b
-// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__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[...], <<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)}}
 // gdb-command:continue
 // gdb-command:print b
-// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__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[...], <<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 ([...])}}
 
 // === LLDB TESTS ==================================================================================