//===-- DWARFBaseDIE.cpp --------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "DWARFBaseDIE.h" #include "DWARFUnit.h" #include "DWARFDebugInfoEntry.h" #include "SymbolFileDWARF.h" #include "lldb/Core/Module.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Utility/Log.h" #include using namespace lldb_private; using namespace lldb_private::plugin::dwarf; std::optional DWARFBaseDIE::GetDIERef() const { if (!IsValid()) return std::nullopt; return DIERef(m_cu->GetSymbolFileDWARF().GetFileIndex(), m_cu->GetDebugSection(), m_die->GetOffset()); } dw_tag_t DWARFBaseDIE::Tag() const { if (m_die) return m_die->Tag(); else return llvm::dwarf::DW_TAG_null; } const char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr, const char *fail_value) const { if (IsValid()) return m_die->GetAttributeValueAsString(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(GetCU(), attr, fail_value); else return fail_value; } std::optional DWARFBaseDIE::GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const { if (IsValid()) return m_die->GetAttributeValueAsOptionalUnsigned(GetCU(), attr); return std::nullopt; } uint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr, uint64_t fail_value) const { if (IsValid()) return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value); else return fail_value; } lldb::user_id_t DWARFBaseDIE::GetID() const { const std::optional &ref = this->GetDIERef(); if (ref) return ref->get_id(); return LLDB_INVALID_UID; } const char *DWARFBaseDIE::GetName() const { if (IsValid()) return m_die->GetName(m_cu); else return nullptr; } lldb::ModuleSP DWARFBaseDIE::GetModule() const { SymbolFileDWARF *dwarf = GetDWARF(); if (dwarf) return dwarf->GetObjectFile()->GetModule(); else return lldb::ModuleSP(); } dw_offset_t DWARFBaseDIE::GetOffset() const { if (IsValid()) return m_die->GetOffset(); else return DW_INVALID_OFFSET; } SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const { if (m_cu) return &m_cu->GetSymbolFileDWARF(); 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); } DWARFAttributes DWARFBaseDIE::GetAttributes(Recurse recurse) const { if (IsValid()) return m_die->GetAttributes(m_cu, recurse); return DWARFAttributes(); } namespace lldb_private::plugin { namespace dwarf { 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); } } // namespace dwarf } // namespace lldb_private::plugin const DWARFDataExtractor &DWARFBaseDIE::GetData() const { // Clients must check if this DIE is valid before calling this function. assert(IsValid()); return m_cu->GetData(); }