[DWARF] Add a unit test for DWARFUnit::getLength().

This is a follow-up of rL369529, where the return value of
DWARFUnit::getLength() was changed from uint32_t to uint64_t.
The test checks that a unit header with Length > 4G can be successfully
parsed and the value of the Length field is not truncated.

Differential Revision: https://reviews.llvm.org/D67276

llvm-svn: 371499
This commit is contained in:
Igor Kudrin 2019-09-10 09:03:24 +00:00
parent b6722af068
commit 3565c6b15c
1 changed files with 42 additions and 0 deletions

View File

@ -3158,4 +3158,46 @@ TEST(DWARFDebugInfo, TestDWARFDieRangeInfoIntersects) {
AssertRangesIntersect(Ranges, {{0x20, 0x21}, {0x2f, 0x31}});
}
TEST(DWARFDebugInfo, TestDWARF64UnitLength) {
static const char DebugInfoSecRaw[] =
"\xff\xff\xff\xff" // DWARF64 mark
"\x88\x77\x66\x55\x44\x33\x22\x11" // Length
"\x05\x00" // Version
"\x01" // DW_UT_compile
"\x04" // Address size
"\0\0\0\0\0\0\0\0"; // Offset Into Abbrev. Sec.
StringMap<std::unique_ptr<MemoryBuffer>> Sections;
Sections.insert(std::make_pair(
"debug_info", MemoryBuffer::getMemBuffer(
StringRef(DebugInfoSecRaw, sizeof(DebugInfoSecRaw)))));
auto Context = DWARFContext::create(Sections, /* AddrSize = */ 4,
/* isLittleEndian = */ true);
const auto &Obj = Context->getDWARFObj();
Obj.forEachInfoSections([&](const DWARFSection &Sec) {
DWARFUnitHeader Header;
DWARFDataExtractor Data(Obj, Sec, /* IsLittleEndian = */ true,
/* AddressSize = */ 4);
uint64_t Offset = 0;
EXPECT_FALSE(Header.extract(*Context, Data, &Offset));
// Header.extract() returns false because there is not enough space
// in the section for the declared length. Anyway, we can check that
// the properties are read correctly.
ASSERT_EQ(DwarfFormat::DWARF64, Header.getFormat());
ASSERT_EQ(0x1122334455667788ULL, Header.getLength());
ASSERT_EQ(5, Header.getVersion());
ASSERT_EQ(DW_UT_compile, Header.getUnitType());
ASSERT_EQ(4, Header.getAddressByteSize());
// Check that the length can be correctly read in the unit class.
DWARFUnitVector DummyUnitVector;
DWARFSection DummySec;
DWARFCompileUnit CU(*Context, Sec, Header, /* DA = */ 0, /* RS = */ 0,
/* LocSection = */ 0, /* SS = */ StringRef(),
/* SOS = */ DummySec, /* AOS = */ 0,
/* LS = */ DummySec, /* LE = */ true,
/* isDWO= */ false, DummyUnitVector);
ASSERT_EQ(0x1122334455667788ULL, CU.getLength());
});
}
} // end anonymous namespace