summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
Diffstat (limited to 'lldb')
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp15
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp5
2 files changed, 17 insertions, 3 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 9b01a37dfb1..622119c101b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1259,7 +1259,20 @@ SymbolFileDWARF::DecodedUID SymbolFileDWARF::DecodeUID(lldb::user_id_t uid) {
debug_map->GetOSOIndexFromUserID(uid));
return {dwarf, {DW_INVALID_OFFSET, dw_offset_t(uid)}};
}
- return {this, {dw_offset_t(uid >> 32), dw_offset_t(uid)}};
+ uint32_t dwarf_id = uid >> 32;
+ dw_offset_t die_offset = uid;
+
+ if (die_offset == DW_INVALID_OFFSET)
+ return {nullptr, DIERef()};
+
+ SymbolFileDWARF *dwarf = this;
+ if (DebugInfo()) {
+ if (DWARFUnit *unit = DebugInfo()->GetUnitAtIndex(dwarf_id)) {
+ if (unit->GetDwoSymbolFile())
+ dwarf = unit->GetDwoSymbolFile();
+ }
+ }
+ return {dwarf, {DW_INVALID_OFFSET, die_offset}};
}
DWARFDIE
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
index 3387ece3f28..7a5a9cf5210 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
@@ -23,7 +23,7 @@ SymbolFileDWARFDwo::SymbolFileDWARFDwo(ObjectFileSP objfile,
DWARFUnit *dwarf_cu)
: SymbolFileDWARF(objfile.get()), m_obj_file_sp(objfile),
m_base_dwarf_cu(dwarf_cu) {
- SetID(((lldb::user_id_t)dwarf_cu->GetOffset()) << 32);
+ SetID(((lldb::user_id_t)dwarf_cu->GetID()) << 32);
}
void SymbolFileDWARFDwo::LoadSectionData(lldb::SectionType sect_type,
@@ -158,6 +158,7 @@ SymbolFileDWARFDwo::GetTypeSystemForLanguage(LanguageType language) {
DWARFDIE
SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref) {
- lldbassert(m_base_dwarf_cu->GetOffset() == die_ref.cu_offset);
+ lldbassert(die_ref.cu_offset == m_base_dwarf_cu->GetOffset() ||
+ die_ref.cu_offset == DW_INVALID_OFFSET);
return DebugInfo()->GetDIEForDIEOffset(die_ref.die_offset);
}
OpenPOWER on IntegriCloud