[llvm] 91bd9db - [DebugInfo] Allow GNU macro extension to be read
David Stenberg via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 04:31:23 PDT 2020
Author: David Stenberg
Date: 2020-08-11T13:30:52+02:00
New Revision: 91bd9db2cdbc12176c3a058d407ef58ced30ea23
URL: https://github.com/llvm/llvm-project/commit/91bd9db2cdbc12176c3a058d407ef58ced30ea23
DIFF: https://github.com/llvm/llvm-project/commit/91bd9db2cdbc12176c3a058d407ef58ced30ea23.diff
LOG: [DebugInfo] Allow GNU macro extension to be read
Allow the GNU .debug_macro extension to be parsed and printed by
llvm-dwarfdump. In an upcoming patch support will be added for emitting
that format also.
Reviewed By: dblaikie
Differential Revision: https://reviews.llvm.org/D82974
Added:
llvm/test/DebugInfo/X86/debug-macro-gnu.s
Modified:
llvm/include/llvm/BinaryFormat/Dwarf.h
llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
llvm/lib/BinaryFormat/Dwarf.cpp
llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.h b/llvm/include/llvm/BinaryFormat/Dwarf.h
index caa404e8354a..bcc447a84a4d 100644
--- a/llvm/include/llvm/BinaryFormat/Dwarf.h
+++ b/llvm/include/llvm/BinaryFormat/Dwarf.h
@@ -480,6 +480,7 @@ StringRef LNStandardString(unsigned Standard);
StringRef LNExtendedString(unsigned Encoding);
StringRef MacinfoString(unsigned Encoding);
StringRef MacroString(unsigned Encoding);
+StringRef GnuMacroString(unsigned Encoding);
StringRef RangeListEncodingString(unsigned Encoding);
StringRef LocListEncodingString(unsigned Encoding);
StringRef CallFrameString(unsigned Encoding, Triple::ArchType Arch);
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
index 4d463d8fe6f5..1c6682ad4d9a 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
@@ -96,6 +96,9 @@ class DWARFDebugMacro {
MacroHeader Header;
SmallVector<Entry, 4> Macros;
uint64_t Offset;
+
+ /// Whether or not this is a .debug_macro section.
+ bool IsDebugMacro;
};
/// A list of all the macro entries in the debug_macinfo section.
diff --git a/llvm/lib/BinaryFormat/Dwarf.cpp b/llvm/lib/BinaryFormat/Dwarf.cpp
index a497c16685c1..a35ef611ae2e 100644
--- a/llvm/lib/BinaryFormat/Dwarf.cpp
+++ b/llvm/lib/BinaryFormat/Dwarf.cpp
@@ -488,6 +488,17 @@ StringRef llvm::dwarf::MacroString(unsigned Encoding) {
}
}
+StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) {
+ switch (Encoding) {
+ default:
+ return StringRef();
+#define HANDLE_DW_MACRO_GNU(ID, NAME) \
+ case DW_MACRO_GNU_##NAME: \
+ return "DW_MACRO_GNU_" #NAME;
+#include "llvm/BinaryFormat/Dwarf.def"
+ }
+}
+
unsigned llvm::dwarf::getMacro(StringRef MacroString) {
return StringSwitch<unsigned>(MacroString)
#define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
index f920d69cc43f..70e352b1a139 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
@@ -40,7 +40,7 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const {
unsigned IndLevel = 0;
for (const auto &Macros : MacroLists) {
OS << format("0x%08" PRIx64 ":\n", Macros.Offset);
- if (Macros.Header.Version >= 5)
+ if (Macros.IsDebugMacro)
Macros.Header.dumpMacroHeader(OS);
for (const Entry &E : Macros.Macros) {
// There should not be DW_MACINFO_end_file when IndLevel is Zero. However,
@@ -52,8 +52,10 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const {
OS << " ";
IndLevel += (E.Type == DW_MACINFO_start_file);
// Based on which version we are handling choose appropriate macro forms.
- if (Macros.Header.Version >= 5)
- WithColor(OS, HighlightColor::Macro).get() << MacroString(E.Type);
+ if (Macros.IsDebugMacro)
+ WithColor(OS, HighlightColor::Macro).get()
+ << (Macros.Header.Version < 5 ? GnuMacroString(E.Type)
+ : MacroString(E.Type));
else
WithColor(OS, HighlightColor::Macro).get() << MacinfoString(E.Type);
switch (E.Type) {
@@ -67,6 +69,9 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const {
// DW_MACRO_start_file == DW_MACINFO_start_file
// DW_MACRO_end_file == DW_MACINFO_end_file
// For readability/uniformity we are using DW_MACRO_*.
+ //
+ // The GNU .debug_macro extension's entries have the same encoding
+ // as DWARF 5's DW_MACRO_* entries, so we only use the latter here.
case DW_MACRO_define:
case DW_MACRO_undef:
case DW_MACRO_define_strp:
@@ -118,6 +123,7 @@ Error DWARFDebugMacro::parseImpl(
MacroLists.emplace_back();
M = &MacroLists.back();
M->Offset = Offset;
+ M->IsDebugMacro = IsMacro;
if (IsMacro) {
auto Err = M->Header.parseMacroHeader(Data, &Offset);
if (Err)
diff --git a/llvm/test/DebugInfo/X86/debug-macro-gnu.s b/llvm/test/DebugInfo/X86/debug-macro-gnu.s
new file mode 100644
index 000000000000..dc75816af610
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macro-gnu.s
@@ -0,0 +1,59 @@
+## This test checks that llvm-dwarfdump can dump a .debug_macro section
+## with the GNU extension format.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %s -o -| \
+# RUN: llvm-dwarfdump -debug-macro - | FileCheck -strict-whitespace -match-full-lines %s
+
+# CHECK:.debug_macro contents:
+# CHECK-NEXT:0x00000000:
+# CHECK-NEXT:macro header: version = 0x0004, flags = 0x02, format = DWARF32, debug_line_offset = 0x00000000
+# CHECK-NEXT:DW_MACRO_GNU_start_file - lineno: 0 filenum: 0
+# CHECK-NEXT: DW_MACRO_GNU_start_file - lineno: 1 filenum: 6
+# CHECK-NEXT: DW_MACRO_GNU_define_indirect - lineno: 1 macro: FOO 5
+# CHECK-NEXT: DW_MACRO_GNU_end_file
+# CHECK-NEXT: DW_MACRO_GNU_undef_indirect - lineno: 8 macro: WORLD1
+# CHECK-NEXT: DW_MACRO_GNU_transparent_include - import offset: 0x[[OFFSET:[0-9]+]]
+# CHECK-NEXT:DW_MACRO_GNU_end_file
+
+# CHECK:0x[[OFFSET]]:
+# CHECK-NEXT:macro header: version = 0x0004, flags = 0x00, format = DWARF32
+# CHECK-NEXT:DW_MACRO_GNU_define_indirect - lineno: 0 macro: WORLD 2
+
+ .section .debug_macro,"", at progbits
+.Lcu_macro_begin0:
+ .short 4 # Macro information version
+ .byte 2 # Flags: 32 bit, debug_line_offset present
+ .long 0 # debug_line_offset
+ .byte 3 # DW_MACRO_GNU_start_file
+ .byte 0 # Line Number
+ .byte 0 # File Number
+ .byte 3 # DW_MACRO_GNU_start_file
+ .byte 1 # Line Number
+ .byte 6 # File Number
+ .byte 5 # DW_MACRO_GNU_define_indirect
+ .byte 1 # Line Number
+ .long .Linfo_string0 # Macro String
+ .byte 4 # DW_MACRO_GNU_end_file
+ .byte 6 # DW_MACRO_GNU_undef_indirect
+ .byte 8 # Line Number
+ .long .Linfo_string1 # Macro String
+ .byte 7 # DW_MACRO_GNU_transparent_include
+ .long .Lmacro1 # Macro Unit Offset
+ .byte 4 # DW_MACRO_GNU_end_file
+ .byte 0 # End Of Macro List Mark
+
+.Lmacro1:
+ .short 4 # Macro information version
+ .byte 0 # Flags: 32 bit
+ .byte 5 # DW_MACRO_GNU_define_indirect
+ .byte 0 # Line Number
+ .long .Linfo_string2 # Macro String
+ .byte 0 # End Of Macro List Mark
+
+ .section .debug_str,"MS", at progbits,1
+.Linfo_string0:
+ .asciz "FOO 5"
+.Linfo_string1:
+ .asciz "WORLD1"
+.Linfo_string2:
+ .asciz "WORLD 2"
More information about the llvm-commits
mailing list