Index: source/Plugins/SymbolFile/DWARF/CMakeLists.txt =================================================================== --- source/Plugins/SymbolFile/DWARF/CMakeLists.txt +++ source/Plugins/SymbolFile/DWARF/CMakeLists.txt @@ -23,6 +23,7 @@ DWARFDefines.cpp DWARFDIE.cpp DWARFDIECollection.cpp + DWARFFirstDIE.cpp DWARFFormValue.cpp DWARFIndex.cpp DWARFUnit.cpp Index: source/Plugins/SymbolFile/DWARF/DWARFDIE.h =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFDIE.h +++ source/Plugins/SymbolFile/DWARF/DWARFDIE.h @@ -10,125 +10,34 @@ #ifndef SymbolFileDWARF_DWARFDIE_h_ #define SymbolFileDWARF_DWARFDIE_h_ -#include "lldb/Core/dwarf.h" -#include "lldb/lldb-types.h" - -struct DIERef; -class DWARFASTParser; -class DWARFAttributes; -class DWARFUnit; -class DWARFDebugInfoEntry; -class DWARFDeclContext; -class DWARFDIECollection; -class SymbolFileDWARF; - -class DWARFDIE { -public: - DWARFDIE() : m_cu(nullptr), m_die(nullptr) {} - - DWARFDIE(DWARFUnit *cu, DWARFDebugInfoEntry *die) - : m_cu(cu), m_die(die) {} - - DWARFDIE(const DWARFUnit *cu, DWARFDebugInfoEntry *die) - : m_cu(const_cast(cu)), m_die(die) {} +#include "DWARFFirstDIE.h" - DWARFDIE(DWARFUnit *cu, const DWARFDebugInfoEntry *die) - : m_cu(cu), m_die(const_cast(die)) {} - - DWARFDIE(const DWARFUnit *cu, const DWARFDebugInfoEntry *die) - : m_cu(const_cast(cu)), - m_die(const_cast(die)) {} +class DWARFDIE : public DWARFFirstDIE { +public: + using DWARFFirstDIE::DWARFFirstDIE; //---------------------------------------------------------------------- // Tests //---------------------------------------------------------------------- - explicit operator bool() const { return IsValid(); } - - bool IsValid() const { return m_cu && m_die; } - bool IsStructOrClass() const; - bool HasChildren() const; - - bool Supports_DW_AT_APPLE_objc_complete_type() const; - //---------------------------------------------------------------------- // Accessors //---------------------------------------------------------------------- - SymbolFileDWARF *GetDWARF() const; - - DWARFUnit *GetCU() const { return m_cu; } - - DWARFDebugInfoEntry *GetDIE() const { return m_die; } - - DIERef GetDIERef() const; - - lldb_private::TypeSystem *GetTypeSystem() const; - - DWARFASTParser *GetDWARFParser() const; - - void Set(DWARFUnit *cu, DWARFDebugInfoEntry *die) { - if (cu && die) { - m_cu = cu; - m_die = die; - } else { - Clear(); - } - } - - void Clear() { - m_cu = nullptr; - m_die = nullptr; - } - lldb::ModuleSP GetContainingDWOModule() const; DWARFDIE GetContainingDWOModuleDIE() const; - //---------------------------------------------------------------------- - // Get the data that contains the attribute values for this DIE. Support - // for .debug_types means that any DIE can have its data either in the - // .debug_info or the .debug_types section; this method will return the - // correct section data. - // - // Clients must validate that this object is valid before calling this. - //---------------------------------------------------------------------- - const lldb_private::DWARFDataExtractor &GetData() const; - //---------------------------------------------------------------------- // Accessing information about a DIE //---------------------------------------------------------------------- - dw_tag_t Tag() const; - - const char *GetTagAsCString() const; - - dw_offset_t GetOffset() const; - - dw_offset_t GetCompileUnitRelativeOffset() const; - - //---------------------------------------------------------------------- - // Get the LLDB user ID for this DIE. This is often just the DIE offset, - // but it might have a SymbolFileDWARF::GetID() in the high 32 bits if - // we are doing Darwin DWARF in .o file, or DWARF stand alone debug - // info. - //---------------------------------------------------------------------- - lldb::user_id_t GetID() const; - - const char *GetName() const; - const char *GetMangledName() const; const char *GetPubname() const; const char *GetQualifiedName(std::string &storage) const; - lldb::LanguageType GetLanguage() const; - - lldb::ModuleSP GetModule() const; - - lldb_private::CompileUnit *GetLLDBCompileUnit() const; - lldb_private::Type *ResolveType() const; //---------------------------------------------------------------------- @@ -159,6 +68,7 @@ //---------------------------------------------------------------------- DWARFDIE GetDIE(dw_offset_t die_offset) const; + using DWARFFirstDIE::GetDIE; DWARFDIE LookupDeepestBlock(lldb::addr_t file_addr) const; @@ -182,26 +92,9 @@ // looking for one or two attributes on a DIE. If you are trying to // parse all attributes, use GetAttributes (...) instead //---------------------------------------------------------------------- - const char *GetAttributeValueAsString(const dw_attr_t attr, - const char *fail_value) const; - - uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr, - uint64_t fail_value) const; - - int64_t GetAttributeValueAsSigned(const dw_attr_t attr, - int64_t fail_value) const; - - uint64_t GetAttributeValueAsReference(const dw_attr_t attr, - uint64_t fail_value) const; - DWARFDIE GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const; - uint64_t GetAttributeValueAsAddress(const dw_attr_t attr, - uint64_t fail_value) const; - - size_t GetAttributes(DWARFAttributes &attributes, uint32_t depth = 0) const; - bool GetDIENamesAndRanges(const char *&name, const char *&mangled, DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column, int &call_file, @@ -209,23 +102,14 @@ lldb_private::DWARFExpression *frame_base) const; //---------------------------------------------------------------------- - // Pretty printing + // CompilerDecl related functions //---------------------------------------------------------------------- - void Dump(lldb_private::Stream *s, const uint32_t recurse_depth) const; - lldb_private::CompilerDecl GetDecl() const; lldb_private::CompilerDeclContext GetDeclContext() const; lldb_private::CompilerDeclContext GetContainingDeclContext() const; - -protected: - DWARFUnit *m_cu; - DWARFDebugInfoEntry *m_die; }; -bool operator==(const DWARFDIE &lhs, const DWARFDIE &rhs); -bool operator!=(const DWARFDIE &lhs, const DWARFDIE &rhs); - #endif // SymbolFileDWARF_DWARFDIE_h_ Index: source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -12,43 +12,13 @@ #include "DWARFASTParser.h" #include "DWARFUnit.h" #include "DWARFDIECollection.h" -#include "DWARFDebugAbbrev.h" -#include "DWARFDebugAranges.h" #include "DWARFDebugInfo.h" -#include "DWARFDebugInfoEntry.h" -#include "DWARFDebugRanges.h" #include "DWARFDeclContext.h" -#include "DWARFFormValue.h" -#include "SymbolFileDWARF.h" -#include "lldb/Core/Module.h" -#include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/Type.h" -#include "lldb/Symbol/TypeSystem.h" +#include "DWARFDebugInfoEntry.h" using namespace lldb_private; -DIERef DWARFDIE::GetDIERef() const { - if (!IsValid()) - return DIERef(); - - dw_offset_t cu_offset = m_cu->GetOffset(); - if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET) - cu_offset = m_cu->GetBaseObjOffset(); - return DIERef(cu_offset, m_die->GetOffset()); -} - -dw_tag_t DWARFDIE::Tag() const { - if (m_die) - return m_die->Tag(); - else - return 0; -} - -const char *DWARFDIE::GetTagAsCString() const { - return lldb_private::DW_TAG_value_to_name(Tag()); -} - DWARFDIE DWARFDIE::GetParent() const { if (IsValid()) @@ -91,33 +61,6 @@ return DWARFDIE(); } -const char *DWARFDIE::GetAttributeValueAsString(const dw_attr_t attr, - const char *fail_value) const { - if (IsValid()) - return m_die->GetAttributeValueAsString(GetDWARF(), GetCU(), attr, - fail_value); - else - return fail_value; -} - -uint64_t DWARFDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr, - uint64_t fail_value) const { - if (IsValid()) - return m_die->GetAttributeValueAsUnsigned(GetDWARF(), GetCU(), attr, - fail_value); - else - return fail_value; -} - -int64_t DWARFDIE::GetAttributeValueAsSigned(const dw_attr_t attr, - int64_t fail_value) const { - if (IsValid()) - return m_die->GetAttributeValueAsSigned(GetDWARF(), GetCU(), attr, - fail_value); - else - return fail_value; -} - DWARFDIE DWARFDIE::GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const { if (IsValid()) { @@ -132,24 +75,6 @@ return DWARFDIE(); } -uint64_t DWARFDIE::GetAttributeValueAsReference(const dw_attr_t attr, - uint64_t fail_value) const { - if (IsValid()) - return m_die->GetAttributeValueAsReference(GetDWARF(), GetCU(), attr, - fail_value); - else - return fail_value; -} - -uint64_t DWARFDIE::GetAttributeValueAsAddress(const dw_attr_t attr, - uint64_t fail_value) const { - if (IsValid()) - return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr, - fail_value); - else - return fail_value; -} - DWARFDIE DWARFDIE::LookupDeepestBlock(lldb::addr_t file_addr) const { if (IsValid()) { @@ -171,17 +96,6 @@ return DWARFDIE(); } -lldb::user_id_t DWARFDIE::GetID() const { - return GetDIERef().GetUID(GetDWARF()); -} - -const char *DWARFDIE::GetName() const { - if (IsValid()) - return m_die->GetName(GetDWARF(), m_cu); - else - return nullptr; -} - const char *DWARFDIE::GetMangledName() const { if (IsValid()) return m_die->GetMangledName(GetDWARF(), m_cu); @@ -203,28 +117,6 @@ return nullptr; } -lldb::LanguageType DWARFDIE::GetLanguage() const { - if (IsValid()) - return m_cu->GetLanguageType(); - else - return lldb::eLanguageTypeUnknown; -} - -lldb::ModuleSP DWARFDIE::GetModule() const { - SymbolFileDWARF *dwarf = GetDWARF(); - if (dwarf) - return dwarf->GetObjectFile()->GetModule(); - else - return lldb::ModuleSP(); -} - -lldb_private::CompileUnit *DWARFDIE::GetLLDBCompileUnit() const { - if (IsValid()) - return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU()); - else - return nullptr; -} - lldb_private::Type *DWARFDIE::ResolveType() const { if (IsValid()) return GetDWARF()->ResolveType(*this, true); @@ -317,42 +209,6 @@ return DWARFDIE(); } -dw_offset_t DWARFDIE::GetOffset() const { - if (IsValid()) - return m_die->GetOffset(); - else - return DW_INVALID_OFFSET; -} - -dw_offset_t DWARFDIE::GetCompileUnitRelativeOffset() const { - if (IsValid()) - return m_die->GetOffset() - m_cu->GetOffset(); - else - return DW_INVALID_OFFSET; -} - -SymbolFileDWARF *DWARFDIE::GetDWARF() const { - if (m_cu) - return m_cu->GetSymbolFileDWARF(); - else - return nullptr; -} - -lldb_private::TypeSystem *DWARFDIE::GetTypeSystem() const { - if (m_cu) - return m_cu->GetTypeSystem(); - else - return nullptr; -} - -DWARFASTParser *DWARFDIE::GetDWARFParser() const { - lldb_private::TypeSystem *type_system = GetTypeSystem(); - if (type_system) - return type_system->GetDWARFParser(); - else - return nullptr; -} - bool DWARFDIE::IsStructOrClass() const { const dw_tag_t tag = Tag(); return tag == DW_TAG_class_type || tag == DW_TAG_structure_type; @@ -391,25 +247,6 @@ return lldb::ModuleSP(); } -bool DWARFDIE::HasChildren() const { - return m_die && m_die->HasChildren(); -} - -bool DWARFDIE::Supports_DW_AT_APPLE_objc_complete_type() const { - return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); -} - -size_t DWARFDIE::GetAttributes(DWARFAttributes &attributes, - uint32_t depth) const { - if (IsValid()) { - return m_die->GetAttributes(m_cu, m_cu->GetFixedFormSizes(), attributes, - depth); - } - if (depth == 0) - attributes.Clear(); - return 0; -} - bool DWARFDIE::GetDIENamesAndRanges( const char *&name, const char *&mangled, DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column, int &call_file, @@ -423,12 +260,6 @@ return false; } -void DWARFDIE::Dump(lldb_private::Stream *s, - const uint32_t recurse_depth) const { - if (s && IsValid()) - m_die->Dump(GetDWARF(), GetCU(), *s, recurse_depth); -} - CompilerDecl DWARFDIE::GetDecl() const { DWARFASTParser *dwarf_ast = GetDWARFParser(); if (dwarf_ast) @@ -452,17 +283,3 @@ else return CompilerDeclContext(); } - -bool operator==(const DWARFDIE &lhs, const DWARFDIE &rhs) { - return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); -} - -bool operator!=(const DWARFDIE &lhs, const DWARFDIE &rhs) { - return !(lhs == rhs); -} - -const DWARFDataExtractor &DWARFDIE::GetData() const { - // Clients must check if this DIE is valid before calling this function. - assert(IsValid()); - return m_cu->GetData(); -} Index: source/Plugins/SymbolFile/DWARF/DWARFFirstDIE.h =================================================================== --- /dev/null +++ source/Plugins/SymbolFile/DWARF/DWARFFirstDIE.h @@ -0,0 +1,157 @@ +//===-- DWARFFirstDIE.h -----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef SymbolFileDWARF_DWARFFirstDIE_h_ +#define SymbolFileDWARF_DWARFFirstDIE_h_ + +#include "lldb/Core/dwarf.h" +#include "lldb/lldb-types.h" + +struct DIERef; +class DWARFASTParser; +class DWARFAttributes; +class DWARFUnit; +class DWARFDebugInfoEntry; +class DWARFDeclContext; +class DWARFDIECollection; +class SymbolFileDWARF; + +class DWARFFirstDIE { +public: + DWARFFirstDIE() : m_cu(nullptr), m_die(nullptr) {} + + DWARFFirstDIE(DWARFUnit *cu, DWARFDebugInfoEntry *die) + : m_cu(cu), m_die(die) {} + + DWARFFirstDIE(const DWARFUnit *cu, DWARFDebugInfoEntry *die) + : m_cu(const_cast(cu)), m_die(die) {} + + DWARFFirstDIE(DWARFUnit *cu, const DWARFDebugInfoEntry *die) + : m_cu(cu), m_die(const_cast(die)) {} + + DWARFFirstDIE(const DWARFUnit *cu, const DWARFDebugInfoEntry *die) + : m_cu(const_cast(cu)), + m_die(const_cast(die)) {} + + //---------------------------------------------------------------------- + // Tests + //---------------------------------------------------------------------- + explicit operator bool() const { return IsValid(); } + + bool IsValid() const { return m_cu && m_die; } + + bool HasChildren() const; + + bool Supports_DW_AT_APPLE_objc_complete_type() const; + + //---------------------------------------------------------------------- + // Accessors + //---------------------------------------------------------------------- + SymbolFileDWARF *GetDWARF() const; + + DWARFUnit *GetCU() const { return m_cu; } + + DWARFDebugInfoEntry *GetDIE() const { return m_die; } + + DIERef GetDIERef() const; + + lldb_private::TypeSystem *GetTypeSystem() const; + + DWARFASTParser *GetDWARFParser() const; + + void Set(DWARFUnit *cu, DWARFDebugInfoEntry *die) { + if (cu && die) { + m_cu = cu; + m_die = die; + } else { + Clear(); + } + } + + void Clear() { + m_cu = nullptr; + m_die = nullptr; + } + + //---------------------------------------------------------------------- + // Get the data that contains the attribute values for this DIE. Support + // for .debug_types means that any DIE can have its data either in the + // .debug_info or the .debug_types section; this method will return the + // correct section data. + // + // Clients must validate that this object is valid before calling this. + //---------------------------------------------------------------------- + const lldb_private::DWARFDataExtractor &GetData() const; + + //---------------------------------------------------------------------- + // Accessing information about a DIE + //---------------------------------------------------------------------- + dw_tag_t Tag() const; + + const char *GetTagAsCString() const; + + dw_offset_t GetOffset() const; + + dw_offset_t GetCompileUnitRelativeOffset() const; + + //---------------------------------------------------------------------- + // Get the LLDB user ID for this DIE. This is often just the DIE offset, + // but it might have a SymbolFileDWARF::GetID() in the high 32 bits if + // we are doing Darwin DWARF in .o file, or DWARF stand alone debug + // info. + //---------------------------------------------------------------------- + lldb::user_id_t GetID() const; + + const char *GetName() const; + + lldb::LanguageType GetLanguage() const; + + lldb::ModuleSP GetModule() const; + + lldb_private::CompileUnit *GetLLDBCompileUnit() const; + + //---------------------------------------------------------------------- + // Getting attribute values from the DIE. + // + // GetAttributeValueAsXXX() functions should only be used if you are + // looking for one or two attributes on a DIE. If you are trying to + // parse all attributes, use GetAttributes (...) instead + //---------------------------------------------------------------------- + const char *GetAttributeValueAsString(const dw_attr_t attr, + const char *fail_value) const; + + uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr, + uint64_t fail_value) const; + + int64_t GetAttributeValueAsSigned(const dw_attr_t attr, + int64_t fail_value) const; + + uint64_t GetAttributeValueAsReference(const dw_attr_t attr, + uint64_t fail_value) const; + + uint64_t GetAttributeValueAsAddress(const dw_attr_t attr, + uint64_t fail_value) const; + + size_t GetAttributes(DWARFAttributes &attributes, uint32_t depth = 0) const; + + //---------------------------------------------------------------------- + // Pretty printing + //---------------------------------------------------------------------- + + void Dump(lldb_private::Stream *s, const uint32_t recurse_depth) const; + +protected: + DWARFUnit *m_cu; + DWARFDebugInfoEntry *m_die; +}; + +bool operator==(const DWARFFirstDIE &lhs, const DWARFFirstDIE &rhs); +bool operator!=(const DWARFFirstDIE &lhs, const DWARFFirstDIE &rhs); + +#endif // SymbolFileDWARF_DWARFFirstDIE_h_ Index: source/Plugins/SymbolFile/DWARF/DWARFFirstDIE.cpp =================================================================== --- /dev/null +++ source/Plugins/SymbolFile/DWARF/DWARFFirstDIE.cpp @@ -0,0 +1,193 @@ +//===-- DWARFFirstDIE.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "DWARFFirstDIE.h" + +#include "DWARFUnit.h" +#include "DWARFDebugInfoEntry.h" +#include "SymbolFileDWARF.h" + +#include "lldb/Core/Module.h" +#include "lldb/Symbol/ObjectFile.h" + +using namespace lldb_private; + +DIERef DWARFFirstDIE::GetDIERef() const { + if (!IsValid()) + return DIERef(); + + dw_offset_t cu_offset = m_cu->GetOffset(); + if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET) + cu_offset = m_cu->GetBaseObjOffset(); + return DIERef(cu_offset, m_die->GetOffset()); +} + +dw_tag_t DWARFFirstDIE::Tag() const { + if (m_die) + return m_die->Tag(); + else + return 0; +} + +const char *DWARFFirstDIE::GetTagAsCString() const { + return lldb_private::DW_TAG_value_to_name(Tag()); +} + +const char *DWARFFirstDIE::GetAttributeValueAsString(const dw_attr_t attr, + const char *fail_value) const { + if (IsValid()) + return m_die->GetAttributeValueAsString(GetDWARF(), GetCU(), attr, + fail_value); + else + return fail_value; +} + +uint64_t DWARFFirstDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr, + uint64_t fail_value) const { + if (IsValid()) + return m_die->GetAttributeValueAsUnsigned(GetDWARF(), GetCU(), attr, + fail_value); + else + return fail_value; +} + +int64_t DWARFFirstDIE::GetAttributeValueAsSigned(const dw_attr_t attr, + int64_t fail_value) const { + if (IsValid()) + return m_die->GetAttributeValueAsSigned(GetDWARF(), GetCU(), attr, + fail_value); + else + return fail_value; +} + +uint64_t DWARFFirstDIE::GetAttributeValueAsReference(const dw_attr_t attr, + uint64_t fail_value) const { + if (IsValid()) + return m_die->GetAttributeValueAsReference(GetDWARF(), GetCU(), attr, + fail_value); + else + return fail_value; +} + +uint64_t DWARFFirstDIE::GetAttributeValueAsAddress(const dw_attr_t attr, + uint64_t fail_value) const { + if (IsValid()) + return m_die->GetAttributeValueAsAddress(GetDWARF(), GetCU(), attr, + fail_value); + else + return fail_value; +} + +lldb::user_id_t DWARFFirstDIE::GetID() const { + return GetDIERef().GetUID(GetDWARF()); +} + +const char *DWARFFirstDIE::GetName() const { + if (IsValid()) + return m_die->GetName(GetDWARF(), m_cu); + else + return nullptr; +} + +lldb::LanguageType DWARFFirstDIE::GetLanguage() const { + if (IsValid()) + return m_cu->GetLanguageType(); + else + return lldb::eLanguageTypeUnknown; +} + +lldb::ModuleSP DWARFFirstDIE::GetModule() const { + SymbolFileDWARF *dwarf = GetDWARF(); + if (dwarf) + return dwarf->GetObjectFile()->GetModule(); + else + return lldb::ModuleSP(); +} + +lldb_private::CompileUnit *DWARFFirstDIE::GetLLDBCompileUnit() const { + if (IsValid()) + return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU()); + else + return nullptr; +} + +dw_offset_t DWARFFirstDIE::GetOffset() const { + if (IsValid()) + return m_die->GetOffset(); + else + return DW_INVALID_OFFSET; +} + +dw_offset_t DWARFFirstDIE::GetCompileUnitRelativeOffset() const { + if (IsValid()) + return m_die->GetOffset() - m_cu->GetOffset(); + else + return DW_INVALID_OFFSET; +} + +SymbolFileDWARF *DWARFFirstDIE::GetDWARF() const { + if (m_cu) + return m_cu->GetSymbolFileDWARF(); + else + return nullptr; +} + +lldb_private::TypeSystem *DWARFFirstDIE::GetTypeSystem() const { + if (m_cu) + return m_cu->GetTypeSystem(); + else + return nullptr; +} + +DWARFASTParser *DWARFFirstDIE::GetDWARFParser() const { + lldb_private::TypeSystem *type_system = GetTypeSystem(); + if (type_system) + return type_system->GetDWARFParser(); + else + return nullptr; +} + +bool DWARFFirstDIE::HasChildren() const { + return m_die && m_die->HasChildren(); +} + +bool DWARFFirstDIE::Supports_DW_AT_APPLE_objc_complete_type() const { + return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); +} + +size_t DWARFFirstDIE::GetAttributes(DWARFAttributes &attributes, + uint32_t depth) const { + if (IsValid()) { + return m_die->GetAttributes(m_cu, m_cu->GetFixedFormSizes(), attributes, + depth); + } + if (depth == 0) + attributes.Clear(); + return 0; +} + +void DWARFFirstDIE::Dump(lldb_private::Stream *s, + const uint32_t recurse_depth) const { + if (s && IsValid()) + m_die->Dump(GetDWARF(), GetCU(), *s, recurse_depth); +} + +bool operator==(const DWARFFirstDIE &lhs, const DWARFFirstDIE &rhs) { + return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); +} + +bool operator!=(const DWARFFirstDIE &lhs, const DWARFFirstDIE &rhs) { + return !(lhs == rhs); +} + +const DWARFDataExtractor &DWARFFirstDIE::GetData() const { + // Clients must check if this DIE is valid before calling this function. + assert(IsValid()); + return m_cu->GetData(); +}