<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>