//===-- DWARFDeclContext.h --------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H #include "DWARFDefines.h" #include "lldb/Utility/ConstString.h" #include "llvm/ADT/StringExtras.h" #include #include #include namespace lldb_private::plugin { namespace dwarf { // DWARFDeclContext // // A class that represents a declaration context all the way down to a // DIE. This is useful when trying to find a DIE in one DWARF to a DIE // in another DWARF file. class DWARFDeclContext { public: struct Entry { Entry() = default; Entry(dw_tag_t t, const char *n) : tag(t), name(n) {} bool NameMatches(const Entry &rhs) const { if (name == rhs.name) return true; else if (name && rhs.name) return strcmp(name, rhs.name) == 0; return false; } /// Returns the name of this entry if it has one, or the appropriate /// "anonymous {namespace, class, struct, union}". const char *GetName() const; // Test operator explicit operator bool() const { return tag != 0; } dw_tag_t tag = llvm::dwarf::DW_TAG_null; const char *name = nullptr; }; DWARFDeclContext() : m_entries() {} DWARFDeclContext(llvm::ArrayRef entries) { llvm::append_range(m_entries, entries); } void AppendDeclContext(dw_tag_t tag, const char *name) { m_entries.push_back(Entry(tag, name)); } bool operator==(const DWARFDeclContext &rhs) const; bool operator!=(const DWARFDeclContext &rhs) const { return !(*this == rhs); } uint32_t GetSize() const { return m_entries.size(); } Entry &operator[](uint32_t idx) { assert(idx < m_entries.size() && "invalid index"); return m_entries[idx]; } const Entry &operator[](uint32_t idx) const { assert(idx < m_entries.size() && "invalid index"); return m_entries[idx]; } const char *GetQualifiedName() const; // Same as GetQualifiedName, but the life time of the returned string will // be that of the LLDB session. ConstString GetQualifiedNameAsConstString() const { return ConstString(GetQualifiedName()); } void Clear() { m_entries.clear(); m_qualified_name.clear(); } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const DWARFDeclContext &ctx) { OS << "DWARFDeclContext{"; llvm::ListSeparator LS; for (const Entry &e : ctx.m_entries) { OS << LS << "{" << DW_TAG_value_to_name(e.tag) << ", " << e.GetName() << "}"; } return OS << "}"; } protected: typedef std::vector collection; collection m_entries; mutable std::string m_qualified_name; }; } // namespace dwarf } // namespace lldb_private::plugin #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H