diff options
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 15 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp | 5 |
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); } |