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" 17360784Sdim#include "lldb/Utility/Log.h" 18336823Sdim 19336823Sdimusing namespace lldb_private; 20336823Sdim 21353358Sdimllvm::Optional<DIERef> DWARFBaseDIE::GetDIERef() const { 22336823Sdim if (!IsValid()) 23353358Sdim return llvm::None; 24336823Sdim 25353358Sdim return DIERef(m_cu->GetSymbolFileDWARF().GetDwoNum(), m_cu->GetDebugSection(), 26353358Sdim m_die->GetOffset()); 27336823Sdim} 28336823Sdim 29336823Sdimdw_tag_t DWARFBaseDIE::Tag() const { 30336823Sdim if (m_die) 31336823Sdim return m_die->Tag(); 32336823Sdim else 33360784Sdim return llvm::dwarf::DW_TAG_null; 34336823Sdim} 35336823Sdim 36336823Sdimconst char *DWARFBaseDIE::GetTagAsCString() const { 37336823Sdim return lldb_private::DW_TAG_value_to_name(Tag()); 38336823Sdim} 39336823Sdim 40336823Sdimconst char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr, 41336823Sdim const char *fail_value) const { 42336823Sdim if (IsValid()) 43353358Sdim return m_die->GetAttributeValueAsString(GetCU(), attr, fail_value); 44336823Sdim else 45336823Sdim return fail_value; 46336823Sdim} 47336823Sdim 48336823Sdimuint64_t DWARFBaseDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr, 49336823Sdim uint64_t fail_value) const { 50336823Sdim if (IsValid()) 51353358Sdim return m_die->GetAttributeValueAsUnsigned(GetCU(), attr, fail_value); 52336823Sdim else 53336823Sdim return fail_value; 54336823Sdim} 55336823Sdim 56336823Sdimuint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr, 57336823Sdim uint64_t fail_value) const { 58336823Sdim if (IsValid()) 59353358Sdim return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value); 60336823Sdim else 61336823Sdim return fail_value; 62336823Sdim} 63336823Sdim 64336823Sdimlldb::user_id_t DWARFBaseDIE::GetID() const { 65353358Sdim if (IsValid()) 66353358Sdim return GetDWARF()->GetUID(*this); 67353358Sdim return LLDB_INVALID_UID; 68336823Sdim} 69336823Sdim 70336823Sdimconst char *DWARFBaseDIE::GetName() const { 71336823Sdim if (IsValid()) 72353358Sdim return m_die->GetName(m_cu); 73336823Sdim else 74336823Sdim return nullptr; 75336823Sdim} 76336823Sdim 77336823Sdimlldb::LanguageType DWARFBaseDIE::GetLanguage() const { 78336823Sdim if (IsValid()) 79336823Sdim return m_cu->GetLanguageType(); 80336823Sdim else 81336823Sdim return lldb::eLanguageTypeUnknown; 82336823Sdim} 83336823Sdim 84336823Sdimlldb::ModuleSP DWARFBaseDIE::GetModule() const { 85336823Sdim SymbolFileDWARF *dwarf = GetDWARF(); 86336823Sdim if (dwarf) 87336823Sdim return dwarf->GetObjectFile()->GetModule(); 88336823Sdim else 89336823Sdim return lldb::ModuleSP(); 90336823Sdim} 91336823Sdim 92336823Sdimdw_offset_t DWARFBaseDIE::GetOffset() const { 93336823Sdim if (IsValid()) 94336823Sdim return m_die->GetOffset(); 95336823Sdim else 96336823Sdim return DW_INVALID_OFFSET; 97336823Sdim} 98336823Sdim 99336823SdimSymbolFileDWARF *DWARFBaseDIE::GetDWARF() const { 100336823Sdim if (m_cu) 101353358Sdim return &m_cu->GetSymbolFileDWARF(); 102336823Sdim else 103336823Sdim return nullptr; 104336823Sdim} 105336823Sdim 106360784Sdimllvm::Expected<lldb_private::TypeSystem &> DWARFBaseDIE::GetTypeSystem() const { 107360784Sdim if (!m_cu) 108360784Sdim return llvm::make_error<llvm::StringError>( 109360784Sdim "Unable to get TypeSystem, no compilation unit available", 110360784Sdim llvm::inconvertibleErrorCode()); 111360784Sdim return m_cu->GetTypeSystem(); 112336823Sdim} 113336823Sdim 114336823SdimDWARFASTParser *DWARFBaseDIE::GetDWARFParser() const { 115360784Sdim auto type_system_or_err = GetTypeSystem(); 116360784Sdim if (auto err = type_system_or_err.takeError()) { 117360784Sdim LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_SYMBOLS), 118360784Sdim std::move(err), "Unable to get DWARFASTParser"); 119336823Sdim return nullptr; 120360784Sdim } 121360784Sdim return type_system_or_err->GetDWARFParser(); 122336823Sdim} 123336823Sdim 124336823Sdimbool DWARFBaseDIE::HasChildren() const { 125336823Sdim return m_die && m_die->HasChildren(); 126336823Sdim} 127336823Sdim 128336823Sdimbool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const { 129336823Sdim return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); 130336823Sdim} 131336823Sdim 132336823Sdimsize_t DWARFBaseDIE::GetAttributes(DWARFAttributes &attributes, 133336823Sdim uint32_t depth) const { 134353358Sdim if (IsValid()) 135353358Sdim return m_die->GetAttributes(m_cu, attributes, depth); 136336823Sdim if (depth == 0) 137336823Sdim attributes.Clear(); 138336823Sdim return 0; 139336823Sdim} 140336823Sdim 141336823Sdimbool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 142336823Sdim return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); 143336823Sdim} 144336823Sdim 145336823Sdimbool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 146336823Sdim return !(lhs == rhs); 147336823Sdim} 148336823Sdim 149336823Sdimconst DWARFDataExtractor &DWARFBaseDIE::GetData() const { 150336823Sdim // Clients must check if this DIE is valid before calling this function. 151336823Sdim assert(IsValid()); 152336823Sdim return m_cu->GetData(); 153336823Sdim} 154