1 //===-- DWARFBaseDIE.cpp ---------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "DWARFBaseDIE.h" 10 11 #include "DWARFUnit.h" 12 #include "DWARFDebugInfoEntry.h" 13 #include "SymbolFileDWARF.h" 14 15 #include "lldb/Core/Module.h" 16 #include "lldb/Symbol/ObjectFile.h" 17 18 using namespace lldb_private; 19 20 DIERef DWARFBaseDIE::GetDIERef() const { 21 if (!IsValid()) 22 return DIERef(); 23 24 dw_offset_t cu_offset = m_cu->GetOffset(); 25 if (m_cu->GetBaseObjOffset() != DW_INVALID_OFFSET) 26 cu_offset = m_cu->GetBaseObjOffset(); 27 return DIERef(m_cu->GetDebugSection(), cu_offset, m_die->GetOffset()); 28 } 29 30 dw_tag_t DWARFBaseDIE::Tag() const { 31 if (m_die) 32 return m_die->Tag(); 33 else 34 return 0; 35 } 36 37 const char *DWARFBaseDIE::GetTagAsCString() const { 38 return lldb_private::DW_TAG_value_to_name(Tag()); 39 } 40 41 const char *DWARFBaseDIE::GetAttributeValueAsString(const dw_attr_t attr, 42 const char *fail_value) const { 43 if (IsValid()) 44 return m_die->GetAttributeValueAsString(GetCU(), attr, fail_value); 45 else 46 return fail_value; 47 } 48 49 uint64_t DWARFBaseDIE::GetAttributeValueAsUnsigned(const dw_attr_t attr, 50 uint64_t fail_value) const { 51 if (IsValid()) 52 return m_die->GetAttributeValueAsUnsigned(GetCU(), attr, fail_value); 53 else 54 return fail_value; 55 } 56 57 uint64_t DWARFBaseDIE::GetAttributeValueAsAddress(const dw_attr_t attr, 58 uint64_t fail_value) const { 59 if (IsValid()) 60 return m_die->GetAttributeValueAsAddress(GetCU(), attr, fail_value); 61 else 62 return fail_value; 63 } 64 65 lldb::user_id_t DWARFBaseDIE::GetID() const { 66 if (IsValid()) 67 return GetDWARF()->GetUID(*this); 68 return LLDB_INVALID_UID; 69 } 70 71 const char *DWARFBaseDIE::GetName() const { 72 if (IsValid()) 73 return m_die->GetName(m_cu); 74 else 75 return nullptr; 76 } 77 78 lldb::LanguageType DWARFBaseDIE::GetLanguage() const { 79 if (IsValid()) 80 return m_cu->GetLanguageType(); 81 else 82 return lldb::eLanguageTypeUnknown; 83 } 84 85 lldb::ModuleSP DWARFBaseDIE::GetModule() const { 86 SymbolFileDWARF *dwarf = GetDWARF(); 87 if (dwarf) 88 return dwarf->GetObjectFile()->GetModule(); 89 else 90 return lldb::ModuleSP(); 91 } 92 93 lldb_private::CompileUnit *DWARFBaseDIE::GetLLDBCompileUnit() const { 94 if (IsValid()) 95 return GetDWARF()->GetCompUnitForDWARFCompUnit(GetCU()); 96 else 97 return nullptr; 98 } 99 100 dw_offset_t DWARFBaseDIE::GetOffset() const { 101 if (IsValid()) 102 return m_die->GetOffset(); 103 else 104 return DW_INVALID_OFFSET; 105 } 106 107 SymbolFileDWARF *DWARFBaseDIE::GetDWARF() const { 108 if (m_cu) 109 return m_cu->GetSymbolFileDWARF(); 110 else 111 return nullptr; 112 } 113 114 lldb_private::TypeSystem *DWARFBaseDIE::GetTypeSystem() const { 115 if (m_cu) 116 return m_cu->GetTypeSystem(); 117 else 118 return nullptr; 119 } 120 121 DWARFASTParser *DWARFBaseDIE::GetDWARFParser() const { 122 lldb_private::TypeSystem *type_system = GetTypeSystem(); 123 if (type_system) 124 return type_system->GetDWARFParser(); 125 else 126 return nullptr; 127 } 128 129 bool DWARFBaseDIE::HasChildren() const { 130 return m_die && m_die->HasChildren(); 131 } 132 133 bool DWARFBaseDIE::Supports_DW_AT_APPLE_objc_complete_type() const { 134 return IsValid() && GetDWARF()->Supports_DW_AT_APPLE_objc_complete_type(m_cu); 135 } 136 137 size_t DWARFBaseDIE::GetAttributes(DWARFAttributes &attributes, 138 uint32_t depth) const { 139 if (IsValid()) 140 return m_die->GetAttributes(m_cu, attributes, depth); 141 if (depth == 0) 142 attributes.Clear(); 143 return 0; 144 } 145 146 bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 147 return lhs.GetDIE() == rhs.GetDIE() && lhs.GetCU() == rhs.GetCU(); 148 } 149 150 bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs) { 151 return !(lhs == rhs); 152 } 153 154 const DWARFDataExtractor &DWARFBaseDIE::GetData() const { 155 // Clients must check if this DIE is valid before calling this function. 156 assert(IsValid()); 157 return m_cu->GetData(); 158 } 159