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 Mangled(const Mangled &other)
60 ? std::make_unique<DemangledNameInfo>(*other.m_demangled_info)
61 : nullptr) {}
62
63 Mangled &operator=(const Mangled &other) {
64 if (this != &other) {
65 m_mangled = other.m_mangled;
69 ? std::make_unique<DemangledNameInfo>(*other.m_demangled_info)
70 : nullptr;
71 }
72 return *this;
73 }
74
75 Mangled(Mangled &&) = default;
76 Mangled &operator=(Mangled &&) = default;
77
78 /// Construct with name.
79 ///
80 /// Constructor with an optional string and auto-detect if \a name is
81 /// mangled or not.
82 ///
83 /// \param[in] name
84 /// The already const name to copy into this object.
85 explicit Mangled(ConstString name);
86
87 explicit Mangled(llvm::StringRef name);
88
89 bool operator==(const Mangled &rhs) const {
90 return m_mangled == rhs.m_mangled &&
92 }
93
94 bool operator!=(const Mangled &rhs) const {
95 return !(*this == rhs);
96 }
97
98 /// Convert to bool operator.
99 ///
100 /// This allows code to check any Mangled objects to see if they contain
101 /// anything valid using code such as:
102 ///
103 /// \code
104 /// Mangled mangled(...);
105 /// if (mangled)
106 /// { ...
107 /// \endcode
108 ///
109 /// \return
110 /// Returns \b true if either the mangled or unmangled name is set,
111 /// \b false if the object has an empty mangled and unmangled name.
112 explicit operator bool() const;
113
114 /// Clear the mangled and demangled values.
115 void Clear();
116
117 /// Compare the mangled string values
118 ///
119 /// Compares the Mangled::GetName() string in \a lhs and \a rhs.
120 ///
121 /// \param[in] lhs
122 /// A const reference to the Left Hand Side object to compare.
123 ///
124 /// \param[in] rhs
125 /// A const reference to the Right Hand Side object to compare.
126 ///
127 /// \return
128 /// -1 if \a lhs is less than \a rhs
129 /// 0 if \a lhs is equal to \a rhs
130 /// 1 if \a lhs is greater than \a rhs
131 static int Compare(const Mangled &lhs, const Mangled &rhs);
132
133 /// Dump a description of this object to a Stream \a s.
134 ///
135 /// Dump a Mangled object to stream \a s. We don't force our demangled name
136 /// to be computed currently (we don't use the accessor).
137 ///
138 /// \param[in] s
139 /// The stream to which to dump the object description.
140 void Dump(Stream *s) const;
141
142 /// Dump a debug description of this object to a Stream \a s.
143 ///
144 /// \param[in] s
145 /// The stream to which to dump the object description.
146 void DumpDebug(Stream *s) const;
147
148 /// Demangled name get accessor.
149 ///
150 /// \return
151 /// A const reference to the demangled name string object.
153
154 /// Display demangled name get accessor.
155 ///
156 /// \return
157 /// A const reference to the display demangled name string object.
159
161 m_demangled = name;
162 m_demangled_info.reset();
163 }
164
166 m_mangled = name;
167 m_demangled_info.reset();
168 }
169
170 /// Mangled name get accessor.
171 ///
172 /// \return
173 /// The mangled name string object.
175
176 /// Best name get accessor.
177 ///
178 /// \param[in] preference
179 /// Which name would you prefer to get?
180 ///
181 /// \return
182 /// A const reference to the preferred name string object if this
183 /// object has a valid name of that kind, else a const reference to the
184 /// other name is returned.
185 ConstString GetName(NamePreference preference = ePreferDemangled) const;
186
187 /// Check if "name" matches either the mangled or demangled name.
188 ///
189 /// \param[in] name
190 /// A name to match against both strings.
191 ///
192 /// \return
193 /// \b True if \a name matches either name, \b false otherwise.
194 bool NameMatches(ConstString name) const {
195 if (m_mangled == name)
196 return true;
197 return GetDemangledName() == name;
198 }
199 bool NameMatches(const RegularExpression &regex) const;
200
201 /// Set the string value in this object.
202 ///
203 /// This version auto detects if the string is mangled by inspecting the
204 /// string value and looking for common mangling prefixes.
205 ///
206 /// \param[in] name
207 /// The already const version of the name for this object.
208 void SetValue(ConstString name);
209
210 /// Try to guess the language from the mangling.
211 ///
212 /// For a mangled name to have a language it must have both a mangled and a
213 /// demangled name and it can be guessed from the mangling what the language
214 /// is. Note: this will return C++ for any language that uses Itanium ABI
215 /// mangling.
216 ///
217 /// Standard C function names will return eLanguageTypeUnknown because they
218 /// aren't mangled and it isn't clear what language the name represents
219 /// (there will be no mangled name).
220 ///
221 /// \return
222 /// The language for the mangled/demangled name, eLanguageTypeUnknown
223 /// if there is no mangled or demangled counterpart.
225
226 /// Function signature for filtering mangled names.
227 using SkipMangledNameFn = bool(llvm::StringRef, ManglingScheme);
228
229 /// Get rich mangling information. This is optimized for batch processing
230 /// while populating a name index. To get the pure demangled name string for
231 /// a single entity, use GetDemangledName() instead.
232 ///
233 /// For names that match the Itanium mangling scheme, this uses LLVM's
234 /// ItaniumPartialDemangler. All other names fall back to LLDB's builtin
235 /// parser currently.
236 ///
237 /// This function is thread-safe when used with different \a context
238 /// instances in different threads.
239 ///
240 /// \param[in] context
241 /// The context for this function. A single instance can be stack-
242 /// allocated in the caller's frame and used for multiple calls.
243 ///
244 /// \param[in] skip_mangled_name
245 /// A filtering function for skipping entities based on name and mangling
246 /// scheme. This can be null if unused.
247 ///
248 /// \return
249 /// True on success, false otherwise.
251 SkipMangledNameFn *skip_mangled_name);
252
253 /// Try to identify the mangling scheme used.
254 /// \param[in] name
255 /// The name we are attempting to identify the mangling scheme for.
256 ///
257 /// \return
258 /// eManglingSchemeNone if no known mangling scheme could be identified
259 /// for s, otherwise the enumerator for the mangling scheme detected.
260 static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name);
261
262 static bool IsMangledName(llvm::StringRef name);
263
264 /// Decode a serialized version of this object from data.
265 ///
266 /// \param data
267 /// The decoder object that references the serialized data.
268 ///
269 /// \param offset_ptr
270 /// A pointer that contains the offset from which the data will be decoded
271 /// from that gets updated as data gets decoded.
272 ///
273 /// \param strtab
274 /// All strings in cache files are put into string tables for efficiency
275 /// and cache file size reduction. Strings are stored as uint32_t string
276 /// table offsets in the cache data.
277 bool Decode(const DataExtractor &data, lldb::offset_t *offset_ptr,
278 const StringTableReader &strtab);
279
280 /// Encode this object into a data encoder object.
281 ///
282 /// This allows this object to be serialized to disk.
283 ///
284 /// \param encoder
285 /// A data encoder object that serialized bytes will be encoded into.
286 ///
287 /// \param strtab
288 /// All strings in cache files are put into string tables for efficiency
289 /// and cache file size reduction. Strings are stored as uint32_t string
290 /// table offsets in the cache data.
291 void Encode(DataEncoder &encoder, ConstStringTable &strtab) const;
292
293 /// Retrieve \c DemangledNameInfo of the demangled name held by this object.
294 const DemangledNameInfo *GetDemangledInfo() const;
295
296 /// Compute the base name (without namespace/class qualifiers) from the
297 /// demangled name.
298 ///
299 /// For a demangled name like "ns::MyClass<int>::templateFunc", this returns
300 /// just "templateFunc".
301 ///
302 /// \return
303 /// A ConstString containing the basename, or nullptr if computation
304 /// fails.
305 ConstString GetBaseName() const;
306
307private:
308 /// If \c force is \c false, this function will re-use the previously
309 /// demangled name (if any). If \c force is \c true (or the mangled name
310 /// on this object was not previously demangled), demangle and cache the
311 /// name.
312 ConstString GetDemangledNameImpl(bool force) const;
313
314 /// The mangled version of the name.
316
317 /// Mutable so we can get it on demand with
318 /// a const version of this object.
320
321 /// If available, holds information about where in \c m_demangled certain
322 /// parts of the name (e.g., basename, arguments, etc.) begin and end.
323 mutable std::unique_ptr<DemangledNameInfo> m_demangled_info;
324};
325static_assert(sizeof(Mangled) <= 2 * sizeof(ConstString) +
326 sizeof(std::unique_ptr<DemangledNameInfo>),
327 "High-volume object, size of object must be increased with care");
328
330
331} // namespace lldb_private
332
333#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:519
bool NameMatches(ConstString name) const
Check if "name" matches either the mangled or demangled name.
Definition Mangled.h:194
Mangled & operator=(Mangled &&)=default
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
Mangled()=default
Default constructor.
void SetDemangledName(ConstString name)
Definition Mangled.h:160
Mangled(Mangled &&)=default
void DumpDebug(Stream *s) const
Dump a debug description of this object to a Stream s.
Definition Mangled.cpp:402
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:174
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:551
std::unique_ptr< DemangledNameInfo > m_demangled_info
If available, holds information about where in m_demangled certain parts of the name (e....
Definition Mangled.h:323
lldb::LanguageType GuessLanguage() const
Try to guess the language from the mangling.
Definition Mangled.cpp:416
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:468
void SetMangledName(ConstString name)
Definition Mangled.h:165
bool(llvm::StringRef, ManglingScheme) SkipMangledNameFn
Function signature for filtering mangled names.
Definition Mangled.h:227
bool operator==(const Mangled &rhs) const
Definition Mangled.h:89
void SetValue(ConstString name)
Set the string value in this object.
Definition Mangled.cpp:124
const 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:94
Mangled(const Mangled &other)
Definition Mangled.h:56
ConstString GetDemangledNameImpl(bool force) const
If force is false, this function will re-use the previously demangled name (if any).
Definition Mangled.cpp:298
ConstString m_mangled
The mangled version of the name.
Definition Mangled.h:315
ConstString m_demangled
Mutable so we can get it on demand with a const version of this object.
Definition Mangled.h:319
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
Mangled & operator=(const Mangled &other)
Definition Mangled.h:63
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.
Stores information about where certain portions of a demangled function name begin and end.