[llvm] 9a15442 - [DWARF DUMP] Fix infinite recursion in Type Printer.

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 26 16:25:18 PDT 2022


Author: Alex Yermolovich
Date: 2022-09-26T16:23:37-07:00
New Revision: 9a1544277e8a9336c98fe8e1f3d6fdde9d2f2bcf

URL: https://github.com/llvm/llvm-project/commit/9a1544277e8a9336c98fe8e1f3d6fdde9d2f2bcf
DIFF: https://github.com/llvm/llvm-project/commit/9a1544277e8a9336c98fe8e1f3d6fdde9d2f2bcf.diff

LOG: [DWARF DUMP] Fix infinite recursion in Type Printer.

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

Added: 
    llvm/test/DebugInfo/X86/dwarfdump-infinite-loop.s

Modified: 
    llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp
index 2d8add64537c3..8664e73623733 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp
@@ -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
index 0000000000000..380f20e48b1d4
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/dwarfdump-infinite-loop.s
@@ -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,"", at 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,"", at 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,"", at 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,"", at progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS", at 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"


        


More information about the llvm-commits mailing list