summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DIERef.cpp9
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DIERef.h44
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp9
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/HashedNameToDIE.h2
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp9
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h5
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp7
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());
}
OpenPOWER on IntegriCloud