From 6d0bee5fc2c0a4b3ac6ad5e4d03ec5544b395ea1 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Thu, 28 May 2015 15:38:17 +0000 Subject: [PATCH] DebugInfo: .debug_line DWARF64 support This adds support for the 64-bit DWARF format, but is still limited to less than 4GB of debug data by the DataExtractor class. Some versions of the GNU MIPS toolchain generate 64-Bit DWARF even though it isn't actually necessary. Differential Revision: http://reviews.llvm.org/D1988 llvm-svn: 238434 --- llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h | 18 ++++++++++---- llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 27 ++++++++++++++------- .../Inputs/dwarfdump.elf-mips64-64-bit-dwarf | Bin 0 -> 15638 bytes llvm/test/DebugInfo/dwarfdump-64-bit-dwarf.test | 15 ++++++++++++ 4 files changed, 46 insertions(+), 14 deletions(-) create mode 100755 llvm/test/DebugInfo/Inputs/dwarfdump.elf-mips64-64-bit-dwarf create mode 100644 llvm/test/DebugInfo/dwarfdump-64-bit-dwarf.test diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h index 37b22c2..5f223d4 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h @@ -38,12 +38,12 @@ public: // The size in bytes of the statement information for this compilation unit // (not including the total_length field itself). - uint32_t TotalLength; + uint64_t TotalLength; // Version identifier for the statement information format. uint16_t Version; // The number of bytes following the prologue_length field to the beginning // of the first byte of the statement program itself. - uint32_t PrologueLength; + uint64_t PrologueLength; // The size in bytes of the smallest target machine instruction. Statement // program opcodes that alter the address register first multiply their // operands by this value. @@ -63,14 +63,22 @@ public: std::vector IncludeDirectories; std::vector FileNames; + bool IsDWARF64; + uint32_t sizeofTotalLength() const { + return IsDWARF64 ? 12 : 4; + } + uint32_t sizeofPrologueLength() const { + return IsDWARF64 ? 8 : 4; + } + // Length of the prologue in bytes. uint32_t getLength() const { - return PrologueLength + sizeof(TotalLength) + sizeof(Version) + - sizeof(PrologueLength); + return PrologueLength + sizeofTotalLength() + sizeof(Version) + + sizeofPrologueLength(); } // Length of the line table data in bytes (not including the prologue). uint32_t getStatementTableLength() const { - return TotalLength + sizeof(TotalLength) - getLength(); + return TotalLength + sizeofTotalLength() - getLength(); } int32_t getMaxLineIncrementForSpecialOpcode() const { return LineBase + (int8_t)LineRange - 1; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index b63af6a..2a737ef 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -25,6 +25,7 @@ void DWARFDebugLine::Prologue::clear() { TotalLength = Version = PrologueLength = 0; MinInstLength = MaxOpsPerInst = DefaultIsStmt = LineBase = LineRange = 0; OpcodeBase = 0; + IsDWARF64 = false; StandardOpcodeLengths.clear(); IncludeDirectories.clear(); FileNames.clear(); @@ -32,9 +33,9 @@ void DWARFDebugLine::Prologue::clear() { void DWARFDebugLine::Prologue::dump(raw_ostream &OS) const { OS << "Line table prologue:\n" - << format(" total_length: 0x%8.8x\n", TotalLength) + << format(" total_length: 0x%8.8" PRIx64 "\n", TotalLength) << format(" version: %u\n", Version) - << format(" prologue_length: 0x%8.8x\n", PrologueLength) + << format(" prologue_length: 0x%8.8" PRIx64 "\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) @@ -67,16 +68,23 @@ void DWARFDebugLine::Prologue::dump(raw_ostream &OS) const { bool DWARFDebugLine::Prologue::parse(DataExtractor debug_line_data, uint32_t *offset_ptr) { - const uint32_t prologue_offset = *offset_ptr; + const uint64_t prologue_offset = *offset_ptr; clear(); TotalLength = debug_line_data.getU32(offset_ptr); + if (TotalLength == UINT32_MAX) { + IsDWARF64 = true; + TotalLength = debug_line_data.getU64(offset_ptr); + } else if (TotalLength > 0xffffff00) { + return false; + } Version = debug_line_data.getU16(offset_ptr); if (Version < 2) return false; - PrologueLength = debug_line_data.getU32(offset_ptr); - const uint32_t end_prologue_offset = PrologueLength + *offset_ptr; + PrologueLength = debug_line_data.getUnsigned(offset_ptr, + sizeofPrologueLength()); + const uint64_t end_prologue_offset = PrologueLength + *offset_ptr; MinInstLength = debug_line_data.getU8(offset_ptr); if (Version >= 4) MaxOpsPerInst = debug_line_data.getU8(offset_ptr); @@ -114,9 +122,10 @@ bool DWARFDebugLine::Prologue::parse(DataExtractor debug_line_data, } if (*offset_ptr != end_prologue_offset) { - fprintf(stderr, "warning: parsing line table prologue at 0x%8.8x should" - " have ended at 0x%8.8x but it ended at 0x%8.8x\n", - prologue_offset, end_prologue_offset, *offset_ptr); + fprintf(stderr, "warning: parsing line table prologue at 0x%8.8" PRIx64 + " should have ended at 0x%8.8" PRIx64 + " but it ended at 0x%8.8" PRIx64 "\n", + prologue_offset, end_prologue_offset, (uint64_t)*offset_ptr); return false; } return true; @@ -258,7 +267,7 @@ bool DWARFDebugLine::LineTable::parse(DataExtractor debug_line_data, } const uint32_t end_offset = debug_line_offset + Prologue.TotalLength + - sizeof(Prologue.TotalLength); + Prologue.sizeofTotalLength(); ParsingState State(this); diff --git a/llvm/test/DebugInfo/Inputs/dwarfdump.elf-mips64-64-bit-dwarf b/llvm/test/DebugInfo/Inputs/dwarfdump.elf-mips64-64-bit-dwarf new file mode 100755 index 0000000000000000000000000000000000000000..5dbfea52212b28607cb9ef5d0a91bd2abeaf35ef GIT binary patch literal 15638 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 literal 0 HcmV?d00001 diff --git a/llvm/test/DebugInfo/dwarfdump-64-bit-dwarf.test b/llvm/test/DebugInfo/dwarfdump-64-bit-dwarf.test new file mode 100644 index 0000000..0a24414 --- /dev/null +++ b/llvm/test/DebugInfo/dwarfdump-64-bit-dwarf.test @@ -0,0 +1,15 @@ +RUN: llvm-dwarfdump %p/Inputs/dwarfdump.elf-mips64-64-bit-dwarf \ +RUN: --debug-dump=line | FileCheck %s + +# FIXME: llvm-dwarfdump's support for 64-bit dwarf is currently limited to +# .debug_line. + +CHECK: total_length: 0x00000212 +CHECK: version: 2 +CHECK:prologue_length: 0x000001ab +CHECK:min_inst_length: 1 +CHECK:default_is_stmt: 1 +CHECK: line_base: -5 +CHECK: line_range: 14 +CHECK: opcode_base: 13 +CHECK: is_stmt end_sequence -- 2.7.4