[PATCH] Initial DWARF64 support for .debug_line

David Blaikie dblaikie at gmail.com
Mon Oct 21 09:33:30 PDT 2013


Could you include some test cases?

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.


On Mon, Oct 21, 2013 at 9:22 AM, Ed Maste <emaste at freebsd.org> wrote:

> Other DWARF sections still need to be done, as well as 64-bit offsets in
> DataExtractor also needed (as described DebugFrame).
>
> http://llvm.org/bugs/show_bug.cgi?id=17411
>
> http://llvm-reviews.chandlerc.com/D1988
>
> Files:
>   lib/DebugInfo/DWARFDebugLine.cpp
>   lib/DebugInfo/DWARFDebugLine.h
>
> Index: lib/DebugInfo/DWARFDebugLine.cpp
> ===================================================================
> --- lib/DebugInfo/DWARFDebugLine.cpp
> +++ lib/DebugInfo/DWARFDebugLine.cpp
> @@ -18,9 +18,9 @@
>
>  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("default_is_stmt: %u\n", DefaultIsStmt)
>       << format("      line_base: %i\n", LineBase)
> @@ -165,16 +165,23 @@
>  bool
>  DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
>                                uint32_t *offset_ptr, Prologue *prologue) {
> -  const uint32_t prologue_offset = *offset_ptr;
> +  const uint64_t prologue_offset = *offset_ptr;
>
>    prologue->clear();
>    prologue->TotalLength = debug_line_data.getU32(offset_ptr);
> +  if (prologue->TotalLength == UINT32_MAX) {
> +    prologue->IsDWARF64 = true;
> +    prologue->TotalLength = debug_line_data.getU64(offset_ptr);
> +  } else if (prologue->TotalLength >= 0xffffff00) {
> +    return false;
> +  }
>    prologue->Version = debug_line_data.getU16(offset_ptr);
>    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->PrologueLength = debug_line_data.getUnsigned(offset_ptr,
> +
>  prologue->sizeofPrologueLength());
> +  const uint64_t end_prologue_offset = prologue->PrologueLength +
> *offset_ptr;
>    prologue->MinInstLength = debug_line_data.getU8(offset_ptr);
>    prologue->DefaultIsStmt = debug_line_data.getU8(offset_ptr);
>    prologue->LineBase = debug_line_data.getU8(offset_ptr);
> @@ -209,10 +216,15 @@
>      }
>    }
>
> -  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);
> +  if (prologue->IsDWARF64 && end_prologue_offset - *offset_ptr == 12) {
> +    fprintf(stderr, "warning: apparent 64-bit DWARF GNU as prologue
> length bug"
> +                    " detected (prologue length 12 bytes too long)\n");
> +    // Could correct the field: prologue->PrologueLength -= 12;
> +  } else if (*offset_ptr != end_prologue_offset) {
> +    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;
> @@ -233,7 +245,7 @@
>    }
>
>    const uint32_t end_offset = debug_line_offset + prologue->TotalLength +
> -                              sizeof(prologue->TotalLength);
> +                              prologue->sizeofTotalLength();
>
>    state.reset();
>
> Index: lib/DebugInfo/DWARFDebugLine.h
> ===================================================================
> --- lib/DebugInfo/DWARFDebugLine.h
> +++ lib/DebugInfo/DWARFDebugLine.h
> @@ -34,17 +34,20 @@
>
>    struct Prologue {
>      Prologue()
> -      : TotalLength(0), Version(0), PrologueLength(0), MinInstLength(0),
> -        DefaultIsStmt(0), LineBase(0), LineRange(0), OpcodeBase(0) {}
> +      : IsDWARF64(0), TotalLength(0), Version(0), PrologueLength(0),
> +        MinInstLength(0), DefaultIsStmt(0), LineBase(0), LineRange(0),
> +        OpcodeBase(0) {}
>
> +    // Prologue represents 64-bit DWARF
> +    bool IsDWARF64;
>      // 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.
> @@ -61,20 +64,28 @@
>      std::vector<const char*> IncludeDirectories;
>      std::vector<FileNameEntry> FileNames;
>
> +    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;
>      }
>      void dump(raw_ostream &OS) const;
>      void clear() {
> +      IsDWARF64 = false;
>        TotalLength = Version = PrologueLength = 0;
>        MinInstLength = LineBase = LineRange = OpcodeBase = 0;
>        StandardOpcodeLengths.clear();
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131021/798cb09d/attachment.html>


More information about the llvm-commits mailing list