//===-- DWARFBaseDIE.cpp ---------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "DWARFBaseDIE.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 DWARFBaseDIE::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 DWARFBaseDIE::Tag() const { if (m_die) return m_die->Tag(); else return 0; } const char *DWARFBaseDIE::GetTagAsCString() const { return lldb_private::DW_TAG_value_to_name(Tag()); } const char *DWARFBaseDIE::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 DWARFBaseDIE::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 DWARFBaseDIE::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 DWARFBaseDIE::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 DWARFBaseDIE::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 DWARFBaseDIE::GetID() const { return GetDIERef().GetUID(GetDWARF()); } const char *DWARFBaseDIE::GetName() const { if (IsValid()) return m_die->GetName(GetDWARF(), m_cu); else return nullptr; } lldb::LanguageType DWARFBaseDIE::GetLanguage() const { if (IsValid()) return m_cu->GetLanguageType(); else return lldb::eLanguageTypeUnknown; } lldb::ModuleSP DWARFBaseDIE::GetModule() const { SymbolFileDWARF *dwarf = GetDWARF(); if (dwarf) return dwarf->GetObjectFile()->GetModule(); else return lldb::ModuleSP(); } lldb_private::CompileUnit *DWARFBaseDIE::GetLLDBCompileUnit() const { if (IsValid()) return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU()); else return nullptr; } dw_offset_t DWARFBaseDIE::GetOffset() const { if (IsValid()) return m_die->GetOffset(); else return DW_INVALID_OFFSET; } dw_offset_t DWARFBaseDIE::GetCompileUnitRelativeOffset() const { if (IsValid()) return m_die->GetOffset() - m_cu->GetOffset(); else return DW_INVALID_OFFSET; } SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const { if (m_cu) return m_cu->GetSymbolFileDWARF(); else return nullptr; } lldb_private::TypeSystem *DWARFBaseDIE::GetTypeSystem() const { if (m_cu) return m_cu->GetTypeSystem(); else return nullptr; } DWARFASTParser *DWARFBaseDIE::GetDWARFParser() const { lldb_private::TypeSystem *type_system = GetTypeSystem(); if (type_system) return type_system->GetDWARFParser(); else return nullptr; } bool DWARFBaseDIE::HasChildren() const { return m_die && m_die->HasChildren(); } bool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const { return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); } size_t DWARFBaseDIE::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 DWARFBaseDIE::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 DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); } bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { return !(lhs == rhs); } const DWARFDataExtractor &DWARFBaseDIE::GetData() const { // Clients must check if this DIE is valid before calling this function. assert(IsValid()); return m_cu->GetData(); }