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