[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