Path: blob/main/contrib/llvm-project/lldb/source/Plugins/SymbolFile/DWARF/DWARFBaseDIE.cpp
39645 views
//===-- DWARFBaseDIE.cpp --------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "DWARFBaseDIE.h"910#include "DWARFUnit.h"11#include "DWARFDebugInfoEntry.h"12#include "SymbolFileDWARF.h"1314#include "lldb/Core/Module.h"15#include "lldb/Symbol/ObjectFile.h"16#include "lldb/Utility/Log.h"17#include <optional>1819using namespace lldb_private;20using namespace lldb_private::plugin::dwarf;2122std::optional<DIERef> DWARFBaseDIE::GetDIERef() const {23if (!IsValid())24return std::nullopt;2526return DIERef(m_cu->GetSymbolFileDWARF().GetFileIndex(),27m_cu->GetDebugSection(), m_die->GetOffset());28}2930dw_tag_t DWARFBaseDIE::Tag() const {31if (m_die)32return m_die->Tag();33else34return llvm::dwarf::DW_TAG_null;35}3637const char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr,38const char *fail_value) const {39if (IsValid())40return m_die->GetAttributeValueAsString(GetCU(), attr, fail_value);41else42return fail_value;43}4445uint64_t DWARFBaseDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr,46uint64_t fail_value) const {47if (IsValid())48return m_die->GetAttributeValueAsUnsigned(GetCU(), attr, fail_value);49else50return fail_value;51}5253std::optional<uint64_t>54DWARFBaseDIE::GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const {55if (IsValid())56return m_die->GetAttributeValueAsOptionalUnsigned(GetCU(), attr);57return std::nullopt;58}5960uint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr,61uint64_t fail_value) const {62if (IsValid())63return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value);64else65return fail_value;66}6768lldb::user_id_t DWARFBaseDIE::GetID() const {69const std::optional<DIERef> &ref = this->GetDIERef();70if (ref)71return ref->get_id();7273return LLDB_INVALID_UID;74}7576const char *DWARFBaseDIE::GetName() const {77if (IsValid())78return m_die->GetName(m_cu);79else80return nullptr;81}8283lldb::ModuleSP DWARFBaseDIE::GetModule() const {84SymbolFileDWARF *dwarf = GetDWARF();85if (dwarf)86return dwarf->GetObjectFile()->GetModule();87else88return lldb::ModuleSP();89}9091dw_offset_t DWARFBaseDIE::GetOffset() const {92if (IsValid())93return m_die->GetOffset();94else95return DW_INVALID_OFFSET;96}9798SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const {99if (m_cu)100return &m_cu->GetSymbolFileDWARF();101else102return nullptr;103}104105bool DWARFBaseDIE::HasChildren() const {106return m_die && m_die->HasChildren();107}108109bool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const {110return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu);111}112113DWARFAttributes DWARFBaseDIE::GetAttributes(Recurse recurse) const {114if (IsValid())115return m_die->GetAttributes(m_cu, recurse);116return DWARFAttributes();117}118119namespace lldb_private::plugin {120namespace dwarf {121bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) {122return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU();123}124125bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) {126return !(lhs == rhs);127}128} // namespace dwarf129} // namespace lldb_private::plugin130131const DWARFDataExtractor &DWARFBaseDIE::GetData() const {132// Clients must check if this DIE is valid before calling this function.133assert(IsValid());134return m_cu->GetData();135}136137138