diff options
author | Alex Langford <alangford@apple.com> | 2024-04-23 11:01:54 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-23 11:01:54 -0700 |
commit | 1a8935ada7cb0bb7943e18f2bc9f6d7a89887aa8 (patch) | |
tree | 7404510e53fdd710e9815a8e881bf7d895ec624b /llvm/lib | |
parent | 9e9595183001991a7d31d8880c4a2b33594ca30f (diff) | |
download | llvm-1a8935ada7cb0bb7943e18f2bc9f6d7a89887aa8.zip llvm-1a8935ada7cb0bb7943e18f2bc9f6d7a89887aa8.tar.gz llvm-1a8935ada7cb0bb7943e18f2bc9f6d7a89887aa8.tar.bz2 |
[DebugInfo] Report errors when DWARFUnitHeader::applyIndexEntry fails (#89156)
Motivation: LLDB is able to report errors about these scenarios whereas
LLVM's DWARF parser only gives a boolean success/fail. I want to migrate
LLDB to using LLVM's DWARFUnitHeader class, but I don't want to lose
some of the error reporting, so I'm adding it to the LLVM class first.
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp index 9f455fa..bdd04b0 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -98,8 +98,12 @@ void DWARFUnitVector::addUnitsImpl( if (!IndexEntry) IndexEntry = Index.getFromOffset(Header.getOffset()); } - if (IndexEntry && !Header.applyIndexEntry(IndexEntry)) - return nullptr; + if (IndexEntry) { + if (Error ApplicationErr = Header.applyIndexEntry(IndexEntry)) { + Context.getWarningHandler()(std::move(ApplicationErr)); + return nullptr; + } + } std::unique_ptr<DWARFUnit> U; if (Header.isTypeUnit()) U = std::make_unique<DWARFTypeUnit>(Context, InfoSection, Header, DA, @@ -334,21 +338,40 @@ Error DWARFUnitHeader::extract(DWARFContext &Context, return Error::success(); } -bool DWARFUnitHeader::applyIndexEntry(const DWARFUnitIndex::Entry *Entry) { +Error DWARFUnitHeader::applyIndexEntry(const DWARFUnitIndex::Entry *Entry) { assert(Entry); assert(!IndexEntry); IndexEntry = Entry; if (AbbrOffset) - return false; + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " has a non-zero abbreviation offset", + Offset); + auto *UnitContrib = IndexEntry->getContribution(); - if (!UnitContrib || - UnitContrib->getLength() != (getLength() + getUnitLengthFieldByteSize())) - return false; + if (!UnitContrib) + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " has no contribution index", + Offset); + + uint64_t IndexLength = getLength() + getUnitLengthFieldByteSize(); + if (UnitContrib->getLength() != IndexLength) + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " has an inconsistent index (expected: %" PRIu64 + ", actual: %" PRIu64 ")", + Offset, UnitContrib->getLength(), IndexLength); + auto *AbbrEntry = IndexEntry->getContribution(DW_SECT_ABBREV); if (!AbbrEntry) - return false; + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " missing abbreviation column", + Offset); + AbbrOffset = AbbrEntry->getOffset(); - return true; + return Error::success(); } Error DWARFUnit::extractRangeList(uint64_t RangeListOffset, |