/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- CPlusPlusLanguage.cpp ---------------------------------------------===// |
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 | | #include "CPlusPlusLanguage.h" |
10 | | |
11 | | #include <cctype> |
12 | | #include <cstring> |
13 | | |
14 | | #include <functional> |
15 | | #include <memory> |
16 | | #include <mutex> |
17 | | #include <set> |
18 | | |
19 | | #include "llvm/ADT/StringRef.h" |
20 | | #include "llvm/Demangle/ItaniumDemangle.h" |
21 | | |
22 | | #include "lldb/Core/Mangled.h" |
23 | | #include "lldb/Core/Module.h" |
24 | | #include "lldb/Core/PluginManager.h" |
25 | | #include "lldb/Core/UniqueCStringMap.h" |
26 | | #include "lldb/Core/ValueObjectVariable.h" |
27 | | #include "lldb/DataFormatters/CXXFunctionPointer.h" |
28 | | #include "lldb/DataFormatters/DataVisualization.h" |
29 | | #include "lldb/DataFormatters/FormattersHelpers.h" |
30 | | #include "lldb/DataFormatters/VectorType.h" |
31 | | #include "lldb/Symbol/SymbolFile.h" |
32 | | #include "lldb/Symbol/VariableList.h" |
33 | | #include "lldb/Utility/ConstString.h" |
34 | | #include "lldb/Utility/LLDBLog.h" |
35 | | #include "lldb/Utility/Log.h" |
36 | | #include "lldb/Utility/RegularExpression.h" |
37 | | |
38 | | #include "BlockPointer.h" |
39 | | #include "CPlusPlusNameParser.h" |
40 | | #include "Coroutines.h" |
41 | | #include "CxxStringTypes.h" |
42 | | #include "Generic.h" |
43 | | #include "LibCxx.h" |
44 | | #include "LibCxxAtomic.h" |
45 | | #include "LibCxxVariant.h" |
46 | | #include "LibStdcpp.h" |
47 | | #include "MSVCUndecoratedNameParser.h" |
48 | | |
49 | | using namespace lldb; |
50 | | using namespace lldb_private; |
51 | | using namespace lldb_private::formatters; |
52 | | |
53 | | LLDB_PLUGIN_DEFINE(CPlusPlusLanguage) |
54 | | |
55 | 3.96k | void CPlusPlusLanguage::Initialize() { |
56 | 3.96k | PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language", |
57 | 3.96k | CreateInstance); |
58 | 3.96k | } |
59 | | |
60 | 3.95k | void CPlusPlusLanguage::Terminate() { |
61 | 3.95k | PluginManager::UnregisterPlugin(CreateInstance); |
62 | 3.95k | } |
63 | | |
64 | 822k | bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { |
65 | 822k | const char *mangled_name = mangled.GetMangledName().GetCString(); |
66 | 822k | return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name)11.5k ; |
67 | 822k | } |
68 | | |
69 | | ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( |
70 | 377 | Mangled mangled) const { |
71 | 377 | const char *mangled_name_cstr = mangled.GetMangledName().GetCString(); |
72 | 377 | ConstString demangled_name = mangled.GetDemangledName(); |
73 | 377 | if (demangled_name && mangled_name_cstr376 && mangled_name_cstr[0]338 ) { |
74 | 338 | if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' && |
75 | 338 | (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure, |
76 | | // typeinfo structure, and typeinfo |
77 | | // mangled_name |
78 | 338 | mangled_name_cstr[2] != 'G' && // avoid guard variables |
79 | 338 | mangled_name_cstr[2] != 'Z')) // named local entities (if we |
80 | | // eventually handle eSymbolTypeData, |
81 | | // we will want this back) |
82 | 334 | { |
83 | 334 | CPlusPlusLanguage::MethodName cxx_method(demangled_name); |
84 | 334 | if (!cxx_method.GetBasename().empty()) { |
85 | 298 | std::string shortname; |
86 | 298 | if (!cxx_method.GetContext().empty()) |
87 | 178 | shortname = cxx_method.GetContext().str() + "::"; |
88 | 298 | shortname += cxx_method.GetBasename().str(); |
89 | 298 | return ConstString(shortname); |
90 | 298 | } |
91 | 334 | } |
92 | 338 | } |
93 | 79 | if (demangled_name) |
94 | 78 | return demangled_name; |
95 | 1 | return mangled.GetMangledName(); |
96 | 79 | } |
97 | | |
98 | | // Static Functions |
99 | | |
100 | 171k | Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) { |
101 | | // Use plugin for C++ but not for Objective-C++ (which has its own plugin). |
102 | 171k | if (Language::LanguageIsCPlusPlus(language) && |
103 | 171k | language != eLanguageTypeObjC_plus_plus7.79k ) |
104 | 6.68k | return new CPlusPlusLanguage(); |
105 | 164k | return nullptr; |
106 | 171k | } |
107 | | |
108 | 0 | void CPlusPlusLanguage::MethodName::Clear() { |
109 | 0 | m_full.Clear(); |
110 | 0 | m_basename = llvm::StringRef(); |
111 | 0 | m_context = llvm::StringRef(); |
112 | 0 | m_arguments = llvm::StringRef(); |
113 | 0 | m_qualifiers = llvm::StringRef(); |
114 | 0 | m_return_type = llvm::StringRef(); |
115 | 0 | m_parsed = false; |
116 | 0 | m_parse_error = false; |
117 | 0 | } |
118 | | |
119 | | static bool ReverseFindMatchingChars(const llvm::StringRef &s, |
120 | | const llvm::StringRef &left_right_chars, |
121 | | size_t &left_pos, size_t &right_pos, |
122 | 669k | size_t pos = llvm::StringRef::npos) { |
123 | 669k | assert(left_right_chars.size() == 2); |
124 | 669k | left_pos = llvm::StringRef::npos; |
125 | 669k | const char left_char = left_right_chars[0]; |
126 | 669k | const char right_char = left_right_chars[1]; |
127 | 669k | pos = s.find_last_of(left_right_chars, pos); |
128 | 669k | if (pos == llvm::StringRef::npos || s[pos] == left_char6.53k ) |
129 | 663k | return false; |
130 | 6.53k | right_pos = pos; |
131 | 6.53k | uint32_t depth = 1; |
132 | 7.06k | while (pos > 0 && depth > 0) { |
133 | 7.06k | pos = s.find_last_of(left_right_chars, pos); |
134 | 7.06k | if (pos == llvm::StringRef::npos) |
135 | 0 | return false; |
136 | 7.06k | if (s[pos] == left_char) { |
137 | 6.80k | if (--depth == 0) { |
138 | 6.53k | left_pos = pos; |
139 | 6.53k | return left_pos < right_pos; |
140 | 6.53k | } |
141 | 6.80k | } else if (267 s[pos] == right_char267 ) { |
142 | 267 | ++depth; |
143 | 267 | } |
144 | 7.06k | } |
145 | 0 | return false; |
146 | 6.53k | } |
147 | | |
148 | 6.47k | static bool IsTrivialBasename(const llvm::StringRef &basename) { |
149 | | // Check that the basename matches with the following regular expression |
150 | | // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation |
151 | | // because it is significantly more efficient then using the general purpose |
152 | | // regular expression library. |
153 | 6.47k | size_t idx = 0; |
154 | 6.47k | if (basename.size() > 0 && basename[0] == '~'6.46k ) |
155 | 27 | idx = 1; |
156 | | |
157 | 6.47k | if (basename.size() <= idx) |
158 | 1 | return false; // Empty string or "~" |
159 | | |
160 | 6.46k | if (!std::isalpha(basename[idx]) && basename[idx] != '_'190 ) |
161 | 16 | return false; // First character (after removing the possible '~'') isn't in |
162 | | // [A-Za-z_] |
163 | | |
164 | | // Read all characters matching [A-Za-z_0-9] |
165 | 6.45k | ++idx; |
166 | 96.4k | while (idx < basename.size()) { |
167 | 90.7k | if (!std::isalnum(basename[idx]) && basename[idx] != '_'10.8k ) |
168 | 777 | break; |
169 | 89.9k | ++idx; |
170 | 89.9k | } |
171 | | |
172 | | // We processed all characters. It is a vaild basename. |
173 | 6.45k | return idx == basename.size(); |
174 | 6.46k | } |
175 | | |
176 | | /// Writes out the function name in 'full_name' to 'out_stream' |
177 | | /// but replaces each argument type with the variable name |
178 | | /// and the corresponding pretty-printed value |
179 | | static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, |
180 | | char const *full_name, |
181 | | ExecutionContextScope *exe_scope, |
182 | 1.17k | VariableList const &args) { |
183 | 1.17k | CPlusPlusLanguage::MethodName cpp_method{ConstString(full_name)}; |
184 | | |
185 | 1.17k | if (!cpp_method.IsValid()) |
186 | 460 | return false; |
187 | | |
188 | 715 | llvm::StringRef return_type = cpp_method.GetReturnType(); |
189 | 715 | if (!return_type.empty()) { |
190 | 83 | out_stream.PutCString(return_type); |
191 | 83 | out_stream.PutChar(' '); |
192 | 83 | } |
193 | | |
194 | 715 | out_stream.PutCString(cpp_method.GetScopeQualifiedName()); |
195 | 715 | out_stream.PutChar('('); |
196 | | |
197 | 715 | FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope); |
198 | | |
199 | 715 | out_stream.PutChar(')'); |
200 | | |
201 | 715 | llvm::StringRef qualifiers = cpp_method.GetQualifiers(); |
202 | 715 | if (!qualifiers.empty()) { |
203 | 3 | out_stream.PutChar(' '); |
204 | 3 | out_stream.PutCString(qualifiers); |
205 | 3 | } |
206 | | |
207 | 715 | return true; |
208 | 1.17k | } |
209 | | |
210 | 669k | bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() { |
211 | | // This method tries to parse simple method definitions which are presumably |
212 | | // most comman in user programs. Definitions that can be parsed by this |
213 | | // function don't have return types and templates in the name. |
214 | | // A::B::C::fun(std::vector<T> &) const |
215 | 669k | size_t arg_start, arg_end; |
216 | 669k | llvm::StringRef full(m_full.GetCString()); |
217 | 669k | llvm::StringRef parens("()", 2); |
218 | 669k | if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) { |
219 | 6.47k | m_arguments = full.substr(arg_start, arg_end - arg_start + 1); |
220 | 6.47k | if (arg_end + 1 < full.size()) |
221 | 362 | m_qualifiers = full.substr(arg_end + 1).ltrim(); |
222 | | |
223 | 6.47k | if (arg_start == 0) |
224 | 0 | return false; |
225 | 6.47k | size_t basename_end = arg_start; |
226 | 6.47k | size_t context_start = 0; |
227 | 6.47k | size_t context_end = full.rfind(':', basename_end); |
228 | 6.47k | if (context_end == llvm::StringRef::npos) |
229 | 5.34k | m_basename = full.substr(0, basename_end); |
230 | 1.12k | else { |
231 | 1.12k | if (context_start < context_end) |
232 | 1.12k | m_context = full.substr(context_start, context_end - 1 - context_start); |
233 | 1.12k | const size_t basename_begin = context_end + 1; |
234 | 1.12k | m_basename = full.substr(basename_begin, basename_end - basename_begin); |
235 | 1.12k | } |
236 | | |
237 | 6.47k | if (IsTrivialBasename(m_basename)) { |
238 | 5.67k | return true; |
239 | 5.67k | } else { |
240 | | // The C++ basename doesn't match our regular expressions so this can't |
241 | | // be a valid C++ method, clear everything out and indicate an error |
242 | 794 | m_context = llvm::StringRef(); |
243 | 794 | m_basename = llvm::StringRef(); |
244 | 794 | m_arguments = llvm::StringRef(); |
245 | 794 | m_qualifiers = llvm::StringRef(); |
246 | 794 | m_return_type = llvm::StringRef(); |
247 | 794 | return false; |
248 | 794 | } |
249 | 6.47k | } |
250 | 663k | return false; |
251 | 669k | } |
252 | | |
253 | 669k | void CPlusPlusLanguage::MethodName::Parse() { |
254 | 669k | if (!m_parsed && m_full) { |
255 | 669k | if (TrySimplifiedParse()) { |
256 | 5.67k | m_parse_error = false; |
257 | 664k | } else { |
258 | 664k | CPlusPlusNameParser parser(m_full.GetStringRef()); |
259 | 664k | if (auto function = parser.ParseAsFunctionDefinition()) { |
260 | 617 | m_basename = function->name.basename; |
261 | 617 | m_context = function->name.context; |
262 | 617 | m_arguments = function->arguments; |
263 | 617 | m_qualifiers = function->qualifiers; |
264 | 617 | m_return_type = function->return_type; |
265 | 617 | m_parse_error = false; |
266 | 663k | } else { |
267 | 663k | m_parse_error = true; |
268 | 663k | } |
269 | 664k | } |
270 | 669k | m_parsed = true; |
271 | 669k | } |
272 | 669k | } |
273 | | |
274 | 537k | llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() { |
275 | 537k | if (!m_parsed) |
276 | 532k | Parse(); |
277 | 537k | return m_basename; |
278 | 537k | } |
279 | | |
280 | 2.65k | llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() { |
281 | 2.65k | if (!m_parsed) |
282 | 1 | Parse(); |
283 | 2.65k | return m_context; |
284 | 2.65k | } |
285 | | |
286 | 54 | llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() { |
287 | 54 | if (!m_parsed) |
288 | 7 | Parse(); |
289 | 54 | return m_arguments; |
290 | 54 | } |
291 | | |
292 | 757 | llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() { |
293 | 757 | if (!m_parsed) |
294 | 0 | Parse(); |
295 | 757 | return m_qualifiers; |
296 | 757 | } |
297 | | |
298 | 755 | llvm::StringRef CPlusPlusLanguage::MethodName::GetReturnType() { |
299 | 755 | if (!m_parsed) |
300 | 0 | Parse(); |
301 | 755 | return m_return_type; |
302 | 755 | } |
303 | | |
304 | 791 | std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() { |
305 | 791 | if (!m_parsed) |
306 | 36 | Parse(); |
307 | 791 | if (m_context.empty()) |
308 | 635 | return std::string(m_basename); |
309 | | |
310 | 156 | std::string res; |
311 | 156 | res += m_context; |
312 | 156 | res += "::"; |
313 | 156 | res += m_basename; |
314 | 156 | return res; |
315 | 791 | } |
316 | | |
317 | | llvm::StringRef |
318 | 65 | CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() { |
319 | 65 | llvm::StringRef basename = GetBasename(); |
320 | 65 | size_t arg_start, arg_end; |
321 | 65 | llvm::StringRef parens("<>", 2); |
322 | 65 | if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end)) |
323 | 63 | return basename.substr(0, arg_start); |
324 | | |
325 | 2 | return basename; |
326 | 65 | } |
327 | | |
328 | 3.08k | bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) { |
329 | 3.08k | if (!m_parsed) |
330 | 3.05k | Parse(); |
331 | | |
332 | | // If we can't parse the incoming name, then just check that it contains path. |
333 | 3.08k | if (m_parse_error) |
334 | 0 | return m_full.GetStringRef().contains(path); |
335 | | |
336 | 3.08k | llvm::StringRef identifier; |
337 | 3.08k | llvm::StringRef context; |
338 | 3.08k | std::string path_str = path.str(); |
339 | 3.08k | bool success |
340 | 3.08k | = CPlusPlusLanguage::ExtractContextAndIdentifier(path_str.c_str(), |
341 | 3.08k | context, |
342 | 3.08k | identifier); |
343 | 3.08k | if (!success) |
344 | 70 | return m_full.GetStringRef().contains(path); |
345 | | |
346 | | // Basename may include template arguments. |
347 | | // E.g., |
348 | | // GetBaseName(): func<int> |
349 | | // identifier : func |
350 | | // |
351 | | // ...but we still want to account for identifiers with template parameter |
352 | | // lists, e.g., when users set breakpoints on template specializations. |
353 | | // |
354 | | // E.g., |
355 | | // GetBaseName(): func<uint32_t> |
356 | | // identifier : func<int32_t*> |
357 | | // |
358 | | // Try to match the basename with or without template parameters. |
359 | 3.01k | if (GetBasename() != identifier && |
360 | 3.01k | GetBasenameNoTemplateParameters() != identifier65 ) |
361 | 5 | return false; |
362 | | |
363 | | // Incoming path only had an identifier, so we match. |
364 | 3.00k | if (context.empty()) |
365 | 2.58k | return true; |
366 | | // Incoming path has context but this method does not, no match. |
367 | 426 | if (m_context.empty()) |
368 | 7 | return false; |
369 | | |
370 | 419 | llvm::StringRef haystack = m_context; |
371 | 419 | if (!haystack.consume_back(context)) |
372 | 307 | return false; |
373 | 112 | if (haystack.empty() || !isalnum(haystack.back())61 ) |
374 | 97 | return true; |
375 | | |
376 | 15 | return false; |
377 | 112 | } |
378 | | |
379 | 569k | bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) { |
380 | | // FIXME!! we should really run through all the known C++ Language plugins |
381 | | // and ask each one if this is a C++ mangled name |
382 | | |
383 | 569k | Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name); |
384 | | |
385 | 569k | if (scheme == Mangled::eManglingSchemeNone) |
386 | 545k | return false; |
387 | | |
388 | 23.8k | return true; |
389 | 569k | } |
390 | | |
391 | | bool CPlusPlusLanguage::DemangledNameContainsPath(llvm::StringRef path, |
392 | 3.05k | ConstString demangled) const { |
393 | 3.05k | MethodName demangled_name(demangled); |
394 | 3.05k | return demangled_name.ContainsPath(path); |
395 | 3.05k | } |
396 | | |
397 | | bool CPlusPlusLanguage::ExtractContextAndIdentifier( |
398 | 680k | const char *name, llvm::StringRef &context, llvm::StringRef &identifier) { |
399 | 680k | if (MSVCUndecoratedNameParser::IsMSVCUndecoratedName(name)) |
400 | 3 | return MSVCUndecoratedNameParser::ExtractContextAndIdentifier(name, context, |
401 | 3 | identifier); |
402 | | |
403 | 680k | CPlusPlusNameParser parser(name); |
404 | 680k | if (auto full_name = parser.ParseAsFullName()) { |
405 | 659k | identifier = full_name->basename; |
406 | 659k | context = full_name->context; |
407 | 659k | return true; |
408 | 659k | } |
409 | 21.3k | return false; |
410 | 680k | } |
411 | | |
412 | | namespace { |
413 | | class NodeAllocator { |
414 | | llvm::BumpPtrAllocator Alloc; |
415 | | |
416 | | public: |
417 | 328 | void reset() { Alloc.Reset(); } |
418 | | |
419 | 2.64k | template <typename T, typename... Args> T *makeNode(Args &&... args) { |
420 | 2.64k | return new (Alloc.Allocate(sizeof(T), alignof(T))) |
421 | 2.64k | T(std::forward<Args>(args)...); |
422 | 2.64k | } Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [31], llvm::itanium_demangle::Node*&>(char const (&) [31], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [12], llvm::itanium_demangle::Node*&>(char const (&) [12], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [9], llvm::itanium_demangle::Node*&>(char const (&) [9], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [14], llvm::itanium_demangle::Node*&>(char const (&) [14], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [19], llvm::itanium_demangle::Node*&>(char const (&) [19], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [27], llvm::itanium_demangle::Node*&>(char const (&) [27], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CtorVtableSpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CtorVtableSpecialName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [41], llvm::itanium_demangle::Node*&>(char const (&) [41], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [18], llvm::itanium_demangle::Node*&>(char const (&) [18], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [22], llvm::itanium_demangle::Node*&>(char const (&) [22], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [20], llvm::itanium_demangle::Node*&>(char const (&) [20], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [25], llvm::itanium_demangle::Node*&>(char const (&) [25], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [22]>(char const (&) [22]) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Line | Count | Source | 419 | 688 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 688 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 688 | T(std::forward<Args>(args)...); | 422 | 688 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ModuleName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ModuleName, llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&, bool&>(llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&, bool&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [24], llvm::itanium_demangle::ModuleName*&>(char const (&) [24], llvm::itanium_demangle::ModuleName*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ForwardTemplateReference* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ForwardTemplateReference, unsigned long&>(unsigned long&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [5]>(char const (&) [5]) Line | Count | Source | 419 | 88 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 88 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 88 | T(std::forward<Args>(args)...); | 422 | 88 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BinaryExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BinaryExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PrefixExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PrefixExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ArraySubscriptExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ArraySubscriptExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::MemberExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::MemberExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NewExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NewExpr, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, bool&, bool, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, bool&, bool&&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DeleteExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DeleteExpr, llvm::itanium_demangle::Node*&, bool&, bool, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, bool&, bool&&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CallExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CallExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConversionExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConversionExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConditionalExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConditionalExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CastExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CastExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::IntegerLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::IntegerLiteral, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BoolExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BoolExpr, int>(int&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<float>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<float>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<double>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<double>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<long double>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<long double>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::StringLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::StringLiteral, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [8]>(char const (&) [8]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::UnnamedTypeName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::UnnamedTypeName, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SyntheticTemplateParamName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SyntheticTemplateParamName, llvm::itanium_demangle::TemplateParamKind&, unsigned int&>(llvm::itanium_demangle::TemplateParamKind&, unsigned int&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TypeTemplateParamDecl, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConstrainedTypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConstrainedTypeTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NoexceptSpec* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NoexceptSpec, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DynamicExceptionSpec* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DynamicExceptionSpec, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&, llvm::itanium_demangle::Node*&) Line | Count | Source | 419 | 40 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 40 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 40 | T(std::forward<Args>(args)...); | 422 | 40 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ObjCProtoName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ObjCProtoName, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VendorExtQualType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VendorExtQualType, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::QualType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::QualType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&) Line | Count | Source | 419 | 16 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 16 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 16 | T(std::forward<Args>(args)...); | 422 | 16 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [12]>(char const (&) [12]) Line | Count | Source | 419 | 8 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 8 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 8 | T(std::forward<Args>(args)...); | 422 | 8 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [14]>(char const (&) [14]) Line | Count | Source | 419 | 120 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 120 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 120 | T(std::forward<Args>(args)...); | 422 | 120 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [15]>(char const (&) [15]) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [13]>(char const (&) [13]) Line | Count | Source | 419 | 120 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 120 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 120 | T(std::forward<Args>(args)...); | 422 | 120 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [10]>(char const (&) [10]) Line | Count | Source | 419 | 4 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 4 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 4 | T(std::forward<Args>(args)...); | 422 | 4 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [19]>(char const (&) [19]) Line | Count | Source | 419 | 4 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 4 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 4 | T(std::forward<Args>(args)...); | 422 | 4 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [9]>(char const (&) [9]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [18]>(char const (&) [18]) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [7]>(char const (&) [7]) Line | Count | Source | 419 | 32 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 32 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 32 | T(std::forward<Args>(args)...); | 422 | 32 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [11]>(char const (&) [11]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TransformedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TransformedType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BinaryFPType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BinaryFPType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BitIntType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BitIntType, llvm::itanium_demangle::Node*&, bool&>(llvm::itanium_demangle::Node*&, bool&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PixelVectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PixelVectorType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VectorType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VectorType, llvm::itanium_demangle::Node*&, std::nullptr_t>(llvm::itanium_demangle::Node*&, std::nullptr_t&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ArrayType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ArrayType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerToMemberType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerToMemberType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ElaboratedTypeSpefType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ElaboratedTypeSpefType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Line | Count | Source | 419 | 240 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 240 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 240 | T(std::forward<Args>(args)...); | 422 | 240 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::ReferenceType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ReferenceType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::ReferenceKind>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::ReferenceKind&&) Line | Count | Source | 419 | 16 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 16 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 16 | T(std::forward<Args>(args)...); | 422 | 16 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, char const (&) [9]>(llvm::itanium_demangle::Node*&, char const (&) [9]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, char const (&) [11]>(llvm::itanium_demangle::Node*&, char const (&) [11]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NonTypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NonTypeTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateParamPackDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateParamPackDecl, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ClosureTypeName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ClosureTypeName, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [16]>(char const (&) [16]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LambdaExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LambdaExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnumLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnumLiteral, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionParam* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionParam, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FoldExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FoldExpr, bool&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(bool&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BracedExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BracedExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, bool>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, bool&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BracedRangeExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BracedRangeExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::InitListExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::InitListExpr, std::nullptr_t, llvm::itanium_demangle::NodeArray>(std::nullptr_t&&, llvm::itanium_demangle::NodeArray&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerToMemberConversionExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerToMemberConversionExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [10], llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(char const (&) [10], llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ExprRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ExprRequirement, llvm::itanium_demangle::Node*&, bool&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, bool&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TypeRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TypeRequirement, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NestedRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NestedRequirement, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::RequiresExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::RequiresExpr, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::NodeArray&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SubobjectExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SubobjectExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::NodeArray, bool&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::NodeArray&&, bool&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ParameterPackExpansion* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ParameterPackExpansion, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SizeofParamPackExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SizeofParamPackExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [11], llvm::itanium_demangle::Node*&>(char const (&) [11], llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NodeArrayNode* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NodeArrayNode, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::InitListExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::InitListExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [6]>(char const (&) [6]) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ThrowExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ThrowExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::QualifiedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::QualifiedName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DtorName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DtorName, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConversionOperatorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConversionOperatorType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LiteralOperator* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LiteralOperator, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::GlobalQualifiedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::GlobalQualifiedName, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [9], llvm::itanium_demangle::Node*&>(char const (&) [9], llvm::itanium_demangle::Node*&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [4]>(char const (&) [4]) Line | Count | Source | 419 | 180 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 180 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 180 | T(std::forward<Args>(args)...); | 422 | 180 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialSubstitution* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialSubstitution, llvm::itanium_demangle::SpecialSubKind&>(llvm::itanium_demangle::SpecialSubKind&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::AbiTagAttr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::AbiTagAttr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&) Line | Count | Source | 419 | 16 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 16 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 16 | T(std::forward<Args>(args)...); | 422 | 16 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::StructuredBindingName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::StructuredBindingName, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ExpandedSpecialSubstitution* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ExpandedSpecialSubstitution, llvm::itanium_demangle::SpecialSubstitution*>(llvm::itanium_demangle::SpecialSubstitution*&&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::CtorDtorName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CtorDtorName, llvm::itanium_demangle::Node*&, bool, int&>(llvm::itanium_demangle::Node*&, bool&&, int&) Line | Count | Source | 419 | 56 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 56 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 56 | T(std::forward<Args>(args)...); | 422 | 56 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ModuleEntity* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ModuleEntity, llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::MemberLikeFriendName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::MemberLikeFriendName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::NestedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NestedName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Line | Count | Source | 419 | 460 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 460 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 460 | T(std::forward<Args>(args)...); | 422 | 460 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LocalName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LocalName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ParameterPack* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ParameterPack, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateArgs* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateArgs, llvm::itanium_demangle::NodeArray, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::NodeArray&&, llvm::itanium_demangle::Node*&) Line | Count | Source | 419 | 192 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 192 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 192 | T(std::forward<Args>(args)...); | 422 | 192 | } |
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameWithTemplateArgs* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameWithTemplateArgs, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Line | Count | Source | 419 | 192 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 192 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 192 | T(std::forward<Args>(args)...); | 422 | 192 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateArgumentPack* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateArgumentPack, llvm::itanium_demangle::NodeArray&>(llvm::itanium_demangle::NodeArray&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateParamQualifiedArg* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateParamQualifiedArg, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnableIfAttr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnableIfAttr, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&) CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionEncoding* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionEncoding, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&) Line | Count | Source | 419 | 172 | template <typename T, typename... Args> T *makeNode(Args &&... args) { | 420 | 172 | return new (Alloc.Allocate(sizeof(T), alignof(T))) | 421 | 172 | T(std::forward<Args>(args)...); | 422 | 172 | } |
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DotSuffix* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DotSuffix, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&&) Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [34], llvm::itanium_demangle::Node*&>(char const (&) [34], llvm::itanium_demangle::Node*&) |
423 | | |
424 | 320 | void *allocateNodeArray(size_t sz) { |
425 | 320 | return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz, |
426 | 320 | alignof(llvm::itanium_demangle::Node *)); |
427 | 320 | } |
428 | | }; |
429 | | |
430 | | template <typename Derived> |
431 | | class ManglingSubstitutor |
432 | | : public llvm::itanium_demangle::AbstractManglingParser<Derived, |
433 | | NodeAllocator> { |
434 | | using Base = |
435 | | llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>; |
436 | | |
437 | | public: |
438 | 164 | ManglingSubstitutor() : Base(nullptr, nullptr) {} CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::ManglingSubstitutor() Line | Count | Source | 438 | 82 | ManglingSubstitutor() : Base(nullptr, nullptr) {} |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::ManglingSubstitutor() Line | Count | Source | 438 | 82 | ManglingSubstitutor() : Base(nullptr, nullptr) {} |
|
439 | | |
440 | | template <typename... Ts> |
441 | 328 | ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) { |
442 | 328 | this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...); |
443 | 328 | return substituteImpl(Mangled); |
444 | 328 | } CPlusPlusLanguage.cpp:lldb_private::ConstString (anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::substitute<char const (&) [2], char const (&) [2]>(llvm::StringRef, char const (&) [2], char const (&) [2]) Line | Count | Source | 441 | 246 | ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) { | 442 | 246 | this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...); | 443 | 246 | return substituteImpl(Mangled); | 444 | 246 | } |
CPlusPlusLanguage.cpp:lldb_private::ConstString (anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::substitute<>(llvm::StringRef) Line | Count | Source | 441 | 82 | ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) { | 442 | 82 | this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...); | 443 | 82 | return substituteImpl(Mangled); | 444 | 82 | } |
|
445 | | |
446 | | protected: |
447 | 328 | void reset(llvm::StringRef Mangled) { |
448 | 328 | Base::reset(Mangled.begin(), Mangled.end()); |
449 | 328 | Written = Mangled.begin(); |
450 | 328 | Result.clear(); |
451 | 328 | Substituted = false; |
452 | 328 | } CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::reset(llvm::StringRef) Line | Count | Source | 447 | 246 | void reset(llvm::StringRef Mangled) { | 448 | 246 | Base::reset(Mangled.begin(), Mangled.end()); | 449 | 246 | Written = Mangled.begin(); | 450 | 246 | Result.clear(); | 451 | 246 | Substituted = false; | 452 | 246 | } |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::reset(llvm::StringRef) Line | Count | Source | 447 | 82 | void reset(llvm::StringRef Mangled) { | 448 | 82 | Base::reset(Mangled.begin(), Mangled.end()); | 449 | 82 | Written = Mangled.begin(); | 450 | 82 | Result.clear(); | 451 | 82 | Substituted = false; | 452 | 82 | } |
|
453 | | |
454 | 328 | ConstString substituteImpl(llvm::StringRef Mangled) { |
455 | 328 | Log *log = GetLog(LLDBLog::Language); |
456 | 328 | if (this->parse() == nullptr) { |
457 | 12 | LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled); |
458 | 12 | return ConstString(); |
459 | 12 | } |
460 | 316 | if (!Substituted) |
461 | 298 | return ConstString(); |
462 | | |
463 | | // Append any trailing unmodified input. |
464 | 18 | appendUnchangedInput(); |
465 | 18 | LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result); |
466 | 18 | return ConstString(Result); |
467 | 316 | } CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::substituteImpl(llvm::StringRef) Line | Count | Source | 454 | 246 | ConstString substituteImpl(llvm::StringRef Mangled) { | 455 | 246 | Log *log = GetLog(LLDBLog::Language); | 456 | 246 | if (this->parse() == nullptr) { | 457 | 9 | LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled); | 458 | 9 | return ConstString(); | 459 | 9 | } | 460 | 237 | if (!Substituted) | 461 | 233 | return ConstString(); | 462 | | | 463 | | // Append any trailing unmodified input. | 464 | 4 | appendUnchangedInput(); | 465 | 4 | LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result); | 466 | 4 | return ConstString(Result); | 467 | 237 | } |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::substituteImpl(llvm::StringRef) Line | Count | Source | 454 | 82 | ConstString substituteImpl(llvm::StringRef Mangled) { | 455 | 82 | Log *log = GetLog(LLDBLog::Language); | 456 | 82 | if (this->parse() == nullptr) { | 457 | 3 | LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled); | 458 | 3 | return ConstString(); | 459 | 3 | } | 460 | 79 | if (!Substituted) | 461 | 65 | return ConstString(); | 462 | | | 463 | | // Append any trailing unmodified input. | 464 | 14 | appendUnchangedInput(); | 465 | 14 | LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result); | 466 | 14 | return ConstString(Result); | 467 | 79 | } |
|
468 | | |
469 | 778 | void trySubstitute(llvm::StringRef From, llvm::StringRef To) { |
470 | 778 | if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From)) |
471 | 760 | return; |
472 | | |
473 | | // We found a match. Append unmodified input up to this point. |
474 | 18 | appendUnchangedInput(); |
475 | | |
476 | | // And then perform the replacement. |
477 | 18 | Result += To; |
478 | 18 | Written += From.size(); |
479 | 18 | Substituted = true; |
480 | 18 | } CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::trySubstitute(llvm::StringRef, llvm::StringRef) Line | Count | Source | 469 | 750 | void trySubstitute(llvm::StringRef From, llvm::StringRef To) { | 470 | 750 | if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From)) | 471 | 746 | return; | 472 | | | 473 | | // We found a match. Append unmodified input up to this point. | 474 | 4 | appendUnchangedInput(); | 475 | | | 476 | | // And then perform the replacement. | 477 | 4 | Result += To; | 478 | 4 | Written += From.size(); | 479 | 4 | Substituted = true; | 480 | 4 | } |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::trySubstitute(llvm::StringRef, llvm::StringRef) Line | Count | Source | 469 | 28 | void trySubstitute(llvm::StringRef From, llvm::StringRef To) { | 470 | 28 | if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From)) | 471 | 14 | return; | 472 | | | 473 | | // We found a match. Append unmodified input up to this point. | 474 | 14 | appendUnchangedInput(); | 475 | | | 476 | | // And then perform the replacement. | 477 | 14 | Result += To; | 478 | 14 | Written += From.size(); | 479 | 14 | Substituted = true; | 480 | 14 | } |
|
481 | | |
482 | | private: |
483 | | /// Input character until which we have constructed the respective output |
484 | | /// already. |
485 | | const char *Written = ""; |
486 | | |
487 | | llvm::SmallString<128> Result; |
488 | | |
489 | | /// Whether we have performed any substitutions. |
490 | | bool Substituted = false; |
491 | | |
492 | 850 | const char *currentParserPos() const { return this->First; } CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::currentParserPos() const Line | Count | Source | 492 | 766 | const char *currentParserPos() const { return this->First; } |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::currentParserPos() const Line | Count | Source | 492 | 84 | const char *currentParserPos() const { return this->First; } |
|
493 | | |
494 | 36 | void appendUnchangedInput() { |
495 | 36 | Result += |
496 | 36 | llvm::StringRef(Written, std::distance(Written, currentParserPos())); |
497 | 36 | Written = currentParserPos(); |
498 | 36 | } CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::appendUnchangedInput() Line | Count | Source | 494 | 8 | void appendUnchangedInput() { | 495 | 8 | Result += | 496 | 8 | llvm::StringRef(Written, std::distance(Written, currentParserPos())); | 497 | 8 | Written = currentParserPos(); | 498 | 8 | } |
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::appendUnchangedInput() Line | Count | Source | 494 | 28 | void appendUnchangedInput() { | 495 | 28 | Result += | 496 | 28 | llvm::StringRef(Written, std::distance(Written, currentParserPos())); | 497 | 28 | Written = currentParserPos(); | 498 | 28 | } |
|
499 | | }; |
500 | | |
501 | | /// Given a mangled function `Mangled`, replace all the primitive function type |
502 | | /// arguments of `Search` with type `Replace`. |
503 | | class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> { |
504 | | llvm::StringRef Search; |
505 | | llvm::StringRef Replace; |
506 | | |
507 | | public: |
508 | | void reset(llvm::StringRef Mangled, llvm::StringRef Search, |
509 | 246 | llvm::StringRef Replace) { |
510 | 246 | ManglingSubstitutor::reset(Mangled); |
511 | 246 | this->Search = Search; |
512 | 246 | this->Replace = Replace; |
513 | 246 | } |
514 | | |
515 | 750 | llvm::itanium_demangle::Node *parseType() { |
516 | 750 | trySubstitute(Search, Replace); |
517 | 750 | return ManglingSubstitutor::parseType(); |
518 | 750 | } |
519 | | }; |
520 | | |
521 | | class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> { |
522 | | public: |
523 | | llvm::itanium_demangle::Node * |
524 | 14 | parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) { |
525 | 14 | trySubstitute("C1", "C2"); |
526 | 14 | trySubstitute("D1", "D2"); |
527 | 14 | return ManglingSubstitutor::parseCtorDtorName(SoFar, State); |
528 | 14 | } |
529 | | }; |
530 | | } // namespace |
531 | | |
532 | | std::vector<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings( |
533 | 82 | const ConstString mangled_name) const { |
534 | 82 | std::vector<ConstString> alternates; |
535 | | |
536 | | /// Get a basic set of alternative manglings for the given symbol `name`, by |
537 | | /// making a few basic possible substitutions on basic types, storage duration |
538 | | /// and `const`ness for the given symbol. The output parameter `alternates` |
539 | | /// is filled with a best-guess, non-exhaustive set of different manglings |
540 | | /// for the given name. |
541 | | |
542 | | // Maybe we're looking for a const symbol but the debug info told us it was |
543 | | // non-const... |
544 | 82 | if (!strncmp(mangled_name.GetCString(), "_ZN", 3) && |
545 | 82 | strncmp(mangled_name.GetCString(), "_ZNK", 4)35 ) { |
546 | 33 | std::string fixed_scratch("_ZNK"); |
547 | 33 | fixed_scratch.append(mangled_name.GetCString() + 3); |
548 | 33 | alternates.push_back(ConstString(fixed_scratch)); |
549 | 33 | } |
550 | | |
551 | | // Maybe we're looking for a static symbol but we thought it was global... |
552 | 82 | if (!strncmp(mangled_name.GetCString(), "_Z", 2) && |
553 | 82 | strncmp(mangled_name.GetCString(), "_ZL", 3)43 ) { |
554 | 43 | std::string fixed_scratch("_ZL"); |
555 | 43 | fixed_scratch.append(mangled_name.GetCString() + 2); |
556 | 43 | alternates.push_back(ConstString(fixed_scratch)); |
557 | 43 | } |
558 | | |
559 | 82 | TypeSubstitutor TS; |
560 | | // `char` is implementation defined as either `signed` or `unsigned`. As a |
561 | | // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed |
562 | | // char, 'h'-unsigned char. If we're looking for symbols with a signed char |
563 | | // parameter, try finding matches which have the general case 'c'. |
564 | 82 | if (ConstString char_fixup = |
565 | 82 | TS.substitute(mangled_name.GetStringRef(), "a", "c")) |
566 | 2 | alternates.push_back(char_fixup); |
567 | | |
568 | | // long long parameter mangling 'x', may actually just be a long 'l' argument |
569 | 82 | if (ConstString long_fixup = |
570 | 82 | TS.substitute(mangled_name.GetStringRef(), "x", "l")) |
571 | 1 | alternates.push_back(long_fixup); |
572 | | |
573 | | // unsigned long long parameter mangling 'y', may actually just be unsigned |
574 | | // long 'm' argument |
575 | 82 | if (ConstString ulong_fixup = |
576 | 82 | TS.substitute(mangled_name.GetStringRef(), "y", "m")) |
577 | 1 | alternates.push_back(ulong_fixup); |
578 | | |
579 | 82 | if (ConstString ctor_fixup = |
580 | 82 | CtorDtorSubstitutor().substitute(mangled_name.GetStringRef())) |
581 | 14 | alternates.push_back(ctor_fixup); |
582 | | |
583 | 82 | return alternates; |
584 | 82 | } |
585 | | |
586 | | ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName( |
587 | 36 | const Mangled mangled, const SymbolContext &sym_ctx) const { |
588 | 36 | ConstString demangled = mangled.GetDemangledName(); |
589 | 36 | if (!demangled) |
590 | 0 | return ConstString(); |
591 | | |
592 | 36 | CPlusPlusLanguage::MethodName cpp_name(demangled); |
593 | 36 | std::string scope_qualified_name = cpp_name.GetScopeQualifiedName(); |
594 | | |
595 | 36 | if (!scope_qualified_name.size()) |
596 | 18 | return ConstString(); |
597 | | |
598 | 18 | if (!sym_ctx.module_sp) |
599 | 0 | return ConstString(); |
600 | | |
601 | 18 | lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile(); |
602 | 18 | if (!sym_file) |
603 | 0 | return ConstString(); |
604 | | |
605 | 18 | std::vector<ConstString> alternates; |
606 | 18 | sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates); |
607 | | |
608 | 18 | std::vector<ConstString> param_and_qual_matches; |
609 | 18 | std::vector<ConstString> param_matches; |
610 | 25 | for (size_t i = 0; i < alternates.size(); i++7 ) { |
611 | 7 | ConstString alternate_mangled_name = alternates[i]; |
612 | 7 | Mangled mangled(alternate_mangled_name); |
613 | 7 | ConstString demangled = mangled.GetDemangledName(); |
614 | | |
615 | 7 | CPlusPlusLanguage::MethodName alternate_cpp_name(demangled); |
616 | 7 | if (!cpp_name.IsValid()) |
617 | 0 | continue; |
618 | | |
619 | 7 | if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) { |
620 | 1 | if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers()) |
621 | 1 | param_and_qual_matches.push_back(alternate_mangled_name); |
622 | 0 | else |
623 | 0 | param_matches.push_back(alternate_mangled_name); |
624 | 1 | } |
625 | 7 | } |
626 | | |
627 | 18 | if (param_and_qual_matches.size()) |
628 | 1 | return param_and_qual_matches[0]; // It is assumed that there will be only |
629 | | // one! |
630 | 17 | else if (param_matches.size()) |
631 | 0 | return param_matches[0]; // Return one of them as a best match |
632 | 17 | else |
633 | 17 | return ConstString(); |
634 | 18 | } |
635 | | |
636 | 683 | static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { |
637 | 683 | if (!cpp_category_sp) |
638 | 0 | return; |
639 | | |
640 | 683 | TypeSummaryImpl::Flags stl_summary_flags; |
641 | 683 | stl_summary_flags.SetCascades(true) |
642 | 683 | .SetSkipPointers(false) |
643 | 683 | .SetSkipReferences(false) |
644 | 683 | .SetDontShowChildren(true) |
645 | 683 | .SetDontShowValue(true) |
646 | 683 | .SetShowMembersOneLiner(false) |
647 | 683 | .SetHideItemNames(false); |
648 | | |
649 | 683 | AddCXXSummary(cpp_category_sp, |
650 | 683 | lldb_private::formatters::LibcxxStringSummaryProviderASCII, |
651 | 683 | "std::string summary provider", "^std::__[[:alnum:]]+::string$", |
652 | 683 | stl_summary_flags, true); |
653 | 683 | AddCXXSummary(cpp_category_sp, |
654 | 683 | lldb_private::formatters::LibcxxStringSummaryProviderASCII, |
655 | 683 | "std::string summary provider", |
656 | 683 | "^std::__[[:alnum:]]+::basic_string<char, " |
657 | 683 | "std::__[[:alnum:]]+::char_traits<char>, " |
658 | 683 | "std::__[[:alnum:]]+::allocator<char> >$", |
659 | 683 | stl_summary_flags, true); |
660 | 683 | AddCXXSummary(cpp_category_sp, |
661 | 683 | lldb_private::formatters::LibcxxStringSummaryProviderASCII, |
662 | 683 | "std::string summary provider", |
663 | 683 | "^std::__[[:alnum:]]+::basic_string<unsigned char, " |
664 | 683 | "std::__[[:alnum:]]+::char_traits<unsigned char>, " |
665 | 683 | "std::__[[:alnum:]]+::allocator<unsigned char> >$", |
666 | 683 | stl_summary_flags, true); |
667 | | |
668 | 683 | AddCXXSummary(cpp_category_sp, |
669 | 683 | lldb_private::formatters::LibcxxStringSummaryProviderUTF16, |
670 | 683 | "std::u16string summary provider", |
671 | 683 | "^std::__[[:alnum:]]+::basic_string<char16_t, " |
672 | 683 | "std::__[[:alnum:]]+::char_traits<char16_t>, " |
673 | 683 | "std::__[[:alnum:]]+::allocator<char16_t> >$", |
674 | 683 | stl_summary_flags, true); |
675 | | |
676 | 683 | AddCXXSummary(cpp_category_sp, |
677 | 683 | lldb_private::formatters::LibcxxStringSummaryProviderUTF32, |
678 | 683 | "std::u32string summary provider", |
679 | 683 | "^std::__[[:alnum:]]+::basic_string<char32_t, " |
680 | 683 | "std::__[[:alnum:]]+::char_traits<char32_t>, " |
681 | 683 | "std::__[[:alnum:]]+::allocator<char32_t> >$", |
682 | 683 | stl_summary_flags, true); |
683 | | |
684 | 683 | AddCXXSummary(cpp_category_sp, |
685 | 683 | lldb_private::formatters::LibcxxWStringSummaryProvider, |
686 | 683 | "std::wstring summary provider", |
687 | 683 | "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true); |
688 | 683 | AddCXXSummary(cpp_category_sp, |
689 | 683 | lldb_private::formatters::LibcxxWStringSummaryProvider, |
690 | 683 | "std::wstring summary provider", |
691 | 683 | "^std::__[[:alnum:]]+::basic_string<wchar_t, " |
692 | 683 | "std::__[[:alnum:]]+::char_traits<wchar_t>, " |
693 | 683 | "std::__[[:alnum:]]+::allocator<wchar_t> >$", |
694 | 683 | stl_summary_flags, true); |
695 | | |
696 | 683 | AddCXXSummary(cpp_category_sp, |
697 | 683 | lldb_private::formatters::LibcxxStringViewSummaryProviderASCII, |
698 | 683 | "std::string_view summary provider", |
699 | 683 | "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true); |
700 | 683 | AddCXXSummary(cpp_category_sp, |
701 | 683 | lldb_private::formatters::LibcxxStringViewSummaryProviderASCII, |
702 | 683 | "std::string_view summary provider", |
703 | 683 | "^std::__[[:alnum:]]+::basic_string_view<char, " |
704 | 683 | "std::__[[:alnum:]]+::char_traits<char> >$", |
705 | 683 | stl_summary_flags, true); |
706 | 683 | AddCXXSummary(cpp_category_sp, |
707 | 683 | lldb_private::formatters::LibcxxStringViewSummaryProviderASCII, |
708 | 683 | "std::string_view summary provider", |
709 | 683 | "^std::__[[:alnum:]]+::basic_string_view<unsigned char, " |
710 | 683 | "std::__[[:alnum:]]+::char_traits<unsigned char> >$", |
711 | 683 | stl_summary_flags, true); |
712 | | |
713 | 683 | AddCXXSummary(cpp_category_sp, |
714 | 683 | lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16, |
715 | 683 | "std::u16string_view summary provider", |
716 | 683 | "^std::__[[:alnum:]]+::basic_string_view<char16_t, " |
717 | 683 | "std::__[[:alnum:]]+::char_traits<char16_t> >$", |
718 | 683 | stl_summary_flags, true); |
719 | | |
720 | 683 | AddCXXSummary(cpp_category_sp, |
721 | 683 | lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32, |
722 | 683 | "std::u32string_view summary provider", |
723 | 683 | "^std::__[[:alnum:]]+::basic_string_view<char32_t, " |
724 | 683 | "std::__[[:alnum:]]+::char_traits<char32_t> >$", |
725 | 683 | stl_summary_flags, true); |
726 | | |
727 | 683 | AddCXXSummary(cpp_category_sp, |
728 | 683 | lldb_private::formatters::LibcxxWStringViewSummaryProvider, |
729 | 683 | "std::wstring_view summary provider", |
730 | 683 | "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true); |
731 | 683 | AddCXXSummary(cpp_category_sp, |
732 | 683 | lldb_private::formatters::LibcxxWStringViewSummaryProvider, |
733 | 683 | "std::wstring_view summary provider", |
734 | 683 | "^std::__[[:alnum:]]+::basic_string_view<wchar_t, " |
735 | 683 | "std::__[[:alnum:]]+::char_traits<wchar_t> >$", |
736 | 683 | stl_summary_flags, true); |
737 | | |
738 | 683 | SyntheticChildren::Flags stl_synth_flags; |
739 | 683 | stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( |
740 | 683 | false); |
741 | 683 | SyntheticChildren::Flags stl_deref_flags = stl_synth_flags; |
742 | 683 | stl_deref_flags.SetFrontEndWantsDereference(); |
743 | | |
744 | 683 | AddCXXSynthetic( |
745 | 683 | cpp_category_sp, |
746 | 683 | lldb_private::formatters::LibcxxBitsetSyntheticFrontEndCreator, |
747 | 683 | "libc++ std::bitset synthetic children", |
748 | 683 | "^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$", stl_deref_flags, true); |
749 | 683 | AddCXXSynthetic( |
750 | 683 | cpp_category_sp, |
751 | 683 | lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, |
752 | 683 | "libc++ std::vector synthetic children", |
753 | 683 | "^std::__[[:alnum:]]+::vector<.+>(( )?&)?$", stl_deref_flags, true); |
754 | 683 | AddCXXSynthetic( |
755 | 683 | cpp_category_sp, |
756 | 683 | lldb_private::formatters::LibcxxStdForwardListSyntheticFrontEndCreator, |
757 | 683 | "libc++ std::forward_list synthetic children", |
758 | 683 | "^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$", stl_synth_flags, true); |
759 | 683 | AddCXXSynthetic( |
760 | 683 | cpp_category_sp, |
761 | 683 | lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, |
762 | 683 | "libc++ std::list synthetic children", |
763 | | // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$" |
764 | | // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$" |
765 | 683 | "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|" |
766 | 683 | "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$", |
767 | 683 | stl_deref_flags, true); |
768 | 683 | AddCXXSynthetic( |
769 | 683 | cpp_category_sp, |
770 | 683 | lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, |
771 | 683 | "libc++ std::map synthetic children", |
772 | 683 | "^std::__[[:alnum:]]+::map<.+> >(( )?&)?$", stl_synth_flags, true); |
773 | 683 | AddCXXSynthetic( |
774 | 683 | cpp_category_sp, |
775 | 683 | lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, |
776 | 683 | "libc++ std::set synthetic children", |
777 | 683 | "^std::__[[:alnum:]]+::set<.+> >(( )?&)?$", stl_deref_flags, true); |
778 | 683 | AddCXXSynthetic( |
779 | 683 | cpp_category_sp, |
780 | 683 | lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, |
781 | 683 | "libc++ std::multiset synthetic children", |
782 | 683 | "^std::__[[:alnum:]]+::multiset<.+> >(( )?&)?$", stl_deref_flags, true); |
783 | 683 | AddCXXSynthetic( |
784 | 683 | cpp_category_sp, |
785 | 683 | lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, |
786 | 683 | "libc++ std::multimap synthetic children", |
787 | 683 | "^std::__[[:alnum:]]+::multimap<.+> >(( )?&)?$", stl_synth_flags, true); |
788 | 683 | AddCXXSynthetic( |
789 | 683 | cpp_category_sp, |
790 | 683 | lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, |
791 | 683 | "libc++ std::unordered containers synthetic children", |
792 | 683 | "^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$", |
793 | 683 | stl_synth_flags, true); |
794 | 683 | AddCXXSynthetic( |
795 | 683 | cpp_category_sp, |
796 | 683 | lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, |
797 | 683 | "libc++ std::initializer_list synthetic children", |
798 | 683 | "^std::initializer_list<.+>(( )?&)?$", stl_synth_flags, true); |
799 | 683 | AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator, |
800 | 683 | "libc++ std::queue synthetic children", |
801 | 683 | "^std::__[[:alnum:]]+::queue<.+>(( )?&)?$", stl_synth_flags, |
802 | 683 | true); |
803 | 683 | AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator, |
804 | 683 | "libc++ std::tuple synthetic children", |
805 | 683 | "^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$", stl_synth_flags, |
806 | 683 | true); |
807 | 683 | AddCXXSynthetic(cpp_category_sp, LibcxxOptionalSyntheticFrontEndCreator, |
808 | 683 | "libc++ std::optional synthetic children", |
809 | 683 | "^std::__[[:alnum:]]+::optional<.+>(( )?&)?$", |
810 | 683 | stl_synth_flags, true); |
811 | 683 | AddCXXSynthetic(cpp_category_sp, LibcxxVariantFrontEndCreator, |
812 | 683 | "libc++ std::variant synthetic children", |
813 | 683 | "^std::__[[:alnum:]]+::variant<.+>(( )?&)?$", stl_synth_flags, |
814 | 683 | true); |
815 | 683 | AddCXXSynthetic( |
816 | 683 | cpp_category_sp, |
817 | 683 | lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator, |
818 | 683 | "libc++ std::atomic synthetic children", |
819 | 683 | "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true); |
820 | 683 | AddCXXSynthetic( |
821 | 683 | cpp_category_sp, |
822 | 683 | lldb_private::formatters::LibcxxStdSpanSyntheticFrontEndCreator, |
823 | 683 | "libc++ std::span synthetic children", |
824 | 683 | "^std::__[[:alnum:]]+::span<.+>(( )?&)?$", stl_deref_flags, true); |
825 | 683 | AddCXXSynthetic( |
826 | 683 | cpp_category_sp, |
827 | 683 | lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEndCreator, |
828 | 683 | "libc++ std::ranges::ref_view synthetic children", |
829 | 683 | "^std::__[[:alnum:]]+::ranges::ref_view<.+>(( )?&)?$", stl_deref_flags, |
830 | 683 | true); |
831 | | |
832 | 683 | cpp_category_sp->AddTypeSynthetic( |
833 | 683 | "^(std::__[[:alnum:]]+::)deque<.+>(( )?&)?$", eFormatterMatchRegex, |
834 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
835 | 683 | stl_synth_flags, |
836 | 683 | "lldb.formatters.cpp.libcxx.stddeque_SynthProvider"))); |
837 | | |
838 | 683 | AddCXXSynthetic( |
839 | 683 | cpp_category_sp, |
840 | 683 | lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, |
841 | 683 | "shared_ptr synthetic children", |
842 | 683 | "^(std::__[[:alnum:]]+::)shared_ptr<.+>(( )?&)?$", stl_synth_flags, true); |
843 | | |
844 | 683 | static constexpr const char *const libcxx_std_unique_ptr_regex = |
845 | 683 | "^std::__[[:alnum:]]+::unique_ptr<.+>(( )?&)?$"; |
846 | 683 | AddCXXSynthetic( |
847 | 683 | cpp_category_sp, |
848 | 683 | lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEndCreator, |
849 | 683 | "unique_ptr synthetic children", libcxx_std_unique_ptr_regex, |
850 | 683 | stl_synth_flags, true); |
851 | | |
852 | 683 | AddCXXSynthetic( |
853 | 683 | cpp_category_sp, |
854 | 683 | lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, |
855 | 683 | "weak_ptr synthetic children", |
856 | 683 | "^(std::__[[:alnum:]]+::)weak_ptr<.+>(( )?&)?$", stl_synth_flags, true); |
857 | 683 | AddCXXSummary(cpp_category_sp, |
858 | 683 | lldb_private::formatters::LibcxxFunctionSummaryProvider, |
859 | 683 | "libc++ std::function summary provider", |
860 | 683 | "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true); |
861 | | |
862 | 683 | static constexpr const char *const libcxx_std_coroutine_handle_regex = |
863 | 683 | "^std::__[[:alnum:]]+::coroutine_handle<.+>(( )?&)?$"; |
864 | 683 | AddCXXSynthetic( |
865 | 683 | cpp_category_sp, |
866 | 683 | lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator, |
867 | 683 | "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex, |
868 | 683 | stl_deref_flags, true); |
869 | | |
870 | 683 | stl_summary_flags.SetDontShowChildren(false); |
871 | 683 | stl_summary_flags.SetSkipPointers(false); |
872 | 683 | AddCXXSummary( |
873 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
874 | 683 | "libc++ std::bitset summary provider", |
875 | 683 | "^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$", stl_summary_flags, true); |
876 | 683 | AddCXXSummary( |
877 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
878 | 683 | "libc++ std::vector summary provider", |
879 | 683 | "^std::__[[:alnum:]]+::vector<.+>(( )?&)?$", stl_summary_flags, true); |
880 | 683 | AddCXXSummary(cpp_category_sp, |
881 | 683 | lldb_private::formatters::LibcxxContainerSummaryProvider, |
882 | 683 | "libc++ std::list summary provider", |
883 | 683 | "^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$", |
884 | 683 | stl_summary_flags, true); |
885 | 683 | AddCXXSummary( |
886 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
887 | 683 | "libc++ std::list summary provider", |
888 | | // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$" |
889 | | // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$" |
890 | 683 | "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|" |
891 | 683 | "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$", |
892 | 683 | stl_summary_flags, true); |
893 | 683 | AddCXXSummary( |
894 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
895 | 683 | "libc++ std::map summary provider", |
896 | 683 | "^std::__[[:alnum:]]+::map<.+>(( )?&)?$", stl_summary_flags, true); |
897 | 683 | AddCXXSummary( |
898 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
899 | 683 | "libc++ std::deque summary provider", |
900 | 683 | "^std::__[[:alnum:]]+::deque<.+>(( )?&)?$", stl_summary_flags, true); |
901 | 683 | AddCXXSummary( |
902 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
903 | 683 | "libc++ std::queue summary provider", |
904 | 683 | "^std::__[[:alnum:]]+::queue<.+>(( )?&)?$", stl_summary_flags, true); |
905 | 683 | AddCXXSummary( |
906 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
907 | 683 | "libc++ std::set summary provider", |
908 | 683 | "^std::__[[:alnum:]]+::set<.+>(( )?&)?$", stl_summary_flags, true); |
909 | 683 | AddCXXSummary( |
910 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
911 | 683 | "libc++ std::multiset summary provider", |
912 | 683 | "^std::__[[:alnum:]]+::multiset<.+>(( )?&)?$", stl_summary_flags, true); |
913 | 683 | AddCXXSummary( |
914 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
915 | 683 | "libc++ std::multimap summary provider", |
916 | 683 | "^std::__[[:alnum:]]+::multimap<.+>(( )?&)?$", stl_summary_flags, true); |
917 | 683 | AddCXXSummary(cpp_category_sp, |
918 | 683 | lldb_private::formatters::LibcxxContainerSummaryProvider, |
919 | 683 | "libc++ std::unordered containers summary provider", |
920 | 683 | "^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$", |
921 | 683 | stl_summary_flags, true); |
922 | 683 | AddCXXSummary(cpp_category_sp, LibcxxContainerSummaryProvider, |
923 | 683 | "libc++ std::tuple summary provider", |
924 | 683 | "^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$", stl_summary_flags, |
925 | 683 | true); |
926 | 683 | AddCXXSummary(cpp_category_sp, |
927 | 683 | lldb_private::formatters::LibCxxAtomicSummaryProvider, |
928 | 683 | "libc++ std::atomic summary provider", |
929 | 683 | "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true); |
930 | 683 | AddCXXSummary( |
931 | 683 | cpp_category_sp, lldb_private::formatters::GenericOptionalSummaryProvider, |
932 | 683 | "libc++ std::optional summary provider", |
933 | 683 | "^std::__[[:alnum:]]+::optional<.+>(( )?&)?$", stl_summary_flags, true); |
934 | 683 | AddCXXSummary( |
935 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxVariantSummaryProvider, |
936 | 683 | "libc++ std::variant summary provider", |
937 | 683 | "^std::__[[:alnum:]]+::variant<.+>(( )?&)?$", stl_summary_flags, true); |
938 | 683 | AddCXXSummary( |
939 | 683 | cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, |
940 | 683 | "libc++ std::span summary provider", |
941 | 683 | "^std::__[[:alnum:]]+::span<.+>(( )?&)?$", stl_summary_flags, true); |
942 | | |
943 | 683 | stl_summary_flags.SetSkipPointers(true); |
944 | | |
945 | 683 | AddCXXSummary(cpp_category_sp, |
946 | 683 | lldb_private::formatters::LibcxxSmartPointerSummaryProvider, |
947 | 683 | "libc++ std::shared_ptr summary provider", |
948 | 683 | "^std::__[[:alnum:]]+::shared_ptr<.+>(( )?&)?$", |
949 | 683 | stl_summary_flags, true); |
950 | 683 | AddCXXSummary(cpp_category_sp, |
951 | 683 | lldb_private::formatters::LibcxxSmartPointerSummaryProvider, |
952 | 683 | "libc++ std::weak_ptr summary provider", |
953 | 683 | "^std::__[[:alnum:]]+::weak_ptr<.+>(( )?&)?$", |
954 | 683 | stl_summary_flags, true); |
955 | 683 | AddCXXSummary(cpp_category_sp, |
956 | 683 | lldb_private::formatters::LibcxxUniquePointerSummaryProvider, |
957 | 683 | "libc++ std::unique_ptr summary provider", |
958 | 683 | libcxx_std_unique_ptr_regex, stl_summary_flags, true); |
959 | | |
960 | 683 | AddCXXSummary(cpp_category_sp, |
961 | 683 | lldb_private::formatters::StdlibCoroutineHandleSummaryProvider, |
962 | 683 | "libc++ std::coroutine_handle summary provider", |
963 | 683 | libcxx_std_coroutine_handle_regex, stl_summary_flags, true); |
964 | | |
965 | 683 | AddCXXSynthetic( |
966 | 683 | cpp_category_sp, |
967 | 683 | lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, |
968 | 683 | "std::vector iterator synthetic children", |
969 | 683 | "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true); |
970 | | |
971 | 683 | AddCXXSynthetic( |
972 | 683 | cpp_category_sp, |
973 | 683 | lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, |
974 | 683 | "std::map iterator synthetic children", |
975 | 683 | "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags, |
976 | 683 | true); |
977 | | |
978 | 683 | AddCXXSynthetic(cpp_category_sp, |
979 | 683 | lldb_private::formatters:: |
980 | 683 | LibCxxUnorderedMapIteratorSyntheticFrontEndCreator, |
981 | 683 | "std::unordered_map iterator synthetic children", |
982 | 683 | "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$", |
983 | 683 | stl_synth_flags, true); |
984 | 683 | } |
985 | | |
986 | 683 | static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { |
987 | 683 | if (!cpp_category_sp) |
988 | 0 | return; |
989 | | |
990 | 683 | TypeSummaryImpl::Flags stl_summary_flags; |
991 | 683 | stl_summary_flags.SetCascades(true) |
992 | 683 | .SetSkipPointers(false) |
993 | 683 | .SetSkipReferences(false) |
994 | 683 | .SetDontShowChildren(true) |
995 | 683 | .SetDontShowValue(true) |
996 | 683 | .SetShowMembersOneLiner(false) |
997 | 683 | .SetHideItemNames(false); |
998 | | |
999 | 683 | lldb::TypeSummaryImplSP std_string_summary_sp( |
1000 | 683 | new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}")); |
1001 | | |
1002 | 683 | lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat( |
1003 | 683 | stl_summary_flags, LibStdcppStringSummaryProvider, |
1004 | 683 | "libstdc++ c++11 std::string summary provider")); |
1005 | 683 | lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat( |
1006 | 683 | stl_summary_flags, LibStdcppWStringSummaryProvider, |
1007 | 683 | "libstdc++ c++11 std::wstring summary provider")); |
1008 | | |
1009 | 683 | cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact, |
1010 | 683 | std_string_summary_sp); |
1011 | 683 | cpp_category_sp->AddTypeSummary("std::basic_string<char>", |
1012 | 683 | eFormatterMatchExact, std_string_summary_sp); |
1013 | 683 | cpp_category_sp->AddTypeSummary( |
1014 | 683 | "std::basic_string<char,std::char_traits<char>,std::allocator<char> >", |
1015 | 683 | eFormatterMatchExact, std_string_summary_sp); |
1016 | 683 | cpp_category_sp->AddTypeSummary( |
1017 | 683 | "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", |
1018 | 683 | eFormatterMatchExact, std_string_summary_sp); |
1019 | | |
1020 | 683 | cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact, |
1021 | 683 | cxx11_string_summary_sp); |
1022 | 683 | cpp_category_sp->AddTypeSummary( |
1023 | 683 | "std::__cxx11::basic_string<char, std::char_traits<char>, " |
1024 | 683 | "std::allocator<char> >", |
1025 | 683 | eFormatterMatchExact, cxx11_string_summary_sp); |
1026 | 683 | cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, " |
1027 | 683 | "std::char_traits<unsigned char>, " |
1028 | 683 | "std::allocator<unsigned char> >", |
1029 | 683 | eFormatterMatchExact, |
1030 | 683 | cxx11_string_summary_sp); |
1031 | | |
1032 | | // making sure we force-pick the summary for printing wstring (_M_p is a |
1033 | | // wchar_t*) |
1034 | 683 | lldb::TypeSummaryImplSP std_wstring_summary_sp( |
1035 | 683 | new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}")); |
1036 | | |
1037 | 683 | cpp_category_sp->AddTypeSummary("std::wstring", eFormatterMatchExact, |
1038 | 683 | std_wstring_summary_sp); |
1039 | 683 | cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t>", |
1040 | 683 | eFormatterMatchExact, std_wstring_summary_sp); |
1041 | 683 | cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t,std::char_traits<" |
1042 | 683 | "wchar_t>,std::allocator<wchar_t> >", |
1043 | 683 | eFormatterMatchExact, std_wstring_summary_sp); |
1044 | 683 | cpp_category_sp->AddTypeSummary( |
1045 | 683 | "std::basic_string<wchar_t, std::char_traits<wchar_t>, " |
1046 | 683 | "std::allocator<wchar_t> >", |
1047 | 683 | eFormatterMatchExact, std_wstring_summary_sp); |
1048 | | |
1049 | 683 | cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact, |
1050 | 683 | cxx11_wstring_summary_sp); |
1051 | 683 | cpp_category_sp->AddTypeSummary( |
1052 | 683 | "std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, " |
1053 | 683 | "std::allocator<wchar_t> >", |
1054 | 683 | eFormatterMatchExact, cxx11_wstring_summary_sp); |
1055 | | |
1056 | 683 | SyntheticChildren::Flags stl_synth_flags; |
1057 | 683 | stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( |
1058 | 683 | false); |
1059 | 683 | SyntheticChildren::Flags stl_deref_flags = stl_synth_flags; |
1060 | 683 | stl_deref_flags.SetFrontEndWantsDereference(); |
1061 | | |
1062 | 683 | cpp_category_sp->AddTypeSynthetic( |
1063 | 683 | "^std::vector<.+>(( )?&)?$", eFormatterMatchRegex, |
1064 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1065 | 683 | stl_synth_flags, |
1066 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider"))); |
1067 | 683 | cpp_category_sp->AddTypeSynthetic( |
1068 | 683 | "^std::map<.+> >(( )?&)?$", eFormatterMatchRegex, |
1069 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1070 | 683 | stl_synth_flags, |
1071 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); |
1072 | 683 | cpp_category_sp->AddTypeSynthetic( |
1073 | 683 | "^std::deque<.+>(( )?&)?$", eFormatterMatchRegex, |
1074 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1075 | 683 | stl_deref_flags, |
1076 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider"))); |
1077 | 683 | cpp_category_sp->AddTypeSynthetic( |
1078 | 683 | "^std::set<.+> >(( )?&)?$", eFormatterMatchRegex, |
1079 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1080 | 683 | stl_deref_flags, |
1081 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); |
1082 | 683 | cpp_category_sp->AddTypeSynthetic( |
1083 | 683 | "^std::multimap<.+> >(( )?&)?$", eFormatterMatchRegex, |
1084 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1085 | 683 | stl_deref_flags, |
1086 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); |
1087 | 683 | cpp_category_sp->AddTypeSynthetic( |
1088 | 683 | "^std::multiset<.+> >(( )?&)?$", eFormatterMatchRegex, |
1089 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1090 | 683 | stl_deref_flags, |
1091 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider"))); |
1092 | 683 | cpp_category_sp->AddTypeSynthetic( |
1093 | 683 | "^std::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex, |
1094 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1095 | 683 | stl_deref_flags, |
1096 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider"))); |
1097 | 683 | cpp_category_sp->AddTypeSynthetic( |
1098 | 683 | "^std::(__cxx11::)?list<.+>(( )?&)?$", eFormatterMatchRegex, |
1099 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1100 | 683 | stl_deref_flags, |
1101 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider"))); |
1102 | 683 | cpp_category_sp->AddTypeSynthetic( |
1103 | 683 | "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex, |
1104 | 683 | SyntheticChildrenSP(new ScriptedSyntheticChildren( |
1105 | 683 | stl_synth_flags, |
1106 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider"))); |
1107 | | |
1108 | 683 | stl_summary_flags.SetDontShowChildren(false); |
1109 | 683 | stl_summary_flags.SetSkipPointers(false); |
1110 | 683 | cpp_category_sp->AddTypeSummary("^std::bitset<.+>(( )?&)?$", |
1111 | 683 | eFormatterMatchRegex, |
1112 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1113 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1114 | 683 | cpp_category_sp->AddTypeSummary("^std::vector<.+>(( )?&)?$", |
1115 | 683 | eFormatterMatchRegex, |
1116 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1117 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1118 | 683 | cpp_category_sp->AddTypeSummary("^std::map<.+> >(( )?&)?$", |
1119 | 683 | eFormatterMatchRegex, |
1120 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1121 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1122 | 683 | cpp_category_sp->AddTypeSummary("^std::set<.+> >(( )?&)?$", |
1123 | 683 | eFormatterMatchRegex, |
1124 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1125 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1126 | 683 | cpp_category_sp->AddTypeSummary("^std::deque<.+>(( )?&)?$", |
1127 | 683 | eFormatterMatchRegex, |
1128 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1129 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1130 | 683 | cpp_category_sp->AddTypeSummary("^std::multimap<.+> >(( )?&)?$", |
1131 | 683 | eFormatterMatchRegex, |
1132 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1133 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1134 | 683 | cpp_category_sp->AddTypeSummary("^std::multiset<.+> >(( )?&)?$", |
1135 | 683 | eFormatterMatchRegex, |
1136 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1137 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1138 | 683 | cpp_category_sp->AddTypeSummary("^std::unordered_(multi)?(map|set)<.+> >$", |
1139 | 683 | eFormatterMatchRegex, |
1140 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1141 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1142 | 683 | cpp_category_sp->AddTypeSummary("^std::(__cxx11::)?list<.+>(( )?&)?$", |
1143 | 683 | eFormatterMatchRegex, |
1144 | 683 | TypeSummaryImplSP(new StringSummaryFormat( |
1145 | 683 | stl_summary_flags, "size=${svar%#}"))); |
1146 | 683 | cpp_category_sp->AddTypeSummary( |
1147 | 683 | "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex, |
1148 | 683 | TypeSummaryImplSP(new ScriptSummaryFormat( |
1149 | 683 | stl_summary_flags, |
1150 | 683 | "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider"))); |
1151 | | |
1152 | 683 | AddCXXSynthetic( |
1153 | 683 | cpp_category_sp, |
1154 | 683 | lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, |
1155 | 683 | "std::vector iterator synthetic children", |
1156 | 683 | "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true); |
1157 | | |
1158 | 683 | AddCXXSynthetic( |
1159 | 683 | cpp_category_sp, |
1160 | 683 | lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, |
1161 | 683 | "std::map iterator synthetic children", "^std::_Rb_tree_iterator<.+>$", |
1162 | 683 | stl_synth_flags, true); |
1163 | | |
1164 | 683 | AddCXXSynthetic( |
1165 | 683 | cpp_category_sp, |
1166 | 683 | lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator, |
1167 | 683 | "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$", |
1168 | 683 | stl_synth_flags, true); |
1169 | 683 | AddCXXSynthetic( |
1170 | 683 | cpp_category_sp, |
1171 | 683 | lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, |
1172 | 683 | "std::shared_ptr synthetic children", "^std::shared_ptr<.+>(( )?&)?$", |
1173 | 683 | stl_synth_flags, true); |
1174 | 683 | AddCXXSynthetic( |
1175 | 683 | cpp_category_sp, |
1176 | 683 | lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, |
1177 | 683 | "std::weak_ptr synthetic children", "^std::weak_ptr<.+>(( )?&)?$", |
1178 | 683 | stl_synth_flags, true); |
1179 | 683 | AddCXXSynthetic( |
1180 | 683 | cpp_category_sp, |
1181 | 683 | lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator, |
1182 | 683 | "std::tuple synthetic children", "^std::tuple<.+>(( )?&)?$", |
1183 | 683 | stl_synth_flags, true); |
1184 | | |
1185 | 683 | static constexpr const char *const libstdcpp_std_coroutine_handle_regex = |
1186 | 683 | "^std::coroutine_handle<.+>(( )?&)?$"; |
1187 | 683 | AddCXXSynthetic( |
1188 | 683 | cpp_category_sp, |
1189 | 683 | lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator, |
1190 | 683 | "std::coroutine_handle synthetic children", |
1191 | 683 | libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true); |
1192 | | |
1193 | 683 | AddCXXSynthetic( |
1194 | 683 | cpp_category_sp, |
1195 | 683 | lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator, |
1196 | 683 | "std::bitset synthetic child", "^std::bitset<.+>(( )?&)?$", |
1197 | 683 | stl_deref_flags, true); |
1198 | | |
1199 | 683 | AddCXXSynthetic( |
1200 | 683 | cpp_category_sp, |
1201 | 683 | lldb_private::formatters::LibStdcppOptionalSyntheticFrontEndCreator, |
1202 | 683 | "std::optional synthetic child", "^std::optional<.+>(( )?&)?$", |
1203 | 683 | stl_deref_flags, true); |
1204 | | |
1205 | 683 | AddCXXSummary(cpp_category_sp, |
1206 | 683 | lldb_private::formatters::LibStdcppUniquePointerSummaryProvider, |
1207 | 683 | "libstdc++ std::unique_ptr summary provider", |
1208 | 683 | "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true); |
1209 | 683 | AddCXXSummary(cpp_category_sp, |
1210 | 683 | lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, |
1211 | 683 | "libstdc++ std::shared_ptr summary provider", |
1212 | 683 | "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true); |
1213 | 683 | AddCXXSummary(cpp_category_sp, |
1214 | 683 | lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, |
1215 | 683 | "libstdc++ std::weak_ptr summary provider", |
1216 | 683 | "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true); |
1217 | 683 | AddCXXSummary(cpp_category_sp, |
1218 | 683 | lldb_private::formatters::StdlibCoroutineHandleSummaryProvider, |
1219 | 683 | "libstdc++ std::coroutine_handle summary provider", |
1220 | 683 | libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true); |
1221 | 683 | AddCXXSummary(cpp_category_sp, |
1222 | 683 | lldb_private::formatters::GenericOptionalSummaryProvider, |
1223 | 683 | "libstd++ std::optional summary provider", |
1224 | 683 | "^std::optional<.+>(( )?&)?$", stl_summary_flags, true); |
1225 | 683 | } |
1226 | | |
1227 | 683 | static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { |
1228 | 683 | if (!cpp_category_sp) |
1229 | 0 | return; |
1230 | | |
1231 | 683 | TypeSummaryImpl::Flags string_flags; |
1232 | 683 | string_flags.SetCascades(true) |
1233 | 683 | .SetSkipPointers(true) |
1234 | 683 | .SetSkipReferences(false) |
1235 | 683 | .SetDontShowChildren(true) |
1236 | 683 | .SetDontShowValue(false) |
1237 | 683 | .SetShowMembersOneLiner(false) |
1238 | 683 | .SetHideItemNames(false); |
1239 | | |
1240 | 683 | TypeSummaryImpl::Flags string_array_flags; |
1241 | 683 | string_array_flags.SetCascades(true) |
1242 | 683 | .SetSkipPointers(true) |
1243 | 683 | .SetSkipReferences(false) |
1244 | 683 | .SetDontShowChildren(true) |
1245 | 683 | .SetDontShowValue(true) |
1246 | 683 | .SetShowMembersOneLiner(false) |
1247 | 683 | .SetHideItemNames(false); |
1248 | | |
1249 | 683 | AddCXXSummary(cpp_category_sp, |
1250 | 683 | lldb_private::formatters::Char8StringSummaryProvider, |
1251 | 683 | "char8_t * summary provider", "char8_t *", string_flags); |
1252 | 683 | AddCXXSummary(cpp_category_sp, |
1253 | 683 | lldb_private::formatters::Char8StringSummaryProvider, |
1254 | 683 | "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]", |
1255 | 683 | string_array_flags, true); |
1256 | | |
1257 | 683 | AddCXXSummary(cpp_category_sp, |
1258 | 683 | lldb_private::formatters::Char16StringSummaryProvider, |
1259 | 683 | "char16_t * summary provider", "char16_t *", string_flags); |
1260 | 683 | AddCXXSummary(cpp_category_sp, |
1261 | 683 | lldb_private::formatters::Char16StringSummaryProvider, |
1262 | 683 | "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]", |
1263 | 683 | string_array_flags, true); |
1264 | | |
1265 | 683 | AddCXXSummary(cpp_category_sp, |
1266 | 683 | lldb_private::formatters::Char32StringSummaryProvider, |
1267 | 683 | "char32_t * summary provider", "char32_t *", string_flags); |
1268 | 683 | AddCXXSummary(cpp_category_sp, |
1269 | 683 | lldb_private::formatters::Char32StringSummaryProvider, |
1270 | 683 | "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]", |
1271 | 683 | string_array_flags, true); |
1272 | | |
1273 | 683 | AddCXXSummary(cpp_category_sp, |
1274 | 683 | lldb_private::formatters::WCharStringSummaryProvider, |
1275 | 683 | "wchar_t * summary provider", "wchar_t *", string_flags); |
1276 | 683 | AddCXXSummary(cpp_category_sp, |
1277 | 683 | lldb_private::formatters::WCharStringSummaryProvider, |
1278 | 683 | "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]", |
1279 | 683 | string_array_flags, true); |
1280 | | |
1281 | 683 | AddCXXSummary(cpp_category_sp, |
1282 | 683 | lldb_private::formatters::Char16StringSummaryProvider, |
1283 | 683 | "unichar * summary provider", "unichar *", string_flags); |
1284 | | |
1285 | 683 | TypeSummaryImpl::Flags widechar_flags; |
1286 | 683 | widechar_flags.SetDontShowValue(true) |
1287 | 683 | .SetSkipPointers(true) |
1288 | 683 | .SetSkipReferences(false) |
1289 | 683 | .SetCascades(true) |
1290 | 683 | .SetDontShowChildren(true) |
1291 | 683 | .SetHideItemNames(true) |
1292 | 683 | .SetShowMembersOneLiner(false); |
1293 | | |
1294 | 683 | AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char8SummaryProvider, |
1295 | 683 | "char8_t summary provider", "char8_t", widechar_flags); |
1296 | 683 | AddCXXSummary(cpp_category_sp, |
1297 | 683 | lldb_private::formatters::Char16SummaryProvider, |
1298 | 683 | "char16_t summary provider", "char16_t", widechar_flags); |
1299 | 683 | AddCXXSummary(cpp_category_sp, |
1300 | 683 | lldb_private::formatters::Char32SummaryProvider, |
1301 | 683 | "char32_t summary provider", "char32_t", widechar_flags); |
1302 | 683 | AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, |
1303 | 683 | "wchar_t summary provider", "wchar_t", widechar_flags); |
1304 | | |
1305 | 683 | AddCXXSummary(cpp_category_sp, |
1306 | 683 | lldb_private::formatters::Char16SummaryProvider, |
1307 | 683 | "unichar summary provider", "unichar", widechar_flags); |
1308 | 683 | } |
1309 | | |
1310 | 98 | std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() { |
1311 | 98 | class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger { |
1312 | 98 | public: |
1313 | 98 | CompilerType AdjustForInclusion(CompilerType &candidate) override { |
1314 | 32 | LanguageType lang_type(candidate.GetMinimumLanguage()); |
1315 | 32 | if (!Language::LanguageIsC(lang_type) && |
1316 | 32 | !Language::LanguageIsCPlusPlus(lang_type)31 ) |
1317 | 24 | return CompilerType(); |
1318 | 8 | if (candidate.IsTypedefType()) |
1319 | 2 | return candidate.GetTypedefedType(); |
1320 | 6 | return candidate; |
1321 | 8 | } |
1322 | 98 | }; |
1323 | | |
1324 | 98 | return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger()); |
1325 | 98 | } |
1326 | | |
1327 | 683 | lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() { |
1328 | 683 | static llvm::once_flag g_initialize; |
1329 | 683 | static TypeCategoryImplSP g_category; |
1330 | | |
1331 | 683 | llvm::call_once(g_initialize, [this]() -> void { |
1332 | 683 | DataVisualization::Categories::GetCategory(ConstString(GetPluginName()), |
1333 | 683 | g_category); |
1334 | 683 | if (g_category) { |
1335 | 683 | LoadLibStdcppFormatters(g_category); |
1336 | 683 | LoadLibCxxFormatters(g_category); |
1337 | 683 | LoadSystemFormatters(g_category); |
1338 | 683 | } |
1339 | 683 | }); |
1340 | 683 | return g_category; |
1341 | 683 | } |
1342 | | |
1343 | | HardcodedFormatters::HardcodedSummaryFinder |
1344 | 683 | CPlusPlusLanguage::GetHardcodedSummaries() { |
1345 | 683 | static llvm::once_flag g_initialize; |
1346 | 683 | static ConstString g_vectortypes("VectorTypes"); |
1347 | 683 | static HardcodedFormatters::HardcodedSummaryFinder g_formatters; |
1348 | | |
1349 | 683 | llvm::call_once(g_initialize, []() -> void { |
1350 | 683 | g_formatters.push_back( |
1351 | 683 | [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, |
1352 | 60.7k | FormatManager &) -> TypeSummaryImpl::SharedPointer { |
1353 | 60.7k | static CXXFunctionSummaryFormat::SharedPointer formatter_sp( |
1354 | 60.7k | new CXXFunctionSummaryFormat( |
1355 | 60.7k | TypeSummaryImpl::Flags(), |
1356 | 60.7k | lldb_private::formatters::CXXFunctionPointerSummaryProvider, |
1357 | 60.7k | "Function pointer summary provider")); |
1358 | 60.7k | if (CompilerType CT = valobj.GetCompilerType(); |
1359 | 60.7k | CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType()60.6k ) { |
1360 | 102 | return formatter_sp; |
1361 | 102 | } |
1362 | 60.6k | return nullptr; |
1363 | 60.7k | }); |
1364 | 683 | g_formatters.push_back( |
1365 | 683 | [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, |
1366 | 60.6k | FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer { |
1367 | 60.6k | static CXXFunctionSummaryFormat::SharedPointer formatter_sp( |
1368 | 60.6k | new CXXFunctionSummaryFormat( |
1369 | 60.6k | TypeSummaryImpl::Flags() |
1370 | 60.6k | .SetCascades(true) |
1371 | 60.6k | .SetDontShowChildren(true) |
1372 | 60.6k | .SetHideItemNames(true) |
1373 | 60.6k | .SetShowMembersOneLiner(true) |
1374 | 60.6k | .SetSkipPointers(true) |
1375 | 60.6k | .SetSkipReferences(false), |
1376 | 60.6k | lldb_private::formatters::VectorTypeSummaryProvider, |
1377 | 60.6k | "vector_type pointer summary provider")); |
1378 | 60.6k | if (valobj.GetCompilerType().IsVectorType()) { |
1379 | 600 | if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) |
1380 | 600 | return formatter_sp; |
1381 | 600 | } |
1382 | 60.0k | return nullptr; |
1383 | 60.6k | }); |
1384 | 683 | g_formatters.push_back( |
1385 | 683 | [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, |
1386 | 60.0k | FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer { |
1387 | 60.0k | static CXXFunctionSummaryFormat::SharedPointer formatter_sp( |
1388 | 60.0k | new CXXFunctionSummaryFormat( |
1389 | 60.0k | TypeSummaryImpl::Flags() |
1390 | 60.0k | .SetCascades(true) |
1391 | 60.0k | .SetDontShowChildren(true) |
1392 | 60.0k | .SetHideItemNames(true) |
1393 | 60.0k | .SetShowMembersOneLiner(true) |
1394 | 60.0k | .SetSkipPointers(true) |
1395 | 60.0k | .SetSkipReferences(false), |
1396 | 60.0k | lldb_private::formatters::BlockPointerSummaryProvider, |
1397 | 60.0k | "block pointer summary provider")); |
1398 | 60.0k | if (valobj.GetCompilerType().IsBlockPointerType()) { |
1399 | 8 | return formatter_sp; |
1400 | 8 | } |
1401 | 60.0k | return nullptr; |
1402 | 60.0k | }); |
1403 | 683 | }); |
1404 | | |
1405 | 683 | return g_formatters; |
1406 | 683 | } |
1407 | | |
1408 | | HardcodedFormatters::HardcodedSyntheticFinder |
1409 | 683 | CPlusPlusLanguage::GetHardcodedSynthetics() { |
1410 | 683 | static llvm::once_flag g_initialize; |
1411 | 683 | static ConstString g_vectortypes("VectorTypes"); |
1412 | 683 | static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; |
1413 | | |
1414 | 683 | llvm::call_once(g_initialize, []() -> void { |
1415 | 683 | g_formatters.push_back([](lldb_private::ValueObject &valobj, |
1416 | 683 | lldb::DynamicValueType, FormatManager &fmt_mgr) |
1417 | 63.6k | -> SyntheticChildren::SharedPointer { |
1418 | 63.6k | static CXXSyntheticChildren::SharedPointer formatter_sp( |
1419 | 63.6k | new CXXSyntheticChildren( |
1420 | 63.6k | SyntheticChildren::Flags() |
1421 | 63.6k | .SetCascades(true) |
1422 | 63.6k | .SetSkipPointers(true) |
1423 | 63.6k | .SetSkipReferences(true) |
1424 | 63.6k | .SetNonCacheable(true), |
1425 | 63.6k | "vector_type synthetic children", |
1426 | 63.6k | lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); |
1427 | 63.6k | if (valobj.GetCompilerType().IsVectorType()) { |
1428 | 637 | if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) |
1429 | 637 | return formatter_sp; |
1430 | 637 | } |
1431 | 62.9k | return nullptr; |
1432 | 63.6k | }); |
1433 | 683 | g_formatters.push_back([](lldb_private::ValueObject &valobj, |
1434 | 683 | lldb::DynamicValueType, FormatManager &fmt_mgr) |
1435 | 62.9k | -> SyntheticChildren::SharedPointer { |
1436 | 62.9k | static CXXSyntheticChildren::SharedPointer formatter_sp( |
1437 | 62.9k | new CXXSyntheticChildren( |
1438 | 62.9k | SyntheticChildren::Flags() |
1439 | 62.9k | .SetCascades(true) |
1440 | 62.9k | .SetSkipPointers(true) |
1441 | 62.9k | .SetSkipReferences(true) |
1442 | 62.9k | .SetNonCacheable(true), |
1443 | 62.9k | "block pointer synthetic children", |
1444 | 62.9k | lldb_private::formatters::BlockPointerSyntheticFrontEndCreator)); |
1445 | 62.9k | if (valobj.GetCompilerType().IsBlockPointerType()) { |
1446 | 8 | return formatter_sp; |
1447 | 8 | } |
1448 | 62.9k | return nullptr; |
1449 | 62.9k | }); |
1450 | 683 | }); |
1451 | | |
1452 | 683 | return g_formatters; |
1453 | 683 | } |
1454 | | |
1455 | 8.19k | bool CPlusPlusLanguage::IsNilReference(ValueObject &valobj) { |
1456 | 8.19k | if (!Language::LanguageIsCPlusPlus(valobj.GetObjectRuntimeLanguage()) || |
1457 | 8.19k | !valobj.IsPointerType()) |
1458 | 7.54k | return false; |
1459 | 654 | bool canReadValue = true; |
1460 | 654 | bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0; |
1461 | 654 | return canReadValue && isZero; |
1462 | 8.19k | } |
1463 | | |
1464 | 9.99k | bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const { |
1465 | 9.99k | const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c", |
1466 | 9.99k | ".h", ".hh", ".hpp", ".hxx", ".h++"}; |
1467 | 28.5k | for (auto suffix : suffixes) { |
1468 | 28.5k | if (file_path.ends_with_insensitive(suffix)) |
1469 | 9.07k | return true; |
1470 | 28.5k | } |
1471 | | |
1472 | | // Check if we're in a STL path (where the files usually have no extension |
1473 | | // that we could check for. |
1474 | 920 | return file_path.contains("/usr/include/c++/"); |
1475 | 9.99k | } |
1476 | | |
1477 | | bool CPlusPlusLanguage::GetFunctionDisplayName( |
1478 | | const SymbolContext *sc, const ExecutionContext *exe_ctx, |
1479 | 2.40k | FunctionNameRepresentation representation, Stream &s) { |
1480 | 2.40k | switch (representation) { |
1481 | 2.26k | case FunctionNameRepresentation::eNameWithArgs: { |
1482 | | // Print the function name with arguments in it |
1483 | 2.26k | if (sc->function) { |
1484 | 2.14k | ExecutionContextScope *exe_scope = |
1485 | 2.14k | exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr0 ; |
1486 | 2.14k | const char *cstr = sc->function->GetName().AsCString(nullptr); |
1487 | 2.14k | if (cstr) { |
1488 | 2.14k | const InlineFunctionInfo *inline_info = nullptr; |
1489 | 2.14k | VariableListSP variable_list_sp; |
1490 | 2.14k | bool get_function_vars = true; |
1491 | 2.14k | if (sc->block) { |
1492 | 2.14k | Block *inline_block = sc->block->GetContainingInlinedBlock(); |
1493 | | |
1494 | 2.14k | if (inline_block) { |
1495 | 18 | get_function_vars = false; |
1496 | 18 | inline_info = sc->block->GetInlinedFunctionInfo(); |
1497 | 18 | if (inline_info) |
1498 | 18 | variable_list_sp = inline_block->GetBlockVariableList(true); |
1499 | 18 | } |
1500 | 2.14k | } |
1501 | | |
1502 | 2.14k | if (get_function_vars) { |
1503 | 2.12k | variable_list_sp = |
1504 | 2.12k | sc->function->GetBlock(true).GetBlockVariableList(true); |
1505 | 2.12k | } |
1506 | | |
1507 | 2.14k | if (inline_info) { |
1508 | 18 | s.PutCString(cstr); |
1509 | 18 | s.PutCString(" [inlined] "); |
1510 | 18 | cstr = inline_info->GetName().GetCString(); |
1511 | 18 | } |
1512 | | |
1513 | 2.14k | VariableList args; |
1514 | 2.14k | if (variable_list_sp) |
1515 | 2.14k | variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, |
1516 | 2.14k | args); |
1517 | 2.14k | if (args.GetSize() > 0) { |
1518 | 1.17k | if (!PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args)) |
1519 | 460 | return false; |
1520 | 1.17k | } else { |
1521 | 968 | s.PutCString(cstr); |
1522 | 968 | } |
1523 | 1.68k | return true; |
1524 | 2.14k | } |
1525 | 2.14k | } else if (123 sc->symbol123 ) { |
1526 | 123 | const char *cstr = sc->symbol->GetName().AsCString(nullptr); |
1527 | 123 | if (cstr) { |
1528 | 123 | s.PutCString(cstr); |
1529 | 123 | return true; |
1530 | 123 | } |
1531 | 123 | } |
1532 | 2.26k | } break0 ; |
1533 | 137 | default: |
1534 | 137 | return false; |
1535 | 2.40k | } |
1536 | | |
1537 | 0 | return false; |
1538 | 2.40k | } |