[llvm] 93aee9c - [DWARF5]: Added support for dumping strx forms in llvm-dwarfdump

Sourabh Singh Tomar via llvm-commits llvm-commits at lists.llvm.org
Mon May 11 21:59:47 PDT 2020


Author: Sourabh Singh Tomar
Date: 2020-05-12T10:29:18+05:30
New Revision: 93aee9ca8698111b2df2fda2a1a5a2f3ce4fc014

URL: https://github.com/llvm/llvm-project/commit/93aee9ca8698111b2df2fda2a1a5a2f3ce4fc014
DIFF: https://github.com/llvm/llvm-project/commit/93aee9ca8698111b2df2fda2a1a5a2f3ce4fc014.diff

LOG: [DWARF5]: Added support for dumping strx forms in llvm-dwarfdump

This patch adds support for dumping DW_MACRO_define_strx,
DW_MACRO_undef_strx in llvm-dwarfdump. These forms are currently
supported only in debug_macro section.

Reviewed By: ikudrin, dblaikie

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

Added: 
    llvm/test/DebugInfo/X86/debug-macinfo-strp.s
    llvm/test/DebugInfo/X86/debug-macinfo-strx.s
    llvm/test/DebugInfo/X86/debug-macro-empty-macro-offset.s
    llvm/test/DebugInfo/X86/debug-macro-empty-str-offset.s
    llvm/test/DebugInfo/X86/debug-macro-multi-cu-strx.s

Modified: 
    llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
    llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
    llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
index f32391b827ab..c3d737ca5239 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugMacro.h
@@ -11,6 +11,7 @@
 
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
+#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/WithColor.h"
@@ -101,13 +102,25 @@ class DWARFDebugMacro {
   /// Print the macro list found within the debug_macinfo/debug_macro section.
   void dump(raw_ostream &OS) const;
 
-  /// Parse the debug_macinfo/debug_macro section accessible via the 'Data'
-  /// parameter.
-  Error parse(DataExtractor StringExtractor, DWARFDataExtractor Data,
-              bool IsMacro);
+  Error parseMacro(DWARFUnitVector::iterator_range Units,
+                   DataExtractor StringExtractor,
+                   DWARFDataExtractor MacroData) {
+    return parseImpl(Units, StringExtractor, MacroData, /*IsMacro=*/true);
+  }
+
+  Error parseMacinfo(DWARFDataExtractor MacroData) {
+    return parseImpl(None, None, MacroData, /*IsMacro=*/false);
+  }
 
   /// Return whether the section has any entries.
   bool empty() const { return MacroLists.empty(); }
+
+private:
+  /// Parse the debug_macinfo/debug_macro section accessible via the 'MacroData'
+  /// parameter.
+  Error parseImpl(Optional<DWARFUnitVector::iterator_range> Units,
+                  Optional<DataExtractor> StringExtractor,
+                  DWARFDataExtractor Data, bool IsMacro);
 };
 
 } // end namespace llvm

diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
index 052b693f2167..b3de75b501bb 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -263,7 +263,10 @@ std::unique_ptr<DWARFDebugMacro>
 DWARFContext::parseMacroOrMacinfo(MacroSecType SectionType) {
   auto Macro = std::make_unique<DWARFDebugMacro>();
   auto ParseAndDump = [&](DWARFDataExtractor &Data, bool IsMacro) {
-    if (Error Err = Macro->parse(getStringExtractor(), Data, IsMacro)) {
+    // FIXME: Add support for debug_macro.dwo section.
+    if (Error Err = IsMacro ? Macro->parseMacro(compile_units(),
+                                                getStringExtractor(), Data)
+                            : Macro->parseMacinfo(Data)) {
       RecoverableErrorHandler(std::move(Err));
       Macro = nullptr;
     }

diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
index 005ae2b440f8..49ee94bbddad 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp
@@ -62,6 +62,8 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const {
       case DW_MACRO_undef:
       case DW_MACRO_define_strp:
       case DW_MACRO_undef_strp:
+      case DW_MACRO_define_strx:
+      case DW_MACRO_undef_strx:
         OS << " - lineno: " << E.Line;
         OS << " macro: " << E.MacroStr;
         break;
@@ -84,10 +86,23 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const {
   }
 }
 
-Error DWARFDebugMacro::parse(DataExtractor StringExtractor,
-                             DWARFDataExtractor Data, bool IsMacro) {
+Error DWARFDebugMacro::parseImpl(
+    Optional<DWARFUnitVector::iterator_range> Units,
+    Optional<DataExtractor> StringExtractor, DWARFDataExtractor Data,
+    bool IsMacro) {
   uint64_t Offset = 0;
   MacroList *M = nullptr;
+  using MacroToUnitsMap = DenseMap<uint64_t, DWARFUnit *>;
+  MacroToUnitsMap MacroToUnits;
+  if (IsMacro && Data.isValidOffset(Offset)) {
+    // Keep a mapping from Macro contribution to CUs, this will
+    // be needed while retrieving macro from DW_MACRO_define_strx form.
+    for (const auto &U : Units.getValue())
+      if (auto CUDIE = U->getUnitDIE())
+        // Skip units which does not contibutes to macro section.
+        if (auto MacroOffset = toSectionOffset(CUDIE.find(DW_AT_macros)))
+          MacroToUnits.try_emplace(*MacroOffset, U.get());
+  }
   while (Data.isValidOffset(Offset)) {
     if (!M) {
       MacroLists.emplace_back();
@@ -132,13 +147,47 @@ Error DWARFDebugMacro::parse(DataExtractor StringExtractor,
       break;
     case DW_MACRO_define_strp:
     case DW_MACRO_undef_strp: {
+      if (!IsMacro) {
+        // DW_MACRO_define_strp is a new form introduced in DWARFv5, it is
+        // not supported in debug_macinfo[.dwo] sections. Assume it as an
+        // invalid entry, push it and halt parsing.
+        E.Type = DW_MACINFO_invalid;
+        return Error::success();
+      }
       uint64_t StrOffset = 0;
       // 2. Source line
       E.Line = Data.getULEB128(&Offset);
       // 3. Macro string
       // FIXME: Add support for DWARF64
       StrOffset = Data.getRelocatedValue(/*OffsetSize=*/4, &Offset);
-      E.MacroStr = StringExtractor.getCStr(&StrOffset);
+      assert(StringExtractor && "String Extractor not found");
+      E.MacroStr = StringExtractor->getCStr(&StrOffset);
+      break;
+    }
+    case DW_MACRO_define_strx:
+    case DW_MACRO_undef_strx: {
+      if (!IsMacro) {
+        // DW_MACRO_define_strx is a new form introduced in DWARFv5, it is
+        // not supported in debug_macinfo[.dwo] sections. Assume it as an
+        // invalid entry, push it and halt parsing.
+        E.Type = DW_MACINFO_invalid;
+        return Error::success();
+      }
+      E.Line = Data.getULEB128(&Offset);
+      auto MacroContributionOffset = MacroToUnits.find(M->Offset);
+      if (MacroContributionOffset == MacroToUnits.end())
+        return createStringError(errc::invalid_argument,
+                                 "Macro contribution of the unit not found");
+      Optional<uint64_t> StrOffset =
+          MacroContributionOffset->second->getStringOffsetSectionItem(
+              Data.getULEB128(&Offset));
+      if (!StrOffset)
+        return createStringError(
+            errc::invalid_argument,
+            "String offsets contribution of the unit not found");
+      E.MacroStr =
+          MacroContributionOffset->second->getStringExtractor().getCStr(
+              &*StrOffset);
       break;
     }
     case DW_MACRO_start_file:

diff  --git a/llvm/test/DebugInfo/X86/debug-macinfo-strp.s b/llvm/test/DebugInfo/X86/debug-macinfo-strp.s
new file mode 100644
index 000000000000..5f5c1b3338b8
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macinfo-strp.s
@@ -0,0 +1,14 @@
+## This test checks that llvm-dwarfdump produces
+## DW_MACINFO_invalid when parsing *_strp
+## form in a debug_macinfo section.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %s -o -| \
+# RUN:  llvm-dwarfdump -debug-macro - | FileCheck %s
+
+#      CHECK: .debug_macinfo contents:
+# CHECK-NEXT: 0x00000000:
+# CHECK-NEXT: DW_MACINFO_invalid
+
+       .section        .debug_macinfo,"", at progbits
+.Lcu_macinfo_begin0:
+       .byte   5                      # DW_MACRO_define_strp

diff  --git a/llvm/test/DebugInfo/X86/debug-macinfo-strx.s b/llvm/test/DebugInfo/X86/debug-macinfo-strx.s
new file mode 100644
index 000000000000..598ced787499
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macinfo-strx.s
@@ -0,0 +1,14 @@
+## This test checks that llvm-dwarfdump produces
+## DW_MACINFO_invalid when parsing *_strx
+## form in a debug_macinfo section.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %s -o -| \
+# RUN:   llvm-dwarfdump -debug-macro - | FileCheck %s
+
+#      CHECK: .debug_macinfo contents:
+# CHECK-NEXT: 0x00000000:
+# CHECK-NEXT: DW_MACINFO_invalid
+
+       .section        .debug_macinfo,"", at progbits
+.Lcu_macinfo_begin0:
+       .byte   11                     # DW_MACRO_define_strx

diff  --git a/llvm/test/DebugInfo/X86/debug-macro-empty-macro-offset.s b/llvm/test/DebugInfo/X86/debug-macro-empty-macro-offset.s
new file mode 100644
index 000000000000..4762dd55d2c3
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macro-empty-macro-offset.s
@@ -0,0 +1,32 @@
+## This test checks that llvm-dwarfdump produces error message
+## while parsing an *_strx form, if units contribution to
+## debug_macro[.dwo] section is missing.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %s -o -| \
+# RUN:   not llvm-dwarfdump -debug-macro - /dev/null 2>&1 | FileCheck %s
+
+# CHECK: error: Macro contribution of the unit not found
+       .section        .debug_abbrev,"", at progbits
+       .byte   1                       # Abbreviation Code
+       .byte   17                      # DW_TAG_compile_unit
+       .byte   0                       # DW_CHILDREN_no
+       .byte   0                       # EOM(1)
+       .byte   0                       # EOM(2)
+       .byte   0                       # EOM(3)
+
+       .section        .debug_info,"", at progbits
+.Lcu_begin0:
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  5                      # DWARF version number
+       .byte   1                       # DWARF Unit Type
+       .byte   8                       # Address Size (in bytes)
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   1                       # Abbrev [1] 0xc:0x12 DW_TAG_compile_unit
+.Ldebug_info_end0:
+
+       .section        .debug_macro,"", at progbits
+.Lcu_macro_begin0:
+       .short  5                      # Macro information version
+       .byte   0                       # Flags: 32 bit
+       .byte   11                      # DW_MACRO_define_strx

diff  --git a/llvm/test/DebugInfo/X86/debug-macro-empty-str-offset.s b/llvm/test/DebugInfo/X86/debug-macro-empty-str-offset.s
new file mode 100644
index 000000000000..33239526c2ca
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macro-empty-str-offset.s
@@ -0,0 +1,36 @@
+## This test checks that llvm-dwarfdump produces error message
+## while parsing an *_strx form, if units contribution to 
+## debug_str_offsets[.dwo] section is missing.
+
+# RUN: llvm-mc -triple x86_64-unknown-linux -filetype=obj %s -o -| \
+# RUN:   not llvm-dwarfdump -debug-macro - /dev/null 2>&1 | FileCheck %s
+
+# CHECK: error: String offsets contribution of the unit not found
+
+       .section        .debug_abbrev,"", at progbits
+       .byte   1                       # Abbreviation Code
+       .byte   17                      # DW_TAG_compile_unit
+       .byte   0                       # DW_CHILDREN_no
+       .byte   121                     # DW_AT_macros
+       .byte   23                      # DW_FORM_sec_offset
+       .byte   0                       # EOM(1)
+       .byte   0                       # EOM(2)
+       .byte   0                       # EOM(3)
+
+       .section        .debug_info,"", at progbits
+.Lcu_begin0:
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  5                      # DWARF version number
+       .byte   1                       # DWARF Unit Type
+       .byte   8                       # Address Size (in bytes)
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   1                       # Abbrev [1] 0xc:0x12 DW_TAG_compile_unit
+       .long   .Lcu_macro_begin0       # DW_AT_macros
+.Ldebug_info_end0:
+
+       .section        .debug_macro,"", at progbits
+.Lcu_macro_begin0:
+       .short  5                      # Macro information version
+       .byte   0                       # Flags: 32 bit
+       .byte   11                      # DW_MACRO_define_strx

diff  --git a/llvm/test/DebugInfo/X86/debug-macro-multi-cu-strx.s b/llvm/test/DebugInfo/X86/debug-macro-multi-cu-strx.s
new file mode 100644
index 000000000000..da695962e681
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/debug-macro-multi-cu-strx.s
@@ -0,0 +1,119 @@
+## This test checks that llvm-dwarfdump can dump debug_macro
+## section containing contributions from multiple CU's represented
+## using DW_MACRO_define_strx form.
+
+# 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 = 0x0005, flags = 0x02, debug_line_offset = 0x0000
+# CHECK-NEXT:DW_MACRO_start_file - lineno: 0 filenum: 0
+# CHECK-NEXT:  DW_MACRO_define_strx - lineno: 1 macro: DWARF_VERSION 5
+# CHECK-NEXT:  DW_MACRO_define_strx - lineno: 2 macro: COMPILE_UNIT 1
+# CHECK-NEXT:  DW_MACRO_undef_strx - lineno: 3 macro: COMPILE_UNIT
+# CHECK-NEXT:DW_MACRO_end_file
+
+#      CHECK:0x00000015:
+# CHECK-NEXT:macro header: version = 0x0005, flags = 0x02, debug_line_offset = 0x0000
+# CHECK-NEXT:DW_MACRO_start_file - lineno: 1 filenum: 3
+# CHECK-NEXT:  DW_MACRO_define_strx - lineno: 2 macro: COMPILE_UNIT 2
+# CHECK-NEXT:  DW_MACRO_undef_strx - lineno: 3 macro: COMPILE_UNIT
+# CHECK-NEXT:DW_MACRO_end_file
+
+       .section        .debug_abbrev,"", at progbits
+       .byte   1                       # Abbreviation Code
+       .byte   17                      # DW_TAG_compile_unit
+       .byte   0                       # DW_CHILDREN_no
+       .byte   114                     # DW_AT_str_offsets_base
+       .byte   23                      # DW_FORM_sec_offset
+       .byte   121                     # DW_AT_macros
+       .byte   23                      # DW_FORM_sec_offset
+       .byte   0                       # EOM(1)
+       .byte   0                       # EOM(2)
+       .byte   0                       # EOM(3)
+
+       .section        .debug_info,"", at progbits
+.Lcu_begin0:
+       .long   .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+       .short  5                      # DWARF version number
+       .byte   1                       # DWARF Unit Type
+       .byte   8                       # Address Size (in bytes)
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   1                       # Abbrev [1] 0xc:0x12 DW_TAG_compile_unit
+       .long   .Lstr_offsets_base0     # DW_AT_str_offsets_base
+       .long   .Lcu_macro_begin0       # DW_AT_macros
+.Ldebug_info_end0:
+.Lcu_begin1:
+       .long   .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
+.Ldebug_info_start1:
+       .short  5                      # DWARF version number
+       .byte   1                       # DWARF Unit Type
+       .byte   8                       # Address Size (in bytes)
+       .long   .debug_abbrev           # Offset Into Abbrev. Section
+       .byte   1                       # Abbrev [1] 0xc:0x12 DW_TAG_compile_unit
+       .long   .Lstr_offsets_base1     # DW_AT_str_offsets_base
+       .long   .Lcu_macro_begin1       # DW_AT_macros
+.Ldebug_info_end1:
+
+       .section        .debug_macro,"", at progbits
+.Lcu_macro_begin0:
+       .short  5                      # Macro information version
+       .byte   2                       # Flags: 32 bit, debug_line_offset present
+       .long   0                       # debug_line_offset
+       .byte   3                       # DW_MACRO_start_file
+       .byte   0                       # Line Number
+       .byte   0                       # File Number
+       .byte   11                      # DW_MACRO_define_strx
+       .byte   1                       # Line Number
+       .byte   0                       # Macro String
+       .byte   11                      # DW_MACRO_define_strx
+       .byte   2                       # Line Number
+       .byte   1                       # Macro String
+       .byte   12                      # DW_MACRO_undef_strx
+       .byte   3                       # Line Number
+       .byte   2                       # Macro String
+       .byte   4                       # DW_MACRO_end_file
+       .byte   0                       # End Of Macro List Mark
+.Lcu_macro_begin1:
+       .short  5                      # Macro information version
+       .byte   2                       # Flags: 32 bit, debug_line_offset present
+       .long   0                       # debug_line_offset
+       .byte   3                       # DW_MACRO_start_file
+       .byte   1                       # Line Number
+       .byte   3                       # File Number
+       .byte   11                      # DW_MACRO_define_strx
+       .byte   2                       # Line Number
+       .byte   0                       # Macro String
+       .byte   12                      # DW_MACRO_undef_strx
+       .byte   3                       # Line Number
+       .byte   1                       # Macro String
+       .byte   4                       # DW_MACRO_end_file
+
+       .section        .debug_str_offsets,"", at progbits
+       .long   16                      # Unit length
+       .short  5                       # Version
+       .short  0                       # Padding
+.Lstr_offsets_base0:
+       .long   .Linfo_string0
+       .long   .Linfo_string1
+       .long   .Linfo_string2
+       .long   12                      # Unit length
+       .short  5                       # Version
+       .short  0                       # Padding
+.Lstr_offsets_base1:
+       .long   .Linfo_string3
+       .long   .Linfo_string4
+
+       .section        .debug_str,"MS", at progbits,1
+.Linfo_string0:
+       .asciz  "DWARF_VERSION 5"
+.Linfo_string1:
+       .asciz  "COMPILE_UNIT 1"
+.Linfo_string2:
+       .asciz  "COMPILE_UNIT"
+.Linfo_string3:
+       .asciz  "COMPILE_UNIT 2"
+.Linfo_string4:
+       .asciz  "COMPILE_UNIT"


        


More information about the llvm-commits mailing list