[llvm] [DebugInfo] Report errors when DWARFUnitHeader::applyIndexEntry fails (PR #89156)
Alex Langford via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 17 16:32:15 PDT 2024
https://github.com/bulbazord created https://github.com/llvm/llvm-project/pull/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.
>From ce40cc22d0ad193849efa6ef919adf04e4d5820e Mon Sep 17 00:00:00 2001
From: Alex Langford <alangford at apple.com>
Date: Wed, 17 Apr 2024 16:26:47 -0700
Subject: [PATCH] [DebugInfo] Report errors when
DWARFUnitHeader::applyIndexEntry fails
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.
---
llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h | 2 +-
llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp | 30 ++++++++++++++-----
2 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
index f20e71781f46be..80c27aea893123 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFUnit.h
@@ -85,7 +85,7 @@ class DWARFUnitHeader {
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
index 9f455fa7e96a7e..985566ad329f63 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,33 @@ 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 from offset 0x%8.8" PRIx64
+ " has a non-zero abbreviation offset",
+ Offset);
+
auto *UnitContrib = IndexEntry->getContribution();
if (!UnitContrib ||
UnitContrib->getLength() != (getLength() + getUnitLengthFieldByteSize()))
- return false;
+ return createStringError(errc::invalid_argument,
+ "DWARF package unit at offset 0x%8.8" PRIx64
+ "has an inconsistent index",
+ Offset);
+
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
+ " mising abbreviation column",
+ Offset);
+
AbbrOffset = AbbrEntry->getOffset();
- return true;
+ return Error::success();
}
Error DWARFUnit::extractRangeList(uint64_t RangeListOffset,
More information about the llvm-commits
mailing list