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