llvm-dwarfdump: Support for debug_line.dwo section for file names for type units...
authorDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Feb 2014 23:58:54 +0000 (23:58 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Mon, 24 Feb 2014 23:58:54 +0000 (23:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202091 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo/DIContext.h
lib/DebugInfo/DWARFContext.cpp
lib/DebugInfo/DWARFContext.h
lib/DebugInfo/DWARFDebugLine.cpp
lib/DebugInfo/DWARFDebugLine.h
test/DebugInfo/Inputs/dwarfdump-line-dwo.cc [new file with mode: 0644]
test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 [new file with mode: 0644]
test/DebugInfo/dwarfdump-line-dwo.test [new file with mode: 0644]
tools/llvm-dwarfdump/llvm-dwarfdump.cpp

index 37f2a260ae61b14098470178f3db26cffd1c11ba..f04dc001f4b352b79b47dabe750e035e2d994093 100644 (file)
@@ -107,6 +107,7 @@ enum DIDumpType {
   DIDT_Types,
   DIDT_TypesDwo,
   DIDT_Line,
+  DIDT_LineDwo,
   DIDT_Loc,
   DIDT_Ranges,
   DIDT_Pubnames,
index b5b75b0408e95f34dd2d5644f3d3313dd3c76695..e17387b31d352211ed858572e7a6a2698b3fa9fb 100644 (file)
@@ -136,6 +136,16 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
     }
   }
 
+  if (DumpType == DIDT_All || DumpType == DIDT_LineDwo) {
+    OS << "\n.debug_line.dwo contents:\n";
+    unsigned stmtOffset = 0;
+    DataExtractor lineData(getLineDWOSection().Data, isLittleEndian(),
+                           savedAddressByteSize);
+    DWARFDebugLine::DumpingState state(OS);
+    while (DWARFDebugLine::parsePrologue(lineData, &stmtOffset, &state.Prologue))
+      state.finalize();
+  }
+
   if (DumpType == DIDT_All || DumpType == DIDT_Str) {
     OS << "\n.debug_str contents:\n";
     DataExtractor strData(getStringSection(), isLittleEndian(), 0);
@@ -645,6 +655,7 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
             .Case("debug_gnu_pubtypes", &GnuPubTypesSection)
             .Case("debug_info.dwo", &InfoDWOSection.Data)
             .Case("debug_abbrev.dwo", &AbbrevDWOSection)
+            .Case("debug_line.dwo", &LineDWOSection.Data)
             .Case("debug_str.dwo", &StringDWOSection)
             .Case("debug_str_offsets.dwo", &StringOffsetDWOSection)
             .Case("debug_addr", &AddrSection)
index 9bac69d6e5225ccada077d2cec1334f131f20c13..2a534de49dee739ba91bc0b2c5c0e9886fde5ad6 100644 (file)
@@ -166,6 +166,7 @@ public:
   virtual StringRef getARangeSection() = 0;
   virtual StringRef getDebugFrameSection() = 0;
   virtual const Section &getLineSection() = 0;
+  virtual const Section &getLineDWOSection() = 0;
   virtual StringRef getStringSection() = 0;
   virtual StringRef getRangeSection() = 0;
   virtual StringRef getPubNamesSection() = 0;
@@ -208,6 +209,7 @@ class DWARFContextInMemory : public DWARFContext {
   StringRef ARangeSection;
   StringRef DebugFrameSection;
   Section LineSection;
+  Section LineDWOSection;
   StringRef StringSection;
   StringRef RangeSection;
   StringRef PubNamesSection;
@@ -238,6 +240,7 @@ public:
   virtual StringRef getARangeSection() { return ARangeSection; }
   virtual StringRef getDebugFrameSection() { return DebugFrameSection; }
   virtual const Section &getLineSection() { return LineSection; }
+  virtual const Section &getLineDWOSection() { return LineDWOSection; }
   virtual StringRef getStringSection() { return StringSection; }
   virtual StringRef getRangeSection() { return RangeSection; }
   virtual StringRef getPubNamesSection() { return PubNamesSection; }
index b2c8502d57fad18632406a5afa1a572df90fa381..83490b1d3ff9edbdeab56b92ddf5230701eadbd0 100644 (file)
@@ -18,14 +18,15 @@ using namespace dwarf;
 
 void DWARFDebugLine::Prologue::dump(raw_ostream &OS) const {
   OS << "Line table prologue:\n"
-     << format("   total_length: 0x%8.8x\n", TotalLength)
-     << format("        version: %u\n", Version)
-     << format("prologue_length: 0x%8.8x\n", PrologueLength)
-     << format("min_inst_length: %u\n", MinInstLength)
-     << format("default_is_stmt: %u\n", DefaultIsStmt)
-     << format("      line_base: %i\n", LineBase)
-     << format("     line_range: %u\n", LineRange)
-     << format("    opcode_base: %u\n", OpcodeBase);
+     << format("    total_length: 0x%8.8x\n", TotalLength)
+     << format("         version: %u\n", Version)
+     << format(" prologue_length: 0x%8.8x\n", PrologueLength)
+     << format(" min_inst_length: %u\n", MinInstLength)
+     << format(Version >= 4 ? "max_ops_per_inst: %u\n" : "", MaxOpsPerInst)
+     << format(" default_is_stmt: %u\n", DefaultIsStmt)
+     << format("       line_base: %i\n", LineBase)
+     << format("      line_range: %u\n", LineRange)
+     << format("     opcode_base: %u\n", OpcodeBase);
 
   for (uint32_t i = 0; i < StandardOpcodeLengths.size(); ++i)
     OS << format("standard_opcode_lengths[%s] = %u\n", LNStandardString(i+1),
@@ -172,12 +173,14 @@ DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
   prologue->clear();
   prologue->TotalLength = debug_line_data.getU32(offset_ptr);
   prologue->Version = debug_line_data.getU16(offset_ptr);
-  if (prologue->Version != 2)
+  if (prologue->Version < 2)
     return false;
 
   prologue->PrologueLength = debug_line_data.getU32(offset_ptr);
   const uint32_t end_prologue_offset = prologue->PrologueLength + *offset_ptr;
   prologue->MinInstLength = debug_line_data.getU8(offset_ptr);
+  if (prologue->Version >= 4)
+    prologue->MaxOpsPerInst = debug_line_data.getU8(offset_ptr);
   prologue->DefaultIsStmt = debug_line_data.getU8(offset_ptr);
   prologue->LineBase = debug_line_data.getU8(offset_ptr);
   prologue->LineRange = debug_line_data.getU8(offset_ptr);
@@ -220,10 +223,9 @@ DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
   return true;
 }
 
-bool
-DWARFDebugLine::parseStatementTable(DataExtractor debug_line_data, 
-                                    const RelocAddrMap *RMap,
-                                    uint32_t *offset_ptr, State &state) {
+bool DWARFDebugLine::parseStatementTable(DataExtractor debug_line_data,
+                                         const RelocAddrMap *RMap,
+                                         uint32_t *offset_ptr, State &state) {
   const uint32_t debug_line_offset = *offset_ptr;
 
   Prologue *prologue = &state.Prologue;
index 9e93cc86dd20a3b33abecb8ab57bcfa51b6ed558..88b1aee9228bfa28bfce4a79749b10629b516a03 100644 (file)
@@ -34,8 +34,9 @@ public:
 
   struct Prologue {
     Prologue()
-      : TotalLength(0), Version(0), PrologueLength(0), MinInstLength(0),
-        DefaultIsStmt(0), LineBase(0), LineRange(0), OpcodeBase(0) {}
+        : TotalLength(0), Version(0), PrologueLength(0), MinInstLength(0),
+          MaxOpsPerInst(0), DefaultIsStmt(0), LineBase(0), LineRange(0),
+          OpcodeBase(0) {}
 
     // The size in bytes of the statement information for this compilation unit
     // (not including the total_length field itself).
@@ -49,6 +50,9 @@ public:
     // program opcodes that alter the address register first multiply their
     // operands by this value.
     uint8_t MinInstLength;
+    // The maximum number of individual operations that may be encoded in an
+    // instruction.
+    uint8_t MaxOpsPerInst;
     // The initial value of theis_stmtregister.
     uint8_t DefaultIsStmt;
     // This parameter affects the meaning of the special opcodes. See below.
diff --git a/test/DebugInfo/Inputs/dwarfdump-line-dwo.cc b/test/DebugInfo/Inputs/dwarfdump-line-dwo.cc
new file mode 100644 (file)
index 0000000..2784ae2
--- /dev/null
@@ -0,0 +1,10 @@
+struct foo {
+};
+
+foo f;
+
+// Built with GCC
+// $ mkdir -p /tmp/dbginfo
+// $ cp dwarfdump-line-dwo.cc /tmp/dbginfo
+// $ cd /tmp/dbginfo
+// $ g++ -c -fdebug-types-section dwarfdump-line-dwo.cc -o <output>
diff --git a/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 b/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64
new file mode 100644 (file)
index 0000000..9f1d267
Binary files /dev/null and b/test/DebugInfo/Inputs/dwarfdump-line-dwo.elf-x86-64 differ
diff --git a/test/DebugInfo/dwarfdump-line-dwo.test b/test/DebugInfo/dwarfdump-line-dwo.test
new file mode 100644 (file)
index 0000000..3178a5d
--- /dev/null
@@ -0,0 +1,6 @@
+RUN: llvm-dwarfdump %p/Inputs/dwarfdump-line-dwo.elf-x86-64 | FileCheck %s
+
+CHECK: .debug_line.dwo contents:
+CHECK: version: 4
+CHECK: max_ops_per_inst: 1
+CHECK: file_names[  1]{{.*}}dwarfdump-line-dwo.cc
index f827909dc314cae7f851aeb78c275f62e5fc4117..103779eafdce2b0af6ea92d320378ff229ba9553 100644 (file)
@@ -65,6 +65,7 @@ DumpType("debug-dump", cl::init(DIDT_All),
         clEnumValN(DIDT_Types, "types", ".debug_types"),
         clEnumValN(DIDT_TypesDwo, "types.dwo", ".debug_types.dwo"),
         clEnumValN(DIDT_Line, "line", ".debug_line"),
+        clEnumValN(DIDT_LineDwo, "line.dwo", ".debug_line.dwo"),
         clEnumValN(DIDT_Loc, "loc", ".debug_loc"),
         clEnumValN(DIDT_Frames, "frames", ".debug_frame"),
         clEnumValN(DIDT_Ranges, "ranges", ".debug_ranges"),