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;
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<void(Error)> RecoverableErrorCallback, const DWARFContext &Ctx,
"offset 0x00000001 is not a valid debug line section offset", 1);\r
}\r
\r
+TEST_P(DebugLineParameterisedFixture, PrologueGetLength) {\r
+ if (!setupGenerator(Version))\r
+ return;\r
+ LineTable < = Gen->addLineTable(Format);\r
+ DWARFDebugLine::Prologue Prologue = LT.createBasicPrologue();\r
+ LT.setPrologue(Prologue);\r
+ generate();\r
+\r
+ // + 10 for sizes of DWARF-32 unit length, version, prologue length.\r
+ uint64_t ExpectedLength = Prologue.PrologueLength + 10;\r
+ if (Version == 5)\r
+ // Add address and segment selector size fields.\r
+ ExpectedLength += 2;\r
+ if (Format == DWARF64)\r
+ // Unit length grows by 8, prologue length by 4.\r
+ ExpectedLength += 12;\r
+\r
+ auto ExpectedLineTable = Line.getOrParseLineTable(LineData, 0, *Context,\r
+ nullptr, RecordRecoverable);\r
+ ASSERT_THAT_EXPECTED(ExpectedLineTable, Succeeded());\r
+ EXPECT_EQ((*ExpectedLineTable)->Prologue.getLength(), ExpectedLength);\r
+}\r
+\r
TEST_P(DebugLineParameterisedFixture, GetOrParseLineTableValidTable) {\r
if (!setupGenerator(Version))\r
return;\r