diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h @@ -80,7 +80,7 @@ uint64_t *offset_ptr, DWARFSectionKind SectionKind); // For units in DWARF Package File, remember the index entry and update // the abbreviation offset read by extract(). - bool applyIndexEntry(const DWARFUnitIndex::Entry *Entry); + Error applyIndexEntry(const DWARFUnitIndex::Entry *Entry); uint64_t getOffset() const { return Offset; } const dwarf::FormParams &getFormParams() const { return FormParams; } uint16_t getVersion() const { return FormParams.Version; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp @@ -95,8 +95,12 @@ if (!IndexEntry) IndexEntry = Index.getFromOffset(Header.getOffset()); } - if (IndexEntry && !Header.applyIndexEntry(IndexEntry)) - return nullptr; + if (IndexEntry) { + if (Error Err = Header.applyIndexEntry(IndexEntry)) { + Context.getWarningHandler()(std::move(Err)); + return nullptr; + } + } std::unique_ptr U; if (Header.isTypeUnit()) U = std::make_unique(Context, InfoSection, Header, DA, @@ -345,21 +349,33 @@ return true; } -bool DWARFUnitHeader::applyIndexEntry(const DWARFUnitIndex::Entry *Entry) { +Error DWARFUnitHeader::applyIndexEntry(const DWARFUnitIndex::Entry *Entry) { assert(Entry); assert(!IndexEntry); - IndexEntry = Entry; if (AbbrOffset) - return false; - auto *UnitContrib = IndexEntry->getContribution(); + return createStringError( + errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " has a non-zero abbreviation offset prior to applying an index entry", + Offset); + + auto *UnitContrib = Entry->getContribution(); if (!UnitContrib || UnitContrib->getLength() != (getLength() + getUnitLengthFieldByteSize())) - return false; - auto *AbbrEntry = IndexEntry->getContribution(DW_SECT_ABBREV); + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " has an inconsistent unit index", + Offset); + + auto *AbbrEntry = Entry->getContribution(DW_SECT_ABBREV); if (!AbbrEntry) - return false; + return createStringError(errc::invalid_argument, + "DWARF package unit at offset 0x%8.8" PRIx64 + " is missing an abbreviation column", + Offset); AbbrOffset = AbbrEntry->getOffset(); - return true; + IndexEntry = Entry; + return Error::success(); } Error DWARFUnit::extractRangeList(uint64_t RangeListOffset,