[Lldb-commits] [lldb] [lldb] Switch to llvm::DWARFUnitHeader (PR #89808)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 23 12:16:03 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Alex Langford (bulbazord)
<details>
<summary>Changes</summary>
These are now close enough that they can be swapped out.
---
Full diff: https://github.com/llvm/llvm-project/pull/89808.diff
4 Files Affected:
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h (+1-1)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFTypeUnit.h (+3-3)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp (+34-103)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h (+10-58)
``````````diff
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
index dd130977d4b1fb..b8344f548ac3dc 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
@@ -32,7 +32,7 @@ class DWARFCompileUnit : public DWARFUnit {
private:
DWARFCompileUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
- const DWARFUnitHeader &header,
+ const llvm::DWARFUnitHeader &header,
const llvm::DWARFAbbreviationDeclarationSet &abbrevs,
DIERef::Section section, bool is_dwo)
: DWARFUnit(dwarf, uid, header, abbrevs, section, is_dwo) {}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFTypeUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFTypeUnit.h
index 7b58c632c6c5be..8c1f932d8c7fa4 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFTypeUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFTypeUnit.h
@@ -24,15 +24,15 @@ class DWARFTypeUnit : public DWARFUnit {
void Dump(Stream *s) const override;
- uint64_t GetTypeHash() { return m_header.GetTypeHash(); }
+ uint64_t GetTypeHash() { return m_header.getTypeHash(); }
- dw_offset_t GetTypeOffset() { return GetOffset() + m_header.GetTypeOffset(); }
+ dw_offset_t GetTypeOffset() { return GetOffset() + m_header.getTypeOffset(); }
static bool classof(const DWARFUnit *unit) { return unit->IsTypeUnit(); }
private:
DWARFTypeUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
- const DWARFUnitHeader &header,
+ const llvm::DWARFUnitHeader &header,
const llvm::DWARFAbbreviationDeclarationSet &abbrevs,
DIERef::Section section, bool is_dwo)
: DWARFUnit(dwarf, uid, header, abbrevs, section, is_dwo) {}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index e28036d34b34a6..dabc595427dfa1 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -33,12 +33,12 @@ using namespace lldb_private::plugin::dwarf;
extern int g_verbose;
DWARFUnit::DWARFUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
- const DWARFUnitHeader &header,
+ const llvm::DWARFUnitHeader &header,
const llvm::DWARFAbbreviationDeclarationSet &abbrevs,
DIERef::Section section, bool is_dwo)
: UserID(uid), m_dwarf(dwarf), m_header(header), m_abbrevs(&abbrevs),
m_cancel_scopes(false), m_section(section), m_is_dwo(is_dwo),
- m_has_parsed_non_skeleton_unit(false), m_dwo_id(header.GetDWOId()) {}
+ m_has_parsed_non_skeleton_unit(false), m_dwo_id(header.getDWOId()) {}
DWARFUnit::~DWARFUnit() = default;
@@ -345,7 +345,7 @@ void DWARFUnit::ExtractDIEsRWLocked() {
void DWARFUnit::SetDwoStrOffsetsBase() {
lldb::offset_t baseOffset = 0;
- if (const llvm::DWARFUnitIndex::Entry *entry = m_header.GetIndexEntry()) {
+ if (const llvm::DWARFUnitIndex::Entry *entry = m_header.getIndexEntry()) {
if (const auto *contribution =
entry->getContribution(llvm::DW_SECT_STR_OFFSETS))
baseOffset = contribution->getOffset();
@@ -489,7 +489,7 @@ ParseListTableHeader(const llvm::DWARFDataExtractor &data, uint64_t offset,
void DWARFUnit::SetLoclistsBase(dw_addr_t loclists_base) {
uint64_t offset = 0;
- if (const llvm::DWARFUnitIndex::Entry *entry = m_header.GetIndexEntry()) {
+ if (const llvm::DWARFUnitIndex::Entry *entry = m_header.getIndexEntry()) {
const auto *contribution = entry->getContribution(llvm::DW_SECT_LOCLISTS);
if (!contribution) {
GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError(
@@ -533,7 +533,7 @@ DWARFDataExtractor DWARFUnit::GetLocationData() const {
DWARFContext &Ctx = GetSymbolFileDWARF().GetDWARFContext();
const DWARFDataExtractor &data =
GetVersion() >= 5 ? Ctx.getOrLoadLocListsData() : Ctx.getOrLoadLocData();
- if (const llvm::DWARFUnitIndex::Entry *entry = m_header.GetIndexEntry()) {
+ if (const llvm::DWARFUnitIndex::Entry *entry = m_header.getIndexEntry()) {
if (const auto *contribution = entry->getContribution(
GetVersion() >= 5 ? llvm::DW_SECT_LOCLISTS : llvm::DW_SECT_EXT_LOC))
return DWARFDataExtractor(data, contribution->getOffset(),
@@ -546,7 +546,7 @@ DWARFDataExtractor DWARFUnit::GetLocationData() const {
DWARFDataExtractor DWARFUnit::GetRnglistData() const {
DWARFContext &Ctx = GetSymbolFileDWARF().GetDWARFContext();
const DWARFDataExtractor &data = Ctx.getOrLoadRngListsData();
- if (const llvm::DWARFUnitIndex::Entry *entry = m_header.GetIndexEntry()) {
+ if (const llvm::DWARFUnitIndex::Entry *entry = m_header.getIndexEntry()) {
if (const auto *contribution =
entry->getContribution(llvm::DW_SECT_RNGLISTS))
return DWARFDataExtractor(data, contribution->getOffset(),
@@ -924,84 +924,6 @@ const DWARFDebugAranges &DWARFUnit::GetFunctionAranges() {
return *m_func_aranges_up;
}
-llvm::Error DWARFUnitHeader::ApplyIndexEntry(
- const llvm::DWARFUnitIndex::Entry *index_entry) {
- // We should only be calling this function when the index entry is not set and
- // we have a valid one to set it to.
- assert(index_entry);
- assert(!m_index_entry);
-
- if (m_abbr_offset)
- return llvm::createStringError(
- llvm::inconvertibleErrorCode(),
- "Package unit with a non-zero abbreviation offset");
-
- auto *unit_contrib = index_entry->getContribution();
- if (!unit_contrib || unit_contrib->getLength32() != m_length + 4)
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "Inconsistent DWARF package unit index");
-
- auto *abbr_entry = index_entry->getContribution(llvm::DW_SECT_ABBREV);
- if (!abbr_entry)
- return llvm::createStringError(
- llvm::inconvertibleErrorCode(),
- "DWARF package index missing abbreviation column");
-
- m_abbr_offset = abbr_entry->getOffset();
- m_index_entry = index_entry;
- return llvm::Error::success();
-}
-
-llvm::Expected<DWARFUnitHeader>
-DWARFUnitHeader::extract(const DWARFDataExtractor &data,
- DIERef::Section section, DWARFContext &context,
- lldb::offset_t *offset_ptr) {
- DWARFUnitHeader header;
- header.m_offset = *offset_ptr;
- header.m_length = data.GetDWARFInitialLength(offset_ptr);
- header.m_version = data.GetU16(offset_ptr);
- if (header.m_version == 5) {
- header.m_unit_type = data.GetU8(offset_ptr);
- header.m_addr_size = data.GetU8(offset_ptr);
- header.m_abbr_offset = data.GetDWARFOffset(offset_ptr);
- if (header.m_unit_type == llvm::dwarf::DW_UT_skeleton ||
- header.m_unit_type == llvm::dwarf::DW_UT_split_compile)
- header.m_dwo_id = data.GetU64(offset_ptr);
- } else {
- header.m_abbr_offset = data.GetDWARFOffset(offset_ptr);
- header.m_addr_size = data.GetU8(offset_ptr);
- header.m_unit_type =
- section == DIERef::Section::DebugTypes ? DW_UT_type : DW_UT_compile;
- }
-
- if (header.IsTypeUnit()) {
- header.m_type_hash = data.GetU64(offset_ptr);
- header.m_type_offset = data.GetDWARFOffset(offset_ptr);
- }
-
- bool length_OK = data.ValidOffset(header.GetNextUnitOffset() - 1);
- bool version_OK = SymbolFileDWARF::SupportedVersion(header.m_version);
- bool addr_size_OK = (header.m_addr_size == 2) || (header.m_addr_size == 4) ||
- (header.m_addr_size == 8);
- bool type_offset_OK =
- !header.IsTypeUnit() || (header.m_type_offset <= header.GetLength());
-
- if (!length_OK)
- return llvm::make_error<llvm::object::GenericBinaryError>(
- "Invalid unit length");
- if (!version_OK)
- return llvm::make_error<llvm::object::GenericBinaryError>(
- "Unsupported unit version");
- if (!addr_size_OK)
- return llvm::make_error<llvm::object::GenericBinaryError>(
- "Invalid unit address size");
- if (!type_offset_OK)
- return llvm::make_error<llvm::object::GenericBinaryError>(
- "Type offset out of range");
-
- return header;
-}
-
llvm::Expected<DWARFUnitSP>
DWARFUnit::extract(SymbolFileDWARF &dwarf, user_id_t uid,
const DWARFDataExtractor &debug_info,
@@ -1009,26 +931,35 @@ DWARFUnit::extract(SymbolFileDWARF &dwarf, user_id_t uid,
assert(debug_info.ValidOffset(*offset_ptr));
DWARFContext &context = dwarf.GetDWARFContext();
- auto expected_header =
- DWARFUnitHeader::extract(debug_info, section, context, offset_ptr);
- if (!expected_header)
- return expected_header.takeError();
+
+ // FIXME: Either properly map between DIERef::Section and
+ // llvm::DWARFSectionKind or switch to llvm's definition entirely.
+ llvm::DWARFSectionKind section_kind_llvm =
+ section == DIERef::Section::DebugInfo
+ ? llvm::DWARFSectionKind::DW_SECT_INFO
+ : llvm::DWARFSectionKind::DW_SECT_EXT_TYPES;
+
+ llvm::DWARFDataExtractor debug_info_llvm = debug_info.GetAsLLVMDWARF();
+ llvm::DWARFUnitHeader header;
+ if (llvm::Error extract_err = header.extract(
+ context.GetAsLLVM(), debug_info_llvm, offset_ptr, section_kind_llvm))
+ return std::move(extract_err);
if (context.isDwo()) {
const llvm::DWARFUnitIndex::Entry *entry = nullptr;
- const llvm::DWARFUnitIndex &index = expected_header->IsTypeUnit()
+ const llvm::DWARFUnitIndex &index = header.isTypeUnit()
? context.GetAsLLVM().getTUIndex()
: context.GetAsLLVM().getCUIndex();
if (index) {
- if (expected_header->IsTypeUnit())
- entry = index.getFromHash(expected_header->GetTypeHash());
- else if (auto dwo_id = expected_header->GetDWOId())
+ if (header.isTypeUnit())
+ entry = index.getFromHash(header.getTypeHash());
+ else if (auto dwo_id = header.getDWOId())
entry = index.getFromHash(*dwo_id);
}
if (!entry)
- entry = index.getFromOffset(expected_header->GetOffset());
+ entry = index.getFromOffset(header.getOffset());
if (entry)
- if (llvm::Error err = expected_header->ApplyIndexEntry(entry))
+ if (llvm::Error err = header.applyIndexEntry(entry))
return std::move(err);
}
@@ -1039,13 +970,13 @@ DWARFUnit::extract(SymbolFileDWARF &dwarf, user_id_t uid,
bool abbr_offset_OK =
dwarf.GetDWARFContext().getOrLoadAbbrevData().ValidOffset(
- expected_header->GetAbbrOffset());
+ header.getAbbrOffset());
if (!abbr_offset_OK)
return llvm::make_error<llvm::object::GenericBinaryError>(
"Abbreviation offset for unit is not valid");
llvm::Expected<const llvm::DWARFAbbreviationDeclarationSet *> abbrevs_or_err =
- abbr->getAbbreviationDeclarationSet(expected_header->GetAbbrOffset());
+ abbr->getAbbreviationDeclarationSet(header.getAbbrOffset());
if (!abbrevs_or_err)
return abbrevs_or_err.takeError();
@@ -1055,11 +986,11 @@ DWARFUnit::extract(SymbolFileDWARF &dwarf, user_id_t uid,
"No abbrev exists at the specified offset.");
bool is_dwo = dwarf.GetDWARFContext().isDwo();
- if (expected_header->IsTypeUnit())
- return DWARFUnitSP(new DWARFTypeUnit(dwarf, uid, *expected_header, *abbrevs,
- section, is_dwo));
- return DWARFUnitSP(new DWARFCompileUnit(dwarf, uid, *expected_header,
- *abbrevs, section, is_dwo));
+ if (header.isTypeUnit())
+ return DWARFUnitSP(
+ new DWARFTypeUnit(dwarf, uid, header, *abbrevs, section, is_dwo));
+ return DWARFUnitSP(
+ new DWARFCompileUnit(dwarf, uid, header, *abbrevs, section, is_dwo));
}
const lldb_private::DWARFDataExtractor &DWARFUnit::GetData() const {
@@ -1069,7 +1000,7 @@ const lldb_private::DWARFDataExtractor &DWARFUnit::GetData() const {
}
uint32_t DWARFUnit::GetHeaderByteSize() const {
- switch (m_header.GetUnitType()) {
+ switch (m_header.getUnitType()) {
case llvm::dwarf::DW_UT_compile:
case llvm::dwarf::DW_UT_partial:
return GetVersion() < 5 ? 11 : 12;
@@ -1106,7 +1037,7 @@ DWARFUnit::FindRnglistFromOffset(dw_offset_t offset) {
llvm::DWARFDataExtractor data = GetRnglistData().GetAsLLVMDWARF();
// As DW_AT_rnglists_base may be missing we need to call setAddressSize.
- data.setAddressSize(m_header.GetAddressByteSize());
+ data.setAddressSize(m_header.getAddressByteSize());
auto range_list_or_error = GetRnglistTable()->findList(data, offset);
if (!range_list_or_error)
return range_list_or_error.takeError();
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
index 28981b51bfcb33..85c37971ced8e0 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
@@ -38,54 +38,6 @@ enum DWARFProducer {
eProducerOther
};
-/// Base class describing the header of any kind of "unit." Some information
-/// is specific to certain unit types. We separate this class out so we can
-/// parse the header before deciding what specific kind of unit to construct.
-class DWARFUnitHeader {
- dw_offset_t m_offset = 0;
- dw_offset_t m_length = 0;
- uint16_t m_version = 0;
- dw_offset_t m_abbr_offset = 0;
-
- const llvm::DWARFUnitIndex::Entry *m_index_entry = nullptr;
-
- uint8_t m_unit_type = 0;
- uint8_t m_addr_size = 0;
-
- uint64_t m_type_hash = 0;
- uint32_t m_type_offset = 0;
-
- std::optional<uint64_t> m_dwo_id;
-
- DWARFUnitHeader() = default;
-
-public:
- dw_offset_t GetOffset() const { return m_offset; }
- uint16_t GetVersion() const { return m_version; }
- uint16_t GetAddressByteSize() const { return m_addr_size; }
- dw_offset_t GetLength() const { return m_length; }
- dw_offset_t GetAbbrOffset() const { return m_abbr_offset; }
- uint8_t GetUnitType() const { return m_unit_type; }
- const llvm::DWARFUnitIndex::Entry *GetIndexEntry() const {
- return m_index_entry;
- }
- uint64_t GetTypeHash() const { return m_type_hash; }
- dw_offset_t GetTypeOffset() const { return m_type_offset; }
- std::optional<uint64_t> GetDWOId() const { return m_dwo_id; }
- bool IsTypeUnit() const {
- return m_unit_type == llvm::dwarf::DW_UT_type ||
- m_unit_type == llvm::dwarf::DW_UT_split_type;
- }
- dw_offset_t GetNextUnitOffset() const { return m_offset + m_length + 4; }
-
- llvm::Error ApplyIndexEntry(const llvm::DWARFUnitIndex::Entry *index_entry);
-
- static llvm::Expected<DWARFUnitHeader> extract(const DWARFDataExtractor &data,
- DIERef::Section section,
- DWARFContext &dwarf_context,
- lldb::offset_t *offset_ptr);
-};
-
class DWARFUnit : public UserID {
using die_iterator_range =
llvm::iterator_range<DWARFDebugInfoEntry::collection::iterator>;
@@ -105,7 +57,7 @@ class DWARFUnit : public UserID {
/// the DWO ID in the compile unit header and we sometimes only want to access
/// this cheap value without causing the more expensive attribute fetches that
/// GetDWOId() uses.
- std::optional<uint64_t> GetHeaderDWOId() { return m_header.GetDWOId(); }
+ std::optional<uint64_t> GetHeaderDWOId() { return m_header.getDWOId(); }
void ExtractUnitDIEIfNeeded();
void ExtractUnitDIENoDwoIfNeeded();
void ExtractDIEsIfNeeded();
@@ -143,7 +95,7 @@ class DWARFUnit : public UserID {
uint32_t GetHeaderByteSize() const;
// Offset of the initial length field.
- dw_offset_t GetOffset() const { return m_header.GetOffset(); }
+ dw_offset_t GetOffset() const { return m_header.getOffset(); }
/// Get the size in bytes of the length field in the header.
///
/// In DWARF32 this is just 4 bytes
@@ -159,15 +111,15 @@ class DWARFUnit : public UserID {
dw_offset_t GetFirstDIEOffset() const {
return GetOffset() + GetHeaderByteSize();
}
- dw_offset_t GetNextUnitOffset() const { return m_header.GetNextUnitOffset(); }
+ dw_offset_t GetNextUnitOffset() const { return m_header.getNextUnitOffset(); }
// Size of the CU data (without initial length and without header).
size_t GetDebugInfoSize() const;
// Size of the CU data incl. header but without initial length.
- dw_offset_t GetLength() const { return m_header.GetLength(); }
- uint16_t GetVersion() const { return m_header.GetVersion(); }
+ dw_offset_t GetLength() const { return m_header.getLength(); }
+ uint16_t GetVersion() const { return m_header.getVersion(); }
const llvm::DWARFAbbreviationDeclarationSet *GetAbbreviations() const;
dw_offset_t GetAbbrevOffset() const;
- uint8_t GetAddressByteSize() const { return m_header.GetAddressByteSize(); }
+ uint8_t GetAddressByteSize() const { return m_header.getAddressByteSize(); }
dw_addr_t GetAddrBase() const { return m_addr_base.value_or(0); }
dw_addr_t GetBaseAddress() const { return m_base_addr; }
dw_offset_t GetLineTableOffset();
@@ -250,8 +202,8 @@ class DWARFUnit : public UserID {
DIERef::Section GetDebugSection() const { return m_section; }
- uint8_t GetUnitType() const { return m_header.GetUnitType(); }
- bool IsTypeUnit() const { return m_header.IsTypeUnit(); }
+ uint8_t GetUnitType() const { return m_header.getUnitType(); }
+ bool IsTypeUnit() const { return m_header.isTypeUnit(); }
/// Note that this check only works for DWARF5+.
bool IsSkeletonUnit() const {
return GetUnitType() == llvm::dwarf::DW_UT_skeleton;
@@ -320,7 +272,7 @@ class DWARFUnit : public UserID {
protected:
DWARFUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
- const DWARFUnitHeader &header,
+ const llvm::DWARFUnitHeader &header,
const llvm::DWARFAbbreviationDeclarationSet &abbrevs,
DIERef::Section section, bool is_dwo);
@@ -352,7 +304,7 @@ class DWARFUnit : public UserID {
SymbolFileDWARF &m_dwarf;
std::shared_ptr<DWARFUnit> m_dwo;
- DWARFUnitHeader m_header;
+ llvm::DWARFUnitHeader m_header;
const llvm::DWARFAbbreviationDeclarationSet *m_abbrevs = nullptr;
lldb_private::CompileUnit *m_lldb_cu = nullptr;
// If this is a DWO file, we have a backlink to our skeleton compile unit.
``````````
</details>
https://github.com/llvm/llvm-project/pull/89808
More information about the lldb-commits
mailing list