[DWARF DUMP] Fix infinite recursion in Type Printer.
authorAlex Yermolovich <ayermolo@fb.com>
Mon, 26 Sep 2022 23:23:37 +0000 (16:23 -0700)
committerAlexander Yermolovich <ayermolo@fb.com>
Mon, 26 Sep 2022 23:23:37 +0000 (16:23 -0700)
There is an implicit circular dependency in a debug information coming from GCC.
This results in a coredump.
It tries to resolve scope for DIE TAGs that are scopeless.

Reviewed By: dblaikie

Differential Revision: https://reviews.llvm.org/D132900

llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp
llvm/test/DebugInfo/X86/dwarfdump-infinite-loop.s [new file with mode: 0644]

index 2d8add6..8664e73 100644 (file)
@@ -282,13 +282,27 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter(
   }
 }
 
+/// Returns True if the DIE TAG is one of the ones that is scopped.
+static bool scopedTAGs(dwarf::Tag Tag) {
+  switch (Tag) {
+  case dwarf::DW_TAG_structure_type:
+  case dwarf::DW_TAG_class_type:
+  case dwarf::DW_TAG_union_type:
+  case dwarf::DW_TAG_namespace:
+  case dwarf::DW_TAG_enumeration_type:
+    return true;
+  default:
+    break;
+  }
+  return false;
+}
 void DWARFTypePrinter::appendQualifiedName(DWARFDie D) {
-  if (D)
+  if (D && scopedTAGs(D.getTag()))
     appendScopes(D.getParent());
   appendUnqualifiedName(D);
 }
 DWARFDie DWARFTypePrinter::appendQualifiedNameBefore(DWARFDie D) {
-  if (D)
+  if (D && scopedTAGs(D.getTag()))
     appendScopes(D.getParent());
   return appendUnqualifiedNameBefore(D);
 }
diff --git a/llvm/test/DebugInfo/X86/dwarfdump-infinite-loop.s b/llvm/test/DebugInfo/X86/dwarfdump-infinite-loop.s
new file mode 100644 (file)
index 0000000..380f20e
--- /dev/null
@@ -0,0 +1,224 @@
+# Test object to verify that dwarfdump does not go into infinite recursion due
+# to trying to print fully resolved name.
+# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o
+# RUN: llvm-dwarfdump --debug-info=0x62 %t.o | FileCheck %s
+
+# CHECK: DW_TAG_formal_parameter
+# CHECK-NEXT: DW_AT_type
+# CHECK-SAME: "t2 *"
+
+# gcc -g -gdwarf-4 -std=gnu++17 -c -gz=none -S reproSmall.cpp -o reproSmall.s
+# struct t1;
+# void f1() {
+#   using t2 = t1;
+#   void (t2::* __fn)();
+# }
+
+.section       .debug_info,"",@progbits
+.Ldebug_info0:
+       .long   0x88
+       .value  0x4
+       .long   .Ldebug_abbrev0
+       .byte   0x8
+       .uleb128 0x1
+       .long   .LASF0
+       .byte   0x4
+       .long   .LASF1
+       .long   .LASF2
+       .quad   0
+       .quad   0
+       .long   .Ldebug_line0
+       .uleb128 0x2
+       .string "f1"
+       .byte   0x1
+       .byte   0x3
+       .byte   0x6
+       .long   .LASF3
+       .quad   0
+       .quad   0
+       .uleb128 0x1
+       .byte   0x9c
+       .long   0x87
+       .uleb128 0x3
+       .string "t2"
+       .byte   0x1
+       .byte   0x4
+       .byte   0x9
+       .long   0x87
+       .uleb128 0x4
+       .long   0x62
+       .long   0x6e
+       .uleb128 0x5
+       .long   0x67
+       .uleb128 0x6
+       .byte   0x8
+       .long   0x4e
+       .byte   0
+       .uleb128 0x7
+       .long   0x87
+       .long   0x59
+       .uleb128 0x8
+       .long   .LASF4
+       .byte   0x1
+       .byte   0x5
+       .byte   0xf
+       .long   0x6e
+       .uleb128 0x2
+       .byte   0x91
+       .sleb128 -32
+       .byte   0
+       .uleb128 0x9
+       .string "t1"
+       .byte   0
+       .section        .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+       .uleb128 0x1
+       .uleb128 0x11
+       .byte   0x1
+       .uleb128 0x25
+       .uleb128 0xe
+       .uleb128 0x13
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x1b
+       .uleb128 0xe
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x7
+       .uleb128 0x10
+       .uleb128 0x17
+       .byte   0
+       .byte   0
+       .uleb128 0x2
+       .uleb128 0x2e
+       .byte   0x1
+       .uleb128 0x3f
+       .uleb128 0x19
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x39
+       .uleb128 0xb
+       .uleb128 0x6e
+       .uleb128 0xe
+       .uleb128 0x11
+       .uleb128 0x1
+       .uleb128 0x12
+       .uleb128 0x7
+       .uleb128 0x40
+       .uleb128 0x18
+       .uleb128 0x2117
+       .uleb128 0x19
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0x16
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x39
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0
+       .byte   0
+       .uleb128 0x4
+       .uleb128 0x15
+       .byte   0x1
+       .uleb128 0x64
+       .uleb128 0x13
+       .uleb128 0x1
+       .uleb128 0x13
+       .byte   0
+       .byte   0
+       .uleb128 0x5
+       .uleb128 0x5
+       .byte   0
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x34
+       .uleb128 0x19
+       .byte   0
+       .byte   0
+       .uleb128 0x6
+       .uleb128 0xf
+       .byte   0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0
+       .byte   0
+       .uleb128 0x7
+       .uleb128 0x1f
+       .byte   0
+       .uleb128 0x1d
+       .uleb128 0x13
+       .uleb128 0x49
+       .uleb128 0x13
+       .byte   0
+       .byte   0
+       .uleb128 0x8
+       .uleb128 0x34
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0xe
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x39
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x2
+       .uleb128 0x18
+       .byte   0
+       .byte   0
+       .uleb128 0x9
+       .uleb128 0x13
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3c
+       .uleb128 0x19
+       .byte   0
+       .byte   0
+       .byte   0
+       .section        .debug_aranges,"",@progbits
+       .long   0x2c
+       .value  0x2
+       .long   .Ldebug_info0
+       .byte   0x8
+       .byte   0
+       .value  0
+       .value  0
+       .quad   0
+       .quad   0
+       .quad   0
+       .quad   0
+       .section        .debug_line,"",@progbits
+.Ldebug_line0:
+       .section        .debug_str,"MS",@progbits,1
+.LASF0:
+       .string "GNU C++17 11.x -mtune=generic -march=x86-64 -g -gdwarf-4 -gz=none -std=gnu++17"
+.LASF4:
+       .string "__fn"
+.LASF2:
+       .string "."
+.LASF1:
+       .string "reproSmall.cpp"
+.LASF3:
+       .string "_Z2f1v"
+       .ident  "GCC: (GNU) 11.x"