<div dir="ltr">Could you include some test cases?<br><br>Since LLVM cannot produce DWARF64 yet (so far as I know) you may need to generate them with GCC (you'll find other binary tests in test/DebugInfo/Inputs/dwarfdump-* (with corresponding tests like test/DebugInfo/dwarfdump-test.test)). Please include comments about which version of GCC and what flags were used to generate the binaries.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Oct 21, 2013 at 9:22 AM, Ed Maste <span dir="ltr"><<a href="mailto:emaste@freebsd.org" target="_blank">emaste@freebsd.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Other DWARF sections still need to be done, as well as 64-bit offsets in DataExtractor also needed (as described DebugFrame).<br>
<br>
<a href="http://llvm.org/bugs/show_bug.cgi?id=17411" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=17411</a><br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1988" target="_blank">http://llvm-reviews.chandlerc.com/D1988</a><br>
<br>
Files:<br>
  lib/DebugInfo/DWARFDebugLine.cpp<br>
  lib/DebugInfo/DWARFDebugLine.h<br>
<br>
Index: lib/DebugInfo/DWARFDebugLine.cpp<br>
===================================================================<br>
--- lib/DebugInfo/DWARFDebugLine.cpp<br>
+++ lib/DebugInfo/DWARFDebugLine.cpp<br>
@@ -18,9 +18,9 @@<br>
<br>
 void DWARFDebugLine::Prologue::dump(raw_ostream &OS) const {<br>
   OS << "Line table prologue:\n"<br>
-     << format("   total_length: 0x%8.8x\n", TotalLength)<br>
+     << format("   total_length: 0x%8.8" PRIx64 "\n", TotalLength)<br>
      << format("        version: %u\n", Version)<br>
-     << format("prologue_length: 0x%8.8x\n", PrologueLength)<br>
+     << format("prologue_length: 0x%8.8" PRIx64 "\n", PrologueLength)<br>
      << format("min_inst_length: %u\n", MinInstLength)<br>
      << format("default_is_stmt: %u\n", DefaultIsStmt)<br>
      << format("      line_base: %i\n", LineBase)<br>
@@ -165,16 +165,23 @@<br>
 bool<br>
 DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,<br>
                               uint32_t *offset_ptr, Prologue *prologue) {<br>
-  const uint32_t prologue_offset = *offset_ptr;<br>
+  const uint64_t prologue_offset = *offset_ptr;<br>
<br>
   prologue->clear();<br>
   prologue->TotalLength = debug_line_data.getU32(offset_ptr);<br>
+  if (prologue->TotalLength == UINT32_MAX) {<br>
+    prologue->IsDWARF64 = true;<br>
+    prologue->TotalLength = debug_line_data.getU64(offset_ptr);<br>
+  } else if (prologue->TotalLength >= 0xffffff00) {<br>
+    return false;<br>
+  }<br>
   prologue->Version = debug_line_data.getU16(offset_ptr);<br>
   if (prologue->Version != 2)<br>
     return false;<br>
<br>
-  prologue->PrologueLength = debug_line_data.getU32(offset_ptr);<br>
-  const uint32_t end_prologue_offset = prologue->PrologueLength + *offset_ptr;<br>
+  prologue->PrologueLength = debug_line_data.getUnsigned(offset_ptr,<br>
+                                              prologue->sizeofPrologueLength());<br>
+  const uint64_t end_prologue_offset = prologue->PrologueLength + *offset_ptr;<br>
   prologue->MinInstLength = debug_line_data.getU8(offset_ptr);<br>
   prologue->DefaultIsStmt = debug_line_data.getU8(offset_ptr);<br>
   prologue->LineBase = debug_line_data.getU8(offset_ptr);<br>
@@ -209,10 +216,15 @@<br>
     }<br>
   }<br>
<br>
-  if (*offset_ptr != end_prologue_offset) {<br>
-    fprintf(stderr, "warning: parsing line table prologue at 0x%8.8x should"<br>
-                    " have ended at 0x%8.8x but it ended at 0x%8.8x\n",<br>
-            prologue_offset, end_prologue_offset, *offset_ptr);<br>
+  if (prologue->IsDWARF64 && end_prologue_offset - *offset_ptr == 12) {<br>
+    fprintf(stderr, "warning: apparent 64-bit DWARF GNU as prologue length bug"<br>
+                    " detected (prologue length 12 bytes too long)\n");<br>
+    // Could correct the field: prologue->PrologueLength -= 12;<br>
+  } else if (*offset_ptr != end_prologue_offset) {<br>
+    fprintf(stderr, "warning: parsing line table prologue at 0x%8.8" PRIx64<br>
+                    " should have ended at 0x%8.8" PRIx64<br>
+                    " but it ended at 0x%8.8" PRIx64 "\n",<br>
+            prologue_offset, end_prologue_offset, (uint64_t)*offset_ptr);<br>
     return false;<br>
   }<br>
   return true;<br>
@@ -233,7 +245,7 @@<br>
   }<br>
<br>
   const uint32_t end_offset = debug_line_offset + prologue->TotalLength +<br>
-                              sizeof(prologue->TotalLength);<br>
+                              prologue->sizeofTotalLength();<br>
<br>
   state.reset();<br>
<br>
Index: lib/DebugInfo/DWARFDebugLine.h<br>
===================================================================<br>
--- lib/DebugInfo/DWARFDebugLine.h<br>
+++ lib/DebugInfo/DWARFDebugLine.h<br>
@@ -34,17 +34,20 @@<br>
<br>
   struct Prologue {<br>
     Prologue()<br>
-      : TotalLength(0), Version(0), PrologueLength(0), MinInstLength(0),<br>
-        DefaultIsStmt(0), LineBase(0), LineRange(0), OpcodeBase(0) {}<br>
+      : IsDWARF64(0), TotalLength(0), Version(0), PrologueLength(0),<br>
+        MinInstLength(0), DefaultIsStmt(0), LineBase(0), LineRange(0),<br>
+        OpcodeBase(0) {}<br>
<br>
+    // Prologue represents 64-bit DWARF<br>
+    bool IsDWARF64;<br>
     // The size in bytes of the statement information for this compilation unit<br>
     // (not including the total_length field itself).<br>
-    uint32_t TotalLength;<br>
+    uint64_t TotalLength;<br>
     // Version identifier for the statement information format.<br>
     uint16_t Version;<br>
     // The number of bytes following the prologue_length field to the beginning<br>
     // of the first byte of the statement program itself.<br>
-    uint32_t PrologueLength;<br>
+    uint64_t PrologueLength;<br>
     // The size in bytes of the smallest target machine instruction. Statement<br>
     // program opcodes that alter the address register first multiply their<br>
     // operands by this value.<br>
@@ -61,20 +64,28 @@<br>
     std::vector<const char*> IncludeDirectories;<br>
     std::vector<FileNameEntry> FileNames;<br>
<br>
+    uint32_t sizeofTotalLength() const {<br>
+      return IsDWARF64 ? 12 : 4;<br>
+    }<br>
+    uint32_t sizeofPrologueLength() const {<br>
+      return IsDWARF64 ? 8 : 4;<br>
+    }<br>
+<br>
     // Length of the prologue in bytes.<br>
     uint32_t getLength() const {<br>
-      return PrologueLength + sizeof(TotalLength) + sizeof(Version) +<br>
-             sizeof(PrologueLength);<br>
+      return PrologueLength + sizeofTotalLength() + sizeof(Version) +<br>
+             sizeofPrologueLength();<br>
     }<br>
     // Length of the line table data in bytes (not including the prologue).<br>
     uint32_t getStatementTableLength() const {<br>
-      return TotalLength + sizeof(TotalLength) - getLength();<br>
+      return TotalLength + sizeofTotalLength() - getLength();<br>
     }<br>
     int32_t getMaxLineIncrementForSpecialOpcode() const {<br>
       return LineBase + (int8_t)LineRange - 1;<br>
     }<br>
     void dump(raw_ostream &OS) const;<br>
     void clear() {<br>
+      IsDWARF64 = false;<br>
       TotalLength = Version = PrologueLength = 0;<br>
       MinInstLength = LineBase = LineRange = OpcodeBase = 0;<br>
       StandardOpcodeLengths.clear();<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>