diff options
Diffstat (limited to 'lldb/source')
9 files changed, 65 insertions, 24 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp index 9e990ae1762..bc435bc54ae 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp @@ -160,7 +160,7 @@ void AppleDWARFIndex::ReportInvalidDIERef(const DIERef &ref, m_module.ReportErrorIfModifyDetected( "the DWARF debug information has been modified (accelerator table had " "bad die 0x%8.8x for '%s')\n", - ref.die_offset, name.str().c_str()); + ref.die_offset(), name.str().c_str()); } void AppleDWARFIndex::Dump(Stream &s) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp index c95188760d4..11dbe3c0a1f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp @@ -7,3 +7,12 @@ //===----------------------------------------------------------------------===// #include "DIERef.h" +#include "llvm/Support/Format.h" + +void llvm::format_provider<DIERef>::format(const DIERef &ref, raw_ostream &OS, + StringRef Style) { + OS << (ref.section() == DIERef::DebugInfo ? "INFO" : "TYPE"); + if (ref.unit_offset()) + OS << "/" << format_hex_no_prefix(*ref.unit_offset(), 8); + OS << "/" << format_hex_no_prefix(ref.die_offset(), 8); +} diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h index e7843da404a..476539bf840 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DIERef.h @@ -10,19 +10,51 @@ #define SymbolFileDWARF_DIERef_h_ #include "lldb/Core/dwarf.h" +#include "llvm/ADT/Optional.h" +#include "llvm/Support/FormatProviders.h" #include <vector> -struct DIERef { +/// Identifies a DWARF debug info entry within a given Module. It contains three +/// "coordinates": +/// - section: identifies the section of the debug info entry: debug_info or +/// debug_types +/// - unit_offset: the offset of the unit containing the debug info entry. For +/// regular (unsplit) units, this field is optional, as the die_offset is +/// enough to uniquely identify the containing unit. For split units, this +/// field must contain the offset of the skeleton unit in the main object +/// file. +/// - die_offset: The offset of te debug info entry as an absolute offset from +/// the beginning of the section specified in the section field. +class DIERef { +public: enum Section : uint8_t { DebugInfo, DebugTypes }; - DIERef(Section s, dw_offset_t c, dw_offset_t d) - : section(s), cu_offset(c), die_offset(d) {} + DIERef(Section s, llvm::Optional<dw_offset_t> u, dw_offset_t d) + : m_section(s), m_unit_offset(u.getValueOr(DW_INVALID_OFFSET)), + m_die_offset(d) {} - Section section; - dw_offset_t cu_offset; - dw_offset_t die_offset; + Section section() const { return static_cast<Section>(m_section); } + + llvm::Optional<dw_offset_t> unit_offset() const { + if (m_unit_offset != DW_INVALID_OFFSET) + return m_unit_offset; + return llvm::None; + } + + dw_offset_t die_offset() const { return m_die_offset; } + +private: + unsigned m_section : 1; + dw_offset_t m_unit_offset; + dw_offset_t m_die_offset; }; typedef std::vector<DIERef> DIEArray; +namespace llvm { +template<> struct format_provider<DIERef> { + static void format(const DIERef &ref, raw_ostream &OS, StringRef Style); +}; +} // namespace llvm + #endif // SymbolFileDWARF_DIERef_h_ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp index fc04580da96..cd2dfbc39f0 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp @@ -149,10 +149,9 @@ DWARFUnit *DWARFDebugInfo::GetUnitAtOffset(DIERef::Section section, } DWARFUnit *DWARFDebugInfo::GetUnit(const DIERef &die_ref) { - if (die_ref.cu_offset == DW_INVALID_OFFSET) - return GetUnitContainingDIEOffset(die_ref.section, die_ref.die_offset); - else - return GetUnitAtOffset(die_ref.section, die_ref.cu_offset); + if (die_ref.unit_offset()) + return GetUnitAtOffset(die_ref.section(), *die_ref.unit_offset()); + return GetUnitContainingDIEOffset(die_ref.section(), die_ref.die_offset()); } DWARFUnit * @@ -194,7 +193,7 @@ DWARFDIE DWARFDebugInfo::GetDIE(const DIERef &die_ref) { DWARFUnit *cu = GetUnit(die_ref); if (cu) - return cu->GetDIE(die_ref.die_offset); + return cu->GetDIE(die_ref.die_offset()); return DWARFDIE(); // Not found } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp index 5e1624a82d8..b7bbe41a7a8 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp @@ -166,7 +166,7 @@ void DebugNamesDWARFIndex::GetCompleteObjCClass(ConstString class_name, continue; DWARFUnit *cu = m_debug_info.GetUnitAtOffset(DIERef::Section::DebugInfo, - ref->cu_offset); + *ref->unit_offset()); if (!cu || !cu->Supports_DW_AT_APPLE_objc_complete_type()) { incomplete_types.push_back(*ref); continue; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h index 06e157ea5e6..ddb01de02a4 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h @@ -61,7 +61,7 @@ public: DIEInfo(dw_offset_t o, dw_tag_t t, uint32_t f, uint32_t h); explicit operator DIERef() const { - return DIERef(DIERef::Section::DebugInfo, DW_INVALID_OFFSET, die_offset); + return DIERef(DIERef::Section::DebugInfo, llvm::None, die_offset); } }; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp index 6710ae1f2c6..26b6dde781e 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp @@ -26,6 +26,7 @@ void NameToDIE::Finalize() { } void NameToDIE::Insert(ConstString name, const DIERef &die_ref) { + assert(die_ref.unit_offset().hasValue()); m_map.Append(name, die_ref); } @@ -44,7 +45,7 @@ size_t NameToDIE::FindAllEntriesForCompileUnit(dw_offset_t cu_offset, const uint32_t size = m_map.GetSize(); for (uint32_t i = 0; i < size; ++i) { const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i); - if (cu_offset == die_ref.cu_offset) + if (cu_offset == *die_ref.unit_offset()) info_array.push_back(die_ref); } return info_array.size() - initial_size; @@ -53,10 +54,8 @@ size_t NameToDIE::FindAllEntriesForCompileUnit(dw_offset_t cu_offset, void NameToDIE::Dump(Stream *s) { const uint32_t size = m_map.GetSize(); for (uint32_t i = 0; i < size; ++i) { - ConstString cstr = m_map.GetCStringAtIndex(i); - const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i); - s->Printf("%p: {0x%8.8x/0x%8.8x} \"%s\"\n", (const void *)cstr.GetCString(), - die_ref.cu_offset, die_ref.die_offset, cstr.GetCString()); + s->Format("{0} \"{1}\"\n", m_map.GetValueAtIndexUnchecked(i), + m_map.GetCStringAtIndexUnchecked(i)); } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 947cca13282..d5e2eb873ea 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -277,8 +277,9 @@ public: } lldb::user_id_t GetUID(const DIERef &ref) { - return GetID() | ref.die_offset | - (lldb::user_id_t(ref.section == DIERef::Section::DebugTypes) << 63); + return GetID() | ref.die_offset() | + (lldb::user_id_t(ref.section() == DIERef::Section::DebugTypes) + << 63); } virtual std::unique_ptr<SymbolFileDWARFDwo> diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp index e3c178c89d5..5ddbbd0c606 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp @@ -124,7 +124,8 @@ SymbolFileDWARFDwo::GetTypeSystemForLanguage(LanguageType language) { DWARFDIE SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref) { - lldbassert(die_ref.cu_offset == m_base_dwarf_cu.GetOffset() || - die_ref.cu_offset == DW_INVALID_OFFSET); - return DebugInfo()->GetDIEForDIEOffset(die_ref.section, die_ref.die_offset); + lldbassert(!die_ref.unit_offset() || + *die_ref.unit_offset() == m_base_dwarf_cu.GetOffset()); + return DebugInfo()->GetDIEForDIEOffset(die_ref.section(), + die_ref.die_offset()); } |

