diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDebugLine.h @@ -108,15 +108,7 @@ bool totalLengthIsValid() const; /// Length of the prologue in bytes. - uint32_t getLength() const { - return PrologueLength + sizeofTotalLength() + sizeof(getVersion()) + - sizeofPrologueLength(); - } - - /// Length of the line table data in bytes (not including the prologue). - uint32_t getStatementTableLength() const { - return TotalLength + sizeofTotalLength() - getLength(); - } + uint64_t getLength() const; 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 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -299,6 +299,14 @@ return Error::success(); } +uint64_t DWARFDebugLine::Prologue::getLength() const { + uint64_t Length = PrologueLength + sizeofTotalLength() + + sizeof(getVersion()) + sizeofPrologueLength(); + if (getVersion() >= 5) + Length += 2; // Address + Segment selector sizes. + return Length; +} + Error DWARFDebugLine::Prologue::parse( const DWARFDataExtractor &DebugLineData, uint64_t *OffsetPtr, function_ref RecoverableErrorCallback, const DWARFContext &Ctx, diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp @@ -235,6 +235,29 @@ "offset 0x00000001 is not a valid debug line section offset", 1); } +TEST_P(DebugLineParameterisedFixture, PrologueGetLength) { + if (!setupGenerator(Version)) + return; + LineTable < = Gen->addLineTable(Format); + DWARFDebugLine::Prologue Prologue = LT.createBasicPrologue(); + LT.setPrologue(Prologue); + generate(); + + // + 10 for sizes of DWARF-32 unit length, version, prologue length. + uint64_t ExpectedLength = Prologue.PrologueLength + 10; + if (Version == 5) + // Add address and segment selector size fields. + ExpectedLength += 2; + if (Format == DWARF64) + // Unit length grows by 8, prologue length by 4. + ExpectedLength += 12; + + auto ExpectedLineTable = Line.getOrParseLineTable(LineData, 0, *Context, + nullptr, RecordRecoverable); + ASSERT_THAT_EXPECTED(ExpectedLineTable, Succeeded()); + EXPECT_EQ((*ExpectedLineTable)->Prologue.getLength(), ExpectedLength); +} + TEST_P(DebugLineParameterisedFixture, GetOrParseLineTableValidTable) { if (!setupGenerator(Version)) return;