LLDB mainline
DWARFDeclContext.h
Go to the documentation of this file.
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 "DWARFDefines.h"
14#include "llvm/ADT/StringExtras.h"
15
16#include <cassert>
17#include <string>
18#include <vector>
19
20namespace lldb_private::plugin {
21namespace dwarf {
22// DWARFDeclContext
23//
24// A class that represents a declaration context all the way down to a
25// DIE. This is useful when trying to find a DIE in one DWARF to a DIE
26// in another DWARF file.
27
29public:
30 struct Entry {
31 Entry() = default;
32 Entry(dw_tag_t t, const char *n) : tag(t), name(n) {}
33
34 bool NameMatches(const Entry &rhs) const {
35 if (name == rhs.name)
36 return true;
37 else if (name && rhs.name)
38 return strcmp(name, rhs.name) == 0;
39 return false;
40 }
41
42 /// Returns the name of this entry if it has one, or the appropriate
43 /// "anonymous {namespace, class, struct, union}".
44 const char *GetName() const;
45
46 // Test operator
47 explicit operator bool() const { return tag != 0; }
48
49 dw_tag_t tag = llvm::dwarf::DW_TAG_null;
50 const char *name = nullptr;
51 };
52
54
55 DWARFDeclContext(llvm::ArrayRef<Entry> entries) {
56 llvm::append_range(m_entries, entries);
57 }
58
59 void AppendDeclContext(dw_tag_t tag, const char *name) {
60 m_entries.push_back(Entry(tag, name));
61 }
62
63 bool operator==(const DWARFDeclContext &rhs) const;
64 bool operator!=(const DWARFDeclContext &rhs) const { return !(*this == rhs); }
65
66 uint32_t GetSize() const { return m_entries.size(); }
67
68 Entry &operator[](uint32_t idx) {
69 assert(idx < m_entries.size() && "invalid index");
70 return m_entries[idx];
71 }
72
73 const Entry &operator[](uint32_t idx) const {
74 assert(idx < m_entries.size() && "invalid index");
75 return m_entries[idx];
76 }
77
78 const char *GetQualifiedName() const;
79
80 // Same as GetQualifiedName, but the life time of the returned string will
81 // be that of the LLDB session.
84 }
85
86 void Clear() {
87 m_entries.clear();
88 m_qualified_name.clear();
89 }
90
91 friend llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
92 const DWARFDeclContext &ctx) {
93 OS << "DWARFDeclContext{";
94 llvm::ListSeparator LS;
95 for (const Entry &e : ctx.m_entries) {
96 OS << LS << "{" << DW_TAG_value_to_name(e.tag) << ", " << e.GetName()
97 << "}";
98 }
99 return OS << "}";
100 }
101
102protected:
103 typedef std::vector<Entry> collection;
105 mutable std::string m_qualified_name;
106};
107} // namespace dwarf
108} // namespace lldb_private::plugin
109
110#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDECLCONTEXT_H
A uniqued constant string class.
Definition: ConstString.h:40
bool operator!=(const DWARFDeclContext &rhs) const
const Entry & operator[](uint32_t idx) const
void AppendDeclContext(dw_tag_t tag, const char *name)
bool operator==(const DWARFDeclContext &rhs) const
friend llvm::raw_ostream & operator<<(llvm::raw_ostream &OS, const DWARFDeclContext &ctx)
DWARFDeclContext(llvm::ArrayRef< Entry > entries)
llvm::dwarf::Tag dw_tag_t
Definition: dwarf.h:26
llvm::StringRef DW_TAG_value_to_name(dw_tag_t tag)
const char * GetName() const
Returns the name of this entry if it has one, or the appropriate "anonymous {namespace,...