DWARFBaseDIE.cpp revision 353358
1336823Sdim//===-- DWARFBaseDIE.cpp ---------------------------------------*- C++ -*-===// 2336823Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6336823Sdim// 7336823Sdim//===----------------------------------------------------------------------===// 8336823Sdim 9336823Sdim#include "DWARFBaseDIE.h" 10336823Sdim 11336823Sdim#include "DWARFUnit.h" 12336823Sdim#include "DWARFDebugInfoEntry.h" 13336823Sdim#include "SymbolFileDWARF.h" 14336823Sdim 15336823Sdim#include "lldb/Core/Module.h" 16336823Sdim#include "lldb/Symbol/ObjectFile.h" 17336823Sdim 18336823Sdimusing namespace lldb_private; 19336823Sdim 20353358Sdimllvm::Optional<DIERef> DWARFBaseDIE::GetDIERef() const { 21336823Sdim if (!IsValid()) 22353358Sdim return llvm::None; 23336823Sdim 24353358Sdim return DIERef(m_cu->GetSymbolFileDWARF().GetDwoNum(), m_cu->GetDebugSection(), 25353358Sdim m_die->GetOffset()); 26336823Sdim} 27336823Sdim 28336823Sdimdw_tag_t DWARFBaseDIE::Tag() const { 29336823Sdim if (m_die) 30336823Sdim return m_die->Tag(); 31336823Sdim else 32336823Sdim return 0; 33336823Sdim} 34336823Sdim 35336823Sdimconst char *DWARFBaseDIE::GetTagAsCString() const { 36336823Sdim return lldb_private::DW_TAG_value_to_name(Tag()); 37336823Sdim} 38336823Sdim 39336823Sdimconst char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr, 40336823Sdim const char *fail_value) const { 41336823Sdim if (IsValid()) 42353358Sdim return m_die->GetAttributeValueAsString(GetCU(), attr, fail_value); 43336823Sdim else 44336823Sdim return fail_value; 45336823Sdim} 46336823Sdim 47336823Sdimuint64_t DWARFBaseDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr, 48336823Sdim uint64_t fail_value) const { 49336823Sdim if (IsValid()) 50353358Sdim return m_die->GetAttributeValueAsUnsigned(GetCU(), attr, fail_value); 51336823Sdim else 52336823Sdim return fail_value; 53336823Sdim} 54336823Sdim 55336823Sdimuint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr, 56336823Sdim uint64_t fail_value) const { 57336823Sdim if (IsValid()) 58353358Sdim return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value); 59336823Sdim else 60336823Sdim return fail_value; 61336823Sdim} 62336823Sdim 63336823Sdimlldb::user_id_t DWARFBaseDIE::GetID() const { 64353358Sdim if (IsValid()) 65353358Sdim return GetDWARF()->GetUID(*this); 66353358Sdim return LLDB_INVALID_UID; 67336823Sdim} 68336823Sdim 69336823Sdimconst char *DWARFBaseDIE::GetName() const { 70336823Sdim if (IsValid()) 71353358Sdim return m_die->GetName(m_cu); 72336823Sdim else 73336823Sdim return nullptr; 74336823Sdim} 75336823Sdim 76336823Sdimlldb::LanguageType DWARFBaseDIE::GetLanguage() const { 77336823Sdim if (IsValid()) 78336823Sdim return m_cu->GetLanguageType(); 79336823Sdim else 80336823Sdim return lldb::eLanguageTypeUnknown; 81336823Sdim} 82336823Sdim 83336823Sdimlldb::ModuleSP DWARFBaseDIE::GetModule() const { 84336823Sdim SymbolFileDWARF *dwarf = GetDWARF(); 85336823Sdim if (dwarf) 86336823Sdim return dwarf->GetObjectFile()->GetModule(); 87336823Sdim else 88336823Sdim return lldb::ModuleSP(); 89336823Sdim} 90336823Sdim 91336823Sdimdw_offset_t DWARFBaseDIE::GetOffset() const { 92336823Sdim if (IsValid()) 93336823Sdim return m_die->GetOffset(); 94336823Sdim else 95336823Sdim return DW_INVALID_OFFSET; 96336823Sdim} 97336823Sdim 98336823SdimSymbolFileDWARF *DWARFBaseDIE::GetDWARF() const { 99336823Sdim if (m_cu) 100353358Sdim return &m_cu->GetSymbolFileDWARF(); 101336823Sdim else 102336823Sdim return nullptr; 103336823Sdim} 104336823Sdim 105336823Sdimlldb_private::TypeSystem *DWARFBaseDIE::GetTypeSystem() const { 106336823Sdim if (m_cu) 107336823Sdim return m_cu->GetTypeSystem(); 108336823Sdim else 109336823Sdim return nullptr; 110336823Sdim} 111336823Sdim 112336823SdimDWARFASTParser *DWARFBaseDIE::GetDWARFParser() const { 113336823Sdim lldb_private::TypeSystem *type_system = GetTypeSystem(); 114336823Sdim if (type_system) 115336823Sdim return type_system->GetDWARFParser(); 116336823Sdim else 117336823Sdim return nullptr; 118336823Sdim} 119336823Sdim 120336823Sdimbool DWARFBaseDIE::HasChildren() const { 121336823Sdim return m_die && m_die->HasChildren(); 122336823Sdim} 123336823Sdim 124336823Sdimbool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const { 125336823Sdim return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); 126336823Sdim} 127336823Sdim 128336823Sdimsize_t DWARFBaseDIE::GetAttributes(DWARFAttributes &attributes, 129336823Sdim uint32_t depth) const { 130353358Sdim if (IsValid()) 131353358Sdim return m_die->GetAttributes(m_cu, attributes, depth); 132336823Sdim if (depth == 0) 133336823Sdim attributes.Clear(); 134336823Sdim return 0; 135336823Sdim} 136336823Sdim 137336823Sdimbool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 138336823Sdim return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); 139336823Sdim} 140336823Sdim 141336823Sdimbool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 142336823Sdim return !(lhs == rhs); 143336823Sdim} 144336823Sdim 145336823Sdimconst DWARFDataExtractor &DWARFBaseDIE::GetData() const { 146336823Sdim // Clients must check if this DIE is valid before calling this function. 147336823Sdim assert(IsValid()); 148336823Sdim return m_cu->GetData(); 149336823Sdim} 150