forked from OSchip/llvm-project
[lldb/DWARF] Add is_dwo member to DWARFUnit
Summary: A skeleton unit can easily be detected by checking the m_dwo_symbol_file member, but we cannot tell a split unit from a normal unit from the "inside", which is sometimes useful. This patch adds a m_is_dwo member to enable this, and align the code with llvm::DWARFUnit. Right now it's only used to avoid creating a split unit inside another split unit (which removes one override from SymbolFileDWARFDwo and brings us a step closer to deleting it), but my main motivation is fixing the handling of location lists in mixed v4&v5 files. This comes in a separate patch. Reviewers: JDevlieghere, aprantl, clayborg Subscribers: dblaikie, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D71750
This commit is contained in:
parent
e315ce2bd3
commit
9bb01efa49
|
@ -24,8 +24,8 @@ private:
|
|||
DWARFCompileUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
|
||||
const DWARFUnitHeader &header,
|
||||
const DWARFAbbreviationDeclarationSet &abbrevs,
|
||||
DIERef::Section section)
|
||||
: DWARFUnit(dwarf, uid, header, abbrevs, section) {}
|
||||
DIERef::Section section, bool is_dwo)
|
||||
: DWARFUnit(dwarf, uid, header, abbrevs, section, is_dwo) {}
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(DWARFCompileUnit);
|
||||
|
||||
|
|
|
@ -41,8 +41,6 @@ private:
|
|||
SectionData m_data_debug_str_offsets;
|
||||
SectionData m_data_debug_types;
|
||||
|
||||
bool isDwo() { return m_dwo_section_list != nullptr; }
|
||||
|
||||
const DWARFDataExtractor &
|
||||
LoadOrGetSection(lldb::SectionType main_section_type,
|
||||
llvm::Optional<lldb::SectionType> dwo_section_type,
|
||||
|
@ -67,6 +65,8 @@ public:
|
|||
const DWARFDataExtractor &getOrLoadStrOffsetsData();
|
||||
const DWARFDataExtractor &getOrLoadDebugTypesData();
|
||||
|
||||
bool isDwo() { return m_dwo_section_list != nullptr; }
|
||||
|
||||
llvm::DWARFContext &GetAsLLVM();
|
||||
};
|
||||
} // namespace lldb_private
|
||||
|
|
|
@ -28,8 +28,8 @@ private:
|
|||
DWARFTypeUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
|
||||
const DWARFUnitHeader &header,
|
||||
const DWARFAbbreviationDeclarationSet &abbrevs,
|
||||
DIERef::Section section)
|
||||
: DWARFUnit(dwarf, uid, header, abbrevs, section) {}
|
||||
DIERef::Section section, bool is_dwo)
|
||||
: DWARFUnit(dwarf, uid, header, abbrevs, section, is_dwo) {}
|
||||
|
||||
friend class DWARFUnit;
|
||||
};
|
||||
|
|
|
@ -32,9 +32,9 @@ extern int g_verbose;
|
|||
DWARFUnit::DWARFUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
|
||||
const DWARFUnitHeader &header,
|
||||
const DWARFAbbreviationDeclarationSet &abbrevs,
|
||||
DIERef::Section section)
|
||||
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_cancel_scopes(false), m_section(section), m_is_dwo(is_dwo) {}
|
||||
|
||||
DWARFUnit::~DWARFUnit() = default;
|
||||
|
||||
|
@ -336,6 +336,9 @@ void DWARFUnit::AddUnitDIE(const DWARFDebugInfoEntry &cu_die) {
|
|||
}
|
||||
}
|
||||
|
||||
if (m_is_dwo)
|
||||
return;
|
||||
|
||||
std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file =
|
||||
m_dwarf.GetDwoSymbolFileForCompileUnit(*this, cu_die);
|
||||
if (!dwo_symbol_file)
|
||||
|
@ -872,11 +875,12 @@ DWARFUnit::extract(SymbolFileDWARF &dwarf, user_id_t uid,
|
|||
return llvm::make_error<llvm::object::GenericBinaryError>(
|
||||
"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));
|
||||
return DWARFUnitSP(
|
||||
new DWARFCompileUnit(dwarf, uid, *expected_header, *abbrevs, section));
|
||||
return DWARFUnitSP(new DWARFTypeUnit(dwarf, uid, *expected_header, *abbrevs,
|
||||
section, is_dwo));
|
||||
return DWARFUnitSP(new DWARFCompileUnit(dwarf, uid, *expected_header,
|
||||
*abbrevs, section, is_dwo));
|
||||
}
|
||||
|
||||
const lldb_private::DWARFDataExtractor &DWARFUnit::GetData() const {
|
||||
|
|
|
@ -247,7 +247,7 @@ protected:
|
|||
DWARFUnit(SymbolFileDWARF &dwarf, lldb::user_id_t uid,
|
||||
const DWARFUnitHeader &header,
|
||||
const DWARFAbbreviationDeclarationSet &abbrevs,
|
||||
DIERef::Section section);
|
||||
DIERef::Section section, bool is_dwo);
|
||||
|
||||
llvm::Error ExtractHeader(SymbolFileDWARF &dwarf,
|
||||
const lldb_private::DWARFDataExtractor &data,
|
||||
|
@ -314,6 +314,7 @@ protected:
|
|||
llvm::Optional<llvm::DWARFListTableHeader> m_loclist_table_header;
|
||||
|
||||
const DIERef::Section m_section;
|
||||
bool m_is_dwo;
|
||||
|
||||
private:
|
||||
void ParseProducerInfo();
|
||||
|
|
|
@ -287,7 +287,7 @@ public:
|
|||
|
||||
lldb::user_id_t GetUID(DIERef ref);
|
||||
|
||||
virtual std::unique_ptr<SymbolFileDWARFDwo>
|
||||
std::unique_ptr<SymbolFileDWARFDwo>
|
||||
GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu,
|
||||
const DWARFDebugInfoEntry &cu_die);
|
||||
|
||||
|
|
|
@ -47,12 +47,6 @@ public:
|
|||
DWARFDIE
|
||||
GetDIE(const DIERef &die_ref) override;
|
||||
|
||||
std::unique_ptr<SymbolFileDWARFDwo>
|
||||
GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu,
|
||||
const DWARFDebugInfoEntry &cu_die) override {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DWARFCompileUnit *GetBaseCompileUnit() override { return &m_base_dwarf_cu; }
|
||||
|
||||
llvm::Optional<uint32_t> GetDwoNum() override { return GetID() >> 32; }
|
||||
|
|
Loading…
Reference in New Issue