1 //===-- DWARFDeclContext.h --------------------------------------*- 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 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H 11 12 #include <string> 13 #include <vector> 14 #include "lldb/Utility/ConstString.h" 15 #include "DWARFDefines.h" 16 17 // DWARFDeclContext 18 // 19 // A class that represents a declaration context all the way down to a 20 // DIE. This is useful when trying to find a DIE in one DWARF to a DIE 21 // in another DWARF file. 22 23 class DWARFDeclContext { 24 public: 25 struct Entry { EntryEntry26 Entry() : tag(llvm::dwarf::DW_TAG_null), name(nullptr) {} EntryEntry27 Entry(dw_tag_t t, const char *n) : tag(t), name(n) {} 28 NameMatchesEntry29 bool NameMatches(const Entry &rhs) const { 30 if (name == rhs.name) 31 return true; 32 else if (name && rhs.name) 33 return strcmp(name, rhs.name) == 0; 34 return false; 35 } 36 37 // Test operator 38 explicit operator bool() const { return tag != 0; } 39 40 dw_tag_t tag; 41 const char *name; 42 }; 43 DWARFDeclContext()44 DWARFDeclContext() : m_entries(), m_language(lldb::eLanguageTypeUnknown) {} 45 AppendDeclContext(dw_tag_t tag,const char * name)46 void AppendDeclContext(dw_tag_t tag, const char *name) { 47 m_entries.push_back(Entry(tag, name)); 48 } 49 50 bool operator==(const DWARFDeclContext &rhs) const; 51 bool operator!=(const DWARFDeclContext &rhs) const { return !(*this == rhs); } 52 GetSize()53 uint32_t GetSize() const { return m_entries.size(); } 54 55 Entry &operator[](uint32_t idx) { 56 // "idx" must be valid 57 return m_entries[idx]; 58 } 59 60 const Entry &operator[](uint32_t idx) const { 61 // "idx" must be valid 62 return m_entries[idx]; 63 } 64 65 const char *GetQualifiedName() const; 66 67 // Same as GetQualifiedName, but the life time of the returned string will 68 // be that of the LLDB session. GetQualifiedNameAsConstString()69 lldb_private::ConstString GetQualifiedNameAsConstString() const { 70 return lldb_private::ConstString(GetQualifiedName()); 71 } 72 Clear()73 void Clear() { 74 m_entries.clear(); 75 m_qualified_name.clear(); 76 } 77 GetLanguage()78 lldb::LanguageType GetLanguage() const { return m_language; } 79 SetLanguage(lldb::LanguageType language)80 void SetLanguage(lldb::LanguageType language) { m_language = language; } 81 82 protected: 83 typedef std::vector<Entry> collection; 84 collection m_entries; 85 mutable std::string m_qualified_name; 86 lldb::LanguageType m_language; 87 }; 88 89 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H 90