LLDB mainline
Mangled.h
Go to the documentation of this file.
1//===-- Mangled.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_CORE_MANGLED_H
10#define LLDB_CORE_MANGLED_H
11
15#include "lldb/lldb-forward.h"
16#include "lldb/lldb-types.h"
17#include "llvm/ADT/StringRef.h"
18
19#include <cstddef>
20#include <memory>
21
22namespace lldb_private {
23
24/// \class Mangled Mangled.h "lldb/Core/Mangled.h"
25/// A class that handles mangled names.
26///
27/// Designed to handle mangled names. The demangled version of any names will
28/// be computed when the demangled name is accessed through the Demangled()
29/// accessor. This class can also tokenize the demangled version of the name
30/// for powerful searches. Functions and symbols could make instances of this
31/// class for their mangled names. Uniqued string pools are used for the
32/// mangled, demangled, and token string values to allow for faster
33/// comparisons and for efficient memory use.
34class Mangled {
35public:
41
50
51 /// Default constructor.
52 ///
53 /// Initialize with both mangled and demangled names empty.
54 Mangled() = default;
55
56 /// Construct with name.
57 ///
58 /// Constructor with an optional string and auto-detect if \a name is
59 /// mangled or not.
60 ///
61 /// \param[in] name
62 /// The already const name to copy into this object.
63 explicit Mangled(ConstString name);
64
65 explicit Mangled(llvm::StringRef name);
66
67 bool operator==(const Mangled &rhs) const {
68 return m_mangled == rhs.m_mangled &&
70 }
71
72 bool operator!=(const Mangled &rhs) const {
73 return !(*this == rhs);
74 }
75
76 /// Convert to bool operator.
77 ///
78 /// This allows code to check any Mangled objects to see if they contain
79 /// anything valid using code such as:
80 ///
81 /// \code
82 /// Mangled mangled(...);
83 /// if (mangled)
84 /// { ...
85 /// \endcode
86 ///
87 /// \return
88 /// Returns \b true if either the mangled or unmangled name is set,
89 /// \b false if the object has an empty mangled and unmangled name.
90 explicit operator bool() const;
91
92 /// Clear the mangled and demangled values.
93 void Clear();
94
95 /// Compare the mangled string values
96 ///
97 /// Compares the Mangled::GetName() string in \a lhs and \a rhs.
98 ///
99 /// \param[in] lhs
100 /// A const reference to the Left Hand Side object to compare.
101 ///
102 /// \param[in] rhs
103 /// A const reference to the Right Hand Side object to compare.
104 ///
105 /// \return
106 /// -1 if \a lhs is less than \a rhs
107 /// 0 if \a lhs is equal to \a rhs
108 /// 1 if \a lhs is greater than \a rhs
109 static int Compare(const Mangled &lhs, const Mangled &rhs);
110
111 /// Dump a description of this object to a Stream \a s.
112 ///
113 /// Dump a Mangled object to stream \a s. We don't force our demangled name
114 /// to be computed currently (we don't use the accessor).
115 ///
116 /// \param[in] s
117 /// The stream to which to dump the object description.
118 void Dump(Stream *s) const;
119
120 /// Dump a debug description of this object to a Stream \a s.
121 ///
122 /// \param[in] s
123 /// The stream to which to dump the object description.
124 void DumpDebug(Stream *s) const;
125
126 /// Demangled name get accessor.
127 ///
128 /// \return
129 /// A const reference to the demangled name string object.
131
132 /// Display demangled name get accessor.
133 ///
134 /// \return
135 /// A const reference to the display demangled name string object.
137
139 m_demangled = name;
140 m_demangled_info.reset();
141 }
142
144 m_mangled = name;
145 m_demangled_info.reset();
146 }
147
148 /// Mangled name get accessor.
149 ///
150 /// \return
151 /// The mangled name string object.
153
154 /// Best name get accessor.
155 ///
156 /// \param[in] preference
157 /// Which name would you prefer to get?
158 ///
159 /// \return
160 /// A const reference to the preferred name string object if this
161 /// object has a valid name of that kind, else a const reference to the
162 /// other name is returned.
163 ConstString GetName(NamePreference preference = ePreferDemangled) const;
164
165 /// Check if "name" matches either the mangled or demangled name.
166 ///
167 /// \param[in] name
168 /// A name to match against both strings.
169 ///
170 /// \return
171 /// \b True if \a name matches either name, \b false otherwise.
172 bool NameMatches(ConstString name) const {
173 if (m_mangled == name)
174 return true;
175 return GetDemangledName() == name;
176 }
177 bool NameMatches(const RegularExpression &regex) const;
178
179 /// Get the memory cost of this object.
180 ///
181 /// Return the size in bytes that this object takes in memory. This returns
182 /// the size in bytes of this object, not any shared string values it may
183 /// refer to.
184 ///
185 /// \return
186 /// The number of bytes that this object occupies in memory.
187 size_t MemorySize() const;
188
189 /// Set the string value in this object.
190 ///
191 /// This version auto detects if the string is mangled by inspecting the
192 /// string value and looking for common mangling prefixes.
193 ///
194 /// \param[in] name
195 /// The already const version of the name for this object.
196 void SetValue(ConstString name);
197
198 /// Try to guess the language from the mangling.
199 ///
200 /// For a mangled name to have a language it must have both a mangled and a
201 /// demangled name and it can be guessed from the mangling what the language
202 /// is. Note: this will return C++ for any language that uses Itanium ABI
203 /// mangling.
204 ///
205 /// Standard C function names will return eLanguageTypeUnknown because they
206 /// aren't mangled and it isn't clear what language the name represents
207 /// (there will be no mangled name).
208 ///
209 /// \return
210 /// The language for the mangled/demangled name, eLanguageTypeUnknown
211 /// if there is no mangled or demangled counterpart.
213
214 /// Function signature for filtering mangled names.
215 using SkipMangledNameFn = bool(llvm::StringRef, ManglingScheme);
216
217 /// Get rich mangling information. This is optimized for batch processing
218 /// while populating a name index. To get the pure demangled name string for
219 /// a single entity, use GetDemangledName() instead.
220 ///
221 /// For names that match the Itanium mangling scheme, this uses LLVM's
222 /// ItaniumPartialDemangler. All other names fall back to LLDB's builtin
223 /// parser currently.
224 ///
225 /// This function is thread-safe when used with different \a context
226 /// instances in different threads.
227 ///
228 /// \param[in] context
229 /// The context for this function. A single instance can be stack-
230 /// allocated in the caller's frame and used for multiple calls.
231 ///
232 /// \param[in] skip_mangled_name
233 /// A filtering function for skipping entities based on name and mangling
234 /// scheme. This can be null if unused.
235 ///
236 /// \return
237 /// True on success, false otherwise.
239 SkipMangledNameFn *skip_mangled_name);
240
241 /// Try to identify the mangling scheme used.
242 /// \param[in] name
243 /// The name we are attempting to identify the mangling scheme for.
244 ///
245 /// \return
246 /// eManglingSchemeNone if no known mangling scheme could be identified
247 /// for s, otherwise the enumerator for the mangling scheme detected.
248 static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name);
249
250 static bool IsMangledName(llvm::StringRef name);
251
252 /// Decode a serialized version of this object from data.
253 ///
254 /// \param data
255 /// The decoder object that references the serialized data.
256 ///
257 /// \param offset_ptr
258 /// A pointer that contains the offset from which the data will be decoded
259 /// from that gets updated as data gets decoded.
260 ///
261 /// \param strtab
262 /// All strings in cache files are put into string tables for efficiency
263 /// and cache file size reduction. Strings are stored as uint32_t string
264 /// table offsets in the cache data.
265 bool Decode(const DataExtractor &data, lldb::offset_t *offset_ptr,
266 const StringTableReader &strtab);
267
268 /// Encode this object into a data encoder object.
269 ///
270 /// This allows this object to be serialized to disk.
271 ///
272 /// \param encoder
273 /// A data encoder object that serialized bytes will be encoded into.
274 ///
275 /// \param strtab
276 /// All strings in cache files are put into string tables for efficiency
277 /// and cache file size reduction. Strings are stored as uint32_t string
278 /// table offsets in the cache data.
279 void Encode(DataEncoder &encoder, ConstStringTable &strtab) const;
280
281 /// Retrieve \c DemangledNameInfo of the demangled name held by this object.
282 const std::optional<DemangledNameInfo> &GetDemangledInfo() const;
283
284 /// Compute the base name (without namespace/class qualifiers) from the
285 /// demangled name.
286 ///
287 /// For a demangled name like "ns::MyClass<int>::templateFunc", this returns
288 /// just "templateFunc".
289 ///
290 /// \return
291 /// A ConstString containing the basename, or nullptr if computation
292 /// fails.
293 ConstString GetBaseName() const;
294
295private:
296 /// If \c force is \c false, this function will re-use the previously
297 /// demangled name (if any). If \c force is \c true (or the mangled name
298 /// on this object was not previously demangled), demangle and cache the
299 /// name.
300 ConstString GetDemangledNameImpl(bool force) const;
301
302 /// The mangled version of the name.
304
305 /// Mutable so we can get it on demand with
306 /// a const version of this object.
308
309 /// If available, holds information about where in \c m_demangled certain
310 /// parts of the name (e.g., basename, arguments, etc.) begin and end.
311 mutable std::optional<DemangledNameInfo> m_demangled_info = std::nullopt;
312};
313
315
316} // namespace lldb_private
317
318#endif // LLDB_CORE_MANGLED_H
Many cache files require string tables to store data efficiently.
A uniqued constant string class.
Definition ConstString.h:40
An binary data encoding class.
Definition DataEncoder.h:42
An data extractor class.
A class that handles mangled names.
Definition Mangled.h:34
void Encode(DataEncoder &encoder, ConstStringTable &strtab) const
Encode this object into a data encoder object.
Definition Mangled.cpp:528
bool NameMatches(ConstString name) const
Check if "name" matches either the mangled or demangled name.
Definition Mangled.h:172
static int Compare(const Mangled &lhs, const Mangled &rhs)
Compare the mangled string values.
Definition Mangled.cpp:119
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:39
@ ePreferDemangledWithoutArguments
Definition Mangled.h:39
std::optional< DemangledNameInfo > m_demangled_info
If available, holds information about where in m_demangled certain parts of the name (e....
Definition Mangled.h:311
Mangled()=default
Default constructor.
void SetDemangledName(ConstString name)
Definition Mangled.h:138
void DumpDebug(Stream *s) const
Dump a debug description of this object to a Stream s.
Definition Mangled.cpp:404
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:152
size_t MemorySize() const
Get the memory cost of this object.
Definition Mangled.cpp:415
bool GetRichManglingInfo(RichManglingContext &context, SkipMangledNameFn *skip_mangled_name)
Get rich mangling information.
Definition Mangled.cpp:228
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:284
ConstString GetBaseName() const
Compute the base name (without namespace/class qualifiers) from the demangled name.
Definition Mangled.cpp:560
lldb::LanguageType GuessLanguage() const
Try to guess the language from the mangling.
Definition Mangled.cpp:425
bool Decode(const DataExtractor &data, lldb::offset_t *offset_ptr, const StringTableReader &strtab)
Decode a serialized version of this object from data.
Definition Mangled.cpp:477
void SetMangledName(ConstString name)
Definition Mangled.h:143
bool(llvm::StringRef, ManglingScheme) SkipMangledNameFn
Function signature for filtering mangled names.
Definition Mangled.h:215
bool operator==(const Mangled &rhs) const
Definition Mangled.h:67
void SetValue(ConstString name)
Set the string value in this object.
Definition Mangled.cpp:124
const std::optional< DemangledNameInfo > & GetDemangledInfo() const
Retrieve DemangledNameInfo of the demangled name held by this object.
Definition Mangled.cpp:288
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:369
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:43
bool operator!=(const Mangled &rhs) const
Definition Mangled.h:72
ConstString GetDemangledNameImpl(bool force) const
If force is false, this function will re-use the previously demangled name (if any).
Definition Mangled.cpp:299
ConstString m_mangled
The mangled version of the name.
Definition Mangled.h:303
ConstString m_demangled
Mutable so we can get it on demand with a const version of this object.
Definition Mangled.h:307
ConstString GetDisplayDemangledName() const
Display demangled name get accessor.
Definition Mangled.cpp:354
void Dump(Stream *s) const
Dump a description of this object to a Stream s.
Definition Mangled.cpp:392
void Clear()
Clear the mangled and demangled values.
Definition Mangled.cpp:112
Uniform wrapper for access to rich mangling information from different providers.
A stream class that can stream formatted output to a file.
Definition Stream.h:28
Many cache files require string tables to store data efficiently.
A class that represents a running process on the host machine.
Stream & operator<<(Stream &s, const Mangled &obj)
uint64_t offset_t
Definition lldb-types.h:85
LanguageType
Programming language type.