diff options
author | Igor Kudrin <ikudrin@accesssoftek.com> | 2019-09-10 11:54:32 +0000 |
---|---|---|
committer | Igor Kudrin <ikudrin@accesssoftek.com> | 2019-09-10 11:54:32 +0000 |
commit | bc48588f764a21b81a4cf16f878fbe98d4151819 (patch) | |
tree | 7cb18f06cadaee49dd9f5ba351563b8308506ee6 /llvm/unittests/DebugInfo | |
parent | 89efb03463eecc021e8613b79c43ea8ab135ca49 (diff) | |
download | bcm5719-llvm-bc48588f764a21b81a4cf16f878fbe98d4151819.tar.gz bcm5719-llvm-bc48588f764a21b81a4cf16f878fbe98d4151819.zip |
Reland [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: 371510
Diffstat (limited to 'llvm/unittests/DebugInfo')
-rw-r--r-- | llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index f2fb5703d35..9b017b31560 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -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) - 1)))); + 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 |