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) {
//===----------------------------------------------------------------------===//
#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);
+}
#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_
}
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 *
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
}
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;
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);
}
};
}
void NameToDIE::Insert(ConstString name, const DIERef &die_ref) {
+ assert(die_ref.unit_offset().hasValue());
m_map.Append(name, die_ref);
}
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;
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));
}
}
}
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>
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());
}