LLDB mainline
CPlusPlusLanguage.cpp
Go to the documentation of this file.
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
23#include "lldb/Core/Mangled.h"
24#include "lldb/Core/Module.h"
36#include "lldb/Utility/Log.h"
39
40#include "BlockPointer.h"
41#include "CPlusPlusNameParser.h"
42#include "Coroutines.h"
43#include "CxxStringTypes.h"
44#include "Generic.h"
45#include "LibCxx.h"
46#include "LibCxxAtomic.h"
47#include "LibCxxVariant.h"
48#include "LibStdcpp.h"
50#include "MsvcStl.h"
52
53using namespace lldb;
54using namespace lldb_private;
55using namespace lldb_private::formatters;
56
58
63
67
68std::unique_ptr<Language::MethodName>
70 std::unique_ptr<CxxMethodName> cpp_method =
71 std::make_unique<CxxMethodName>(full_name);
72 cpp_method->IsValid();
73 return cpp_method;
74}
75
76std::pair<FunctionNameType, std::optional<ConstString>>
79 return {eFunctionNameTypeFull, std::nullopt};
80
81 FunctionNameType func_name_type = eFunctionNameTypeNone;
82 CxxMethodName method(name);
83 llvm::StringRef basename = method.GetBasename();
84 if (basename.empty()) {
85 llvm::StringRef context;
86 func_name_type |=
87 (ExtractContextAndIdentifier(name.GetCString(), context, basename)
88 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
89 : eFunctionNameTypeFull);
90 } else {
91 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
92 }
93
94 if (!method.GetQualifiers().empty()) {
95 // There is a 'const' or other qualifier following the end of the function
96 // parens, this can't be a eFunctionNameTypeBase.
97 func_name_type &= ~(eFunctionNameTypeBase);
98 }
99
100 if (basename.empty())
101 return {func_name_type, std::nullopt};
102 else
103 return {func_name_type, ConstString(basename)};
104}
105
107 const char *mangled_name = mangled.GetMangledName().GetCString();
108 auto mangling_scheme = Mangled::GetManglingScheme(mangled_name);
109 return mangled_name && (mangling_scheme == Mangled::eManglingSchemeItanium ||
110 mangling_scheme == Mangled::eManglingSchemeMSVC);
111}
112
114 Mangled mangled) const {
115 const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
116 ConstString demangled_name = mangled.GetDemangledName();
117 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
118 if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
119 (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
120 // typeinfo structure, and typeinfo
121 // mangled_name
122 mangled_name_cstr[2] != 'G' && // avoid guard variables
123 mangled_name_cstr[2] != 'Z')) // named local entities (if we
124 // eventually handle eSymbolTypeData,
125 // we will want this back)
126 {
127 CxxMethodName cxx_method(demangled_name);
128 if (!cxx_method.GetBasename().empty()) {
129 std::string shortname;
130 if (!cxx_method.GetContext().empty())
131 shortname = cxx_method.GetContext().str() + "::";
132 shortname += cxx_method.GetBasename().str();
133 return ConstString(shortname);
134 }
135 }
136 }
137 if (demangled_name)
138 return demangled_name;
139 return mangled.GetMangledName();
140}
141
142// Static Functions
143
145 // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
146 if (Language::LanguageIsCPlusPlus(language) &&
147 language != eLanguageTypeObjC_plus_plus)
148 return new CPlusPlusLanguage();
149 return nullptr;
150}
151
152static bool ReverseFindMatchingChars(const llvm::StringRef &s,
153 const llvm::StringRef &left_right_chars,
154 size_t &left_pos, size_t &right_pos,
155 size_t pos = llvm::StringRef::npos) {
156 assert(left_right_chars.size() == 2);
157 left_pos = llvm::StringRef::npos;
158 const char left_char = left_right_chars[0];
159 const char right_char = left_right_chars[1];
160 pos = s.find_last_of(left_right_chars, pos);
161 if (pos == llvm::StringRef::npos || s[pos] == left_char)
162 return false;
163 right_pos = pos;
164 uint32_t depth = 1;
165 while (pos > 0 && depth > 0) {
166 pos = s.find_last_of(left_right_chars, pos);
167 if (pos == llvm::StringRef::npos)
168 return false;
169 if (s[pos] == left_char) {
170 if (--depth == 0) {
171 left_pos = pos;
172 return left_pos < right_pos;
173 }
174 } else if (s[pos] == right_char) {
175 ++depth;
176 }
177 }
178 return false;
179}
180
181static bool IsTrivialBasename(const llvm::StringRef &basename) {
182 // Check that the basename matches with the following regular expression
183 // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
184 // because it is significantly more efficient then using the general purpose
185 // regular expression library.
186 size_t idx = 0;
187 if (basename.starts_with('~'))
188 idx = 1;
189
190 if (basename.size() <= idx)
191 return false; // Empty string or "~"
192
193 if (!std::isalpha(static_cast<unsigned char>(basename[idx])) &&
194 basename[idx] != '_')
195 return false; // First character (after removing the possible '~'') isn't in
196 // [A-Za-z_]
197
198 // Read all characters matching [A-Za-z_0-9]
199 ++idx;
200 while (idx < basename.size()) {
201 if (!std::isalnum(static_cast<unsigned char>(basename[idx])) &&
202 basename[idx] != '_')
203 break;
204 ++idx;
205 }
206
207 // We processed all characters. It is a vaild basename.
208 return idx == basename.size();
209}
210
211/// Writes out the function name in 'full_name' to 'out_stream'
212/// but replaces each argument type with the variable name
213/// and the corresponding pretty-printed value
215 char const *full_name,
216 ExecutionContextScope *exe_scope,
217 VariableList const &args) {
218 CPlusPlusLanguage::CxxMethodName cpp_method{ConstString(full_name)};
219
220 if (!cpp_method.IsValid())
221 return false;
222
223 llvm::StringRef return_type = cpp_method.GetReturnType();
224 if (!return_type.empty()) {
225 out_stream.PutCString(return_type);
226 out_stream.PutChar(' ');
227 }
228
229 out_stream.PutCString(cpp_method.GetScopeQualifiedName());
230 out_stream.PutChar('(');
231
232 FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
233
234 out_stream.PutChar(')');
235
236 llvm::StringRef qualifiers = cpp_method.GetQualifiers();
237 if (!qualifiers.empty()) {
238 out_stream.PutChar(' ');
239 out_stream.PutCString(qualifiers);
240 }
241
242 return true;
243}
244
245static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
248 if (!mangled)
249 return llvm::createStringError("Function does not have a mangled name.");
250
251 auto demangled_name = mangled.GetDemangledName().GetStringRef();
252 if (demangled_name.empty())
253 return llvm::createStringError(
254 "Function '%s' does not have a demangled name.",
255 mangled.GetMangledName().AsCString(""));
256
257 const std::optional<DemangledNameInfo> &info = mangled.GetDemangledInfo();
258 if (!info)
259 return llvm::createStringError(
260 "Function '%s' does not have demangled info.", demangled_name.data());
261
262 // Function without a basename is nonsense.
263 if (!info->hasBasename())
264 return llvm::createStringError(
265 "DemangledInfo for '%s does not have basename range.",
266 demangled_name.data());
267
268 return std::make_pair(demangled_name, *info);
269}
270
271static llvm::Expected<llvm::StringRef>
273 auto info_or_err = GetAndValidateInfo(sc);
274 if (!info_or_err)
275 return info_or_err.takeError();
276
277 auto [demangled_name, info] = *info_or_err;
278
279 return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info);
280}
281
282llvm::StringRef
284 const DemangledNameInfo &info) {
285 assert(info.hasBasename());
286 return demangled.slice(info.BasenameRange.first, info.BasenameRange.second);
287}
288
289llvm::Expected<llvm::StringRef>
291 llvm::StringRef demangled, const DemangledNameInfo &info) {
292 if (!info.hasTemplateArguments())
293 return llvm::createStringError(
294 "Template arguments range for '%s' is invalid.", demangled.data());
295
296 return demangled.slice(info.TemplateArgumentsRange.first,
297 info.TemplateArgumentsRange.second);
298}
299
300static llvm::Expected<llvm::StringRef>
302 auto info_or_err = GetAndValidateInfo(sc);
303 if (!info_or_err)
304 return info_or_err.takeError();
305
306 auto [demangled_name, info] = *info_or_err;
307
308 return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info);
309}
310
311llvm::Expected<llvm::StringRef>
313 const DemangledNameInfo &info) {
314 if (info.ScopeRange.first >= demangled.size())
315 return llvm::createStringError(
316 "Scope range for '%s' LHS return type is invalid.", demangled.data());
317
318 return demangled.substr(0, info.ScopeRange.first);
319}
320
321static llvm::Expected<llvm::StringRef>
323 auto info_or_err = GetAndValidateInfo(sc);
324 if (!info_or_err)
325 return info_or_err.takeError();
326
327 auto [demangled_name, info] = *info_or_err;
328
329 return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info);
330}
331
332llvm::Expected<llvm::StringRef>
334 llvm::StringRef demangled, const DemangledNameInfo &info) {
335 if (!info.hasQualifiers())
336 return llvm::createStringError("Qualifiers range for '%s' is invalid.",
337 demangled.data());
338
339 return demangled.slice(info.QualifiersRange.first,
340 info.QualifiersRange.second);
341}
342
343static llvm::Expected<llvm::StringRef>
345 auto info_or_err = GetAndValidateInfo(sc);
346 if (!info_or_err)
347 return info_or_err.takeError();
348
349 auto [demangled_name, info] = *info_or_err;
350
352 info);
353}
354
355llvm::Expected<llvm::StringRef>
357 const DemangledNameInfo &info) {
358 if (info.QualifiersRange.first < info.ArgumentsRange.second)
359 return llvm::createStringError(
360 "Qualifiers range for '%s' RHS return type is invalid.",
361 demangled.data());
362
363 return demangled.slice(info.ArgumentsRange.second,
364 info.QualifiersRange.first);
365}
366
367static llvm::Expected<llvm::StringRef>
369 auto info_or_err = GetAndValidateInfo(sc);
370 if (!info_or_err)
371 return info_or_err.takeError();
372
373 auto [demangled_name, info] = *info_or_err;
374
375 return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info);
376}
377
378llvm::Expected<llvm::StringRef>
379CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled,
380 const DemangledNameInfo &info) {
381 if (!info.hasScope())
382 return llvm::createStringError("Scope range for '%s' is invalid.",
383 demangled.data());
384
385 return demangled.slice(info.ScopeRange.first, info.ScopeRange.second);
386}
387
388static llvm::Expected<llvm::StringRef>
390 auto info_or_err = GetAndValidateInfo(sc);
391 if (!info_or_err)
392 return info_or_err.takeError();
393
394 auto [demangled_name, info] = *info_or_err;
395
396 return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
397}
398
399llvm::Expected<llvm::StringRef>
401 const DemangledNameInfo &info) {
402 if (!info.hasSuffix())
403 return llvm::createStringError("Suffix range for '%s' is invalid.",
404 demangled.data());
405
406 return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
407}
408
409static llvm::Expected<llvm::StringRef>
411 auto info_or_err = GetAndValidateInfo(sc);
412 if (!info_or_err)
413 return info_or_err.takeError();
414
415 auto [demangled_name, info] = *info_or_err;
416
417 return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
418}
419
420llvm::Expected<llvm::StringRef>
422 llvm::StringRef demangled, const DemangledNameInfo &info) {
423 if (!info.hasArguments())
424 return llvm::createStringError(
425 "Function arguments range for '%s' is invalid.", demangled.data());
426
427 return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second);
428}
429
431 assert(sc.symbol);
432
433 auto info_or_err = GetAndValidateInfo(sc);
434 if (!info_or_err) {
435 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(),
436 "Failed to handle ${{function.formatted-arguments}} "
437 "frame-format variable: {0}");
438 return false;
439 }
440
441 auto [demangled_name, info] = *info_or_err;
442
443 auto args_or_err =
445 if (!args_or_err) {
446 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(),
447 "Failed to handle ${{function.formatted-arguments}} "
448 "frame-format variable: {0}");
449 return false;
450 }
451
452 s << *args_or_err;
453
454 return true;
455}
456
458 // This method tries to parse simple method definitions which are presumably
459 // most comman in user programs. Definitions that can be parsed by this
460 // function don't have return types and templates in the name.
461 // A::B::C::fun(std::vector<T> &) const
462 size_t arg_start, arg_end;
463 llvm::StringRef full(m_full.GetCString());
464 llvm::StringRef parens("()", 2);
465 if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
466 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
467 if (arg_end + 1 < full.size())
468 m_qualifiers = full.substr(arg_end + 1).ltrim();
469
470 if (arg_start == 0)
471 return false;
472 size_t basename_end = arg_start;
473 size_t context_start = 0;
474 size_t context_end = full.rfind(':', basename_end);
475 if (context_end == llvm::StringRef::npos)
476 m_basename = full.substr(0, basename_end);
477 else {
478 if (context_start < context_end)
479 m_context = full.substr(context_start, context_end - 1 - context_start);
480 const size_t basename_begin = context_end + 1;
481 m_basename = full.substr(basename_begin, basename_end - basename_begin);
482 }
483
485 return true;
486 } else {
487 // The C++ basename doesn't match our regular expressions so this can't
488 // be a valid C++ method, clear everything out and indicate an error
489 m_context = llvm::StringRef();
490 m_basename = llvm::StringRef();
491 m_arguments = llvm::StringRef();
492 m_qualifiers = llvm::StringRef();
493 m_return_type = llvm::StringRef();
494 return false;
495 }
496 }
497 return false;
498}
499
501 if (!m_parsed && m_full) {
502 if (TrySimplifiedParse()) {
503 m_parse_error = false;
504 } else {
505 CPlusPlusNameParser parser(m_full.GetStringRef());
506 if (auto function = parser.ParseAsFunctionDefinition()) {
507 m_basename = function->name.basename;
508 m_context = function->name.context;
509 m_arguments = function->arguments;
510 m_qualifiers = function->qualifiers;
511 m_return_type = function->return_type;
512 m_parse_error = false;
513 } else {
514 m_parse_error = true;
515 }
516 }
517 if (m_context.empty()) {
518 m_scope_qualified = std::string(m_basename);
519 } else {
521 m_scope_qualified += "::";
523 }
524 m_parsed = true;
525 }
526}
527
528llvm::StringRef
530 llvm::StringRef basename = GetBasename();
531 size_t arg_start, arg_end;
532 llvm::StringRef parens("<>", 2);
533 if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
534 return basename.substr(0, arg_start);
535
536 return basename;
537}
538
540 if (!m_parsed)
541 Parse();
542
543 // If we can't parse the incoming name, then just check that it contains path.
544 if (m_parse_error)
545 return m_full.GetStringRef().contains(path);
546
547 llvm::StringRef identifier;
548 llvm::StringRef context;
549 std::string path_str = path.str();
551 path_str.c_str(), context, identifier);
552 if (!success)
553 return m_full.GetStringRef().contains(path);
554
555 // Basename may include template arguments.
556 // E.g.,
557 // GetBaseName(): func<int>
558 // identifier : func
559 //
560 // ...but we still want to account for identifiers with template parameter
561 // lists, e.g., when users set breakpoints on template specializations.
562 //
563 // E.g.,
564 // GetBaseName(): func<uint32_t>
565 // identifier : func<int32_t*>
566 //
567 // Try to match the basename with or without template parameters.
568 if (GetBasename() != identifier &&
569 GetBasenameNoTemplateParameters() != identifier)
570 return false;
571
572 // Incoming path only had an identifier, so we match.
573 if (context.empty())
574 return true;
575 // Incoming path has context but this method does not, no match.
576 if (m_context.empty())
577 return false;
578
579 llvm::StringRef haystack = m_context;
580 if (!haystack.consume_back(context))
581 return false;
582 if (haystack.empty() || !isalnum(haystack.back()))
583 return true;
584
585 return false;
586}
587
589 ConstString demangled) const {
590 CxxMethodName demangled_name(demangled);
591 return demangled_name.ContainsPath(path);
592}
593
595 const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {
598 identifier);
599
600 CPlusPlusNameParser parser(name);
601 if (auto full_name = parser.ParseAsFullName()) {
602 identifier = full_name->basename;
603 context = full_name->context;
604 return true;
605 }
606 return false;
607}
608
610 const ConstString mangled_name) const {
611 std::vector<ConstString> alternates;
612
613 /// Get a basic set of alternative manglings for the given symbol `name`, by
614 /// making a few basic possible substitutions on basic types, storage duration
615 /// and `const`ness for the given symbol. The output parameter `alternates`
616 /// is filled with a best-guess, non-exhaustive set of different manglings
617 /// for the given name.
618
619 // Maybe we're looking for a const symbol but the debug info told us it was
620 // non-const...
621 if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
622 strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
623 std::string fixed_scratch("_ZNK");
624 fixed_scratch.append(mangled_name.GetCString() + 3);
625 alternates.push_back(ConstString(fixed_scratch));
626 }
627
628 // Maybe we're looking for a static symbol but we thought it was global...
629 if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
630 strncmp(mangled_name.GetCString(), "_ZL", 3)) {
631 std::string fixed_scratch("_ZL");
632 fixed_scratch.append(mangled_name.GetCString() + 2);
633 alternates.push_back(ConstString(fixed_scratch));
634 }
635
636 auto *log = GetLog(LLDBLog::Language);
637
638 // `char` is implementation defined as either `signed` or `unsigned`. As a
639 // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
640 // char, 'h'-unsigned char. If we're looking for symbols with a signed char
641 // parameter, try finding matches which have the general case 'c'.
642 if (auto char_fixup_or_err =
643 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "a", "c")) {
644 // LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
645 if (*char_fixup_or_err)
646 alternates.push_back(*char_fixup_or_err);
647 } else
648 LLDB_LOG_ERROR(log, char_fixup_or_err.takeError(),
649 "Failed to substitute 'char' type mangling: {0}");
650
651 // long long parameter mangling 'x', may actually just be a long 'l' argument
652 if (auto long_fixup_or_err =
653 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "x", "l")) {
654 if (*long_fixup_or_err)
655 alternates.push_back(*long_fixup_or_err);
656 } else
657 LLDB_LOG_ERROR(log, long_fixup_or_err.takeError(),
658 "Failed to substitute 'long long' type mangling: {0}");
659
660 // unsigned long long parameter mangling 'y', may actually just be unsigned
661 // long 'm' argument
662 if (auto ulong_fixup_or_err =
663 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "y", "m")) {
664 if (*ulong_fixup_or_err)
665 alternates.push_back(*ulong_fixup_or_err);
666 } else
668 log, ulong_fixup_or_err.takeError(),
669 "Failed to substitute 'unsigned long long' type mangling: {0}");
670
671 if (auto ctor_fixup_or_err = SubstituteStructorAliases_ItaniumMangle(
672 mangled_name.GetStringRef())) {
673 if (*ctor_fixup_or_err) {
674 alternates.push_back(*ctor_fixup_or_err);
675 }
676 } else
677 LLDB_LOG_ERROR(log, ctor_fixup_or_err.takeError(),
678 "Failed to substitute structor alias manglings: {0}");
679
680 return alternates;
681}
682
684 const Mangled mangled, const SymbolContext &sym_ctx) const {
685 ConstString demangled = mangled.GetDemangledName();
686 if (!demangled)
687 return ConstString();
688
689 CxxMethodName cpp_name(demangled);
690 std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
691
692 if (!scope_qualified_name.size())
693 return ConstString();
694
695 if (!sym_ctx.module_sp)
696 return ConstString();
697
698 lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
699 if (!sym_file)
700 return ConstString();
701
702 std::vector<ConstString> alternates;
703 sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
704
705 std::vector<ConstString> param_and_qual_matches;
706 std::vector<ConstString> param_matches;
707 for (size_t i = 0; i < alternates.size(); i++) {
708 ConstString alternate_mangled_name = alternates[i];
709 Mangled mangled(alternate_mangled_name);
710 ConstString demangled = mangled.GetDemangledName();
711
712 CxxMethodName alternate_cpp_name(demangled);
713 if (!cpp_name.IsValid())
714 continue;
715
716 if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
717 if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
718 param_and_qual_matches.push_back(alternate_mangled_name);
719 else
720 param_matches.push_back(alternate_mangled_name);
721 }
722 }
723
724 if (param_and_qual_matches.size())
725 return param_and_qual_matches[0]; // It is assumed that there will be only
726 // one!
727 else if (param_matches.size())
728 return param_matches[0]; // Return one of them as a best match
729 else
730 return ConstString();
731}
732
733static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
734 if (!cpp_category_sp)
735 return;
736
737 TypeSummaryImpl::Flags stl_summary_flags;
738 stl_summary_flags.SetCascades(true)
739 .SetSkipPointers(false)
740 .SetSkipReferences(false)
742 .SetDontShowValue(false)
744 .SetHideItemNames(false);
745
746 AddCXXSummary(cpp_category_sp,
748 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
749 stl_summary_flags, true);
750 AddCXXSummary(cpp_category_sp,
752 "std::string summary provider",
753 "^std::__[[:alnum:]]+::basic_string<char, "
754 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
755 stl_summary_flags, true);
756 AddCXXSummary(cpp_category_sp,
758 "std::string summary provider",
759 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
760 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
761 stl_summary_flags, true);
762
763 AddCXXSummary(cpp_category_sp,
765 "std::u16string summary provider",
766 "^std::__[[:alnum:]]+::basic_string<char16_t, "
767 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
768 stl_summary_flags, true);
769
770 AddCXXSummary(cpp_category_sp,
772 "std::u32string summary provider",
773 "^std::__[[:alnum:]]+::basic_string<char32_t, "
774 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
775 stl_summary_flags, true);
776
777 AddCXXSummary(cpp_category_sp,
779 "std::wstring summary provider",
780 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
781 AddCXXSummary(cpp_category_sp,
783 "std::wstring summary provider",
784 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
785 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
786 stl_summary_flags, true);
787
788 AddCXXSummary(cpp_category_sp,
790 "std::string_view summary provider",
791 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
792 AddCXXSummary(cpp_category_sp,
794 "std::string_view summary provider",
795 "^std::__[[:alnum:]]+::basic_string_view<char, "
796 "std::__[[:alnum:]]+::char_traits<char> >$",
797 stl_summary_flags, true);
798 AddCXXSummary(cpp_category_sp,
800 "std::string_view summary provider",
801 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
802 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
803 stl_summary_flags, true);
804
805 AddCXXSummary(cpp_category_sp,
807 "std::u16string_view summary provider",
808 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
809 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
810 stl_summary_flags, true);
811
812 AddCXXSummary(cpp_category_sp,
814 "std::u32string_view summary provider",
815 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
816 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
817 stl_summary_flags, true);
818
819 AddCXXSummary(cpp_category_sp,
821 "std::wstring_view summary provider",
822 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
823 AddCXXSummary(cpp_category_sp,
825 "std::wstring_view summary provider",
826 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
827 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
828 stl_summary_flags, true);
829
830 SyntheticChildren::Flags stl_synth_flags;
831 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
832 false);
833 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
834 stl_deref_flags.SetFrontEndWantsDereference();
835
837 cpp_category_sp,
839 "libc++ std::bitset synthetic children",
840 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
842 cpp_category_sp,
844 "libc++ std::vector synthetic children",
845 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
847 cpp_category_sp,
849 "libc++ std::valarray synthetic children",
850 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
852 cpp_category_sp,
854 "libc++ std::slice_array synthetic children",
855 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
857 cpp_category_sp,
859 "libc++ synthetic children for the valarray proxy arrays",
860 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
861 stl_deref_flags, true);
863 cpp_category_sp,
865 "libc++ std::forward_list synthetic children",
866 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
868 cpp_category_sp,
870 "libc++ std::list synthetic children",
871 // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"
872 // so that it does not clash with: "^std::(__cxx11::)?list<.+>$"
873 "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
874 "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
875 stl_deref_flags, true);
877 cpp_category_sp,
879 "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
880 stl_synth_flags, true);
882 cpp_category_sp,
884 "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
885 stl_deref_flags, true);
887 cpp_category_sp,
889 "libc++ std::multiset synthetic children",
890 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
892 cpp_category_sp,
894 "libc++ std::multimap synthetic children",
895 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
897 cpp_category_sp,
899 "libc++ std::unordered containers synthetic children",
900 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
901 stl_synth_flags, true);
903 cpp_category_sp,
905 "libc++ std::initializer_list synthetic children",
906 "^std::initializer_list<.+>$", stl_synth_flags, true);
908 "libc++ std::queue synthetic children",
909 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
911 "libc++ std::tuple synthetic children",
912 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
914 "libc++ std::optional synthetic children",
915 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
917 "libc++ std::variant synthetic children",
918 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
920 cpp_category_sp,
922 "libc++ std::atomic synthetic children",
923 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
925 cpp_category_sp,
927 "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
928 stl_deref_flags, true);
930 cpp_category_sp,
932 "libc++ std::ranges::ref_view synthetic children",
933 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
934
935 cpp_category_sp->AddTypeSynthetic(
936 "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
938 stl_synth_flags,
939 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
940
942 cpp_category_sp,
944 "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
945 stl_synth_flags, true);
946
947 static constexpr const char *const libcxx_std_unique_ptr_regex =
948 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
950 cpp_category_sp,
952 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
953 stl_synth_flags, true);
954
956 cpp_category_sp,
958 "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
959 stl_synth_flags, true);
960 AddCXXSummary(cpp_category_sp,
962 "libc++ std::function summary provider",
963 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
964
965 static constexpr const char *const libcxx_std_coroutine_handle_regex =
966 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
968 cpp_category_sp,
970 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
971 stl_deref_flags, true);
972
973 stl_summary_flags.SetDontShowChildren(false);
974 stl_summary_flags.SetSkipPointers(false);
975 AddCXXSummary(cpp_category_sp,
977 "libc++ std::bitset summary provider",
978 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
979 AddCXXSummary(cpp_category_sp,
981 "libc++ std::vector summary provider",
982 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
983 AddCXXSummary(cpp_category_sp,
985 "libc++ std::valarray summary provider",
986 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
987 AddCXXSummary(cpp_category_sp,
989 "libc++ std::slice_array summary provider",
990 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
991 true);
992 AddCXXSummary(cpp_category_sp,
994 "libc++ summary provider for the valarray proxy arrays",
995 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
996 stl_summary_flags, true);
999 "libc++ std::list summary provider",
1000 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
1003 "libc++ std::list summary provider",
1004 // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"
1005 // so that it does not clash with: "^std::(__cxx11::)?list<.+>$"
1006 "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
1007 "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
1008 stl_summary_flags, true);
1009 AddCXXSummary(cpp_category_sp,
1011 "libc++ std::map summary provider",
1012 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
1013 AddCXXSummary(cpp_category_sp,
1015 "libc++ std::deque summary provider",
1016 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
1017 AddCXXSummary(cpp_category_sp,
1019 "libc++ std::queue summary provider",
1020 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
1021 AddCXXSummary(cpp_category_sp,
1023 "libc++ std::set summary provider",
1024 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
1025 AddCXXSummary(cpp_category_sp,
1027 "libc++ std::multiset summary provider",
1028 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
1029 AddCXXSummary(cpp_category_sp,
1031 "libc++ std::multimap summary provider",
1032 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
1033 AddCXXSummary(cpp_category_sp,
1035 "libc++ std::unordered containers summary provider",
1036 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1037 stl_summary_flags, true);
1039 "libc++ std::tuple summary provider",
1040 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
1041 AddCXXSummary(cpp_category_sp,
1043 "libc++ std::atomic summary provider",
1044 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
1045 AddCXXSummary(cpp_category_sp,
1047 "libc++ std::optional summary provider",
1048 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
1049 AddCXXSummary(cpp_category_sp,
1051 "libc++ std::variant summary provider",
1052 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
1053 AddCXXSummary(cpp_category_sp,
1055 "libc++ std::span summary provider",
1056 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
1057
1058 stl_summary_flags.SetSkipPointers(true);
1059
1060 AddCXXSummary(cpp_category_sp,
1062 "libc++ std::shared_ptr summary provider",
1063 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1064 true);
1065 AddCXXSummary(cpp_category_sp,
1067 "libc++ std::weak_ptr summary provider",
1068 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
1069 AddCXXSummary(cpp_category_sp,
1071 "libc++ std::unique_ptr summary provider",
1072 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
1073
1074 AddCXXSummary(cpp_category_sp,
1076 "libc++ std::coroutine_handle summary provider",
1077 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
1078
1080 cpp_category_sp,
1082 "std::vector iterator synthetic children",
1083 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
1084
1086 cpp_category_sp,
1088 "std::map iterator synthetic children",
1089 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1090 true);
1091
1092 AddCXXSynthetic(cpp_category_sp,
1095 "std::unordered_map iterator synthetic children",
1096 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1097 stl_synth_flags, true);
1098 // Chrono duration typedefs
1099 cpp_category_sp->AddTypeSummary(
1100 "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
1102 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
1103 cpp_category_sp->AddTypeSummary(
1104 "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
1106 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
1107 cpp_category_sp->AddTypeSummary(
1108 "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
1110 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
1111 cpp_category_sp->AddTypeSummary(
1112 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1114 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1115 cpp_category_sp->AddTypeSummary(
1116 "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
1117 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1118 eTypeOptionHideValue,
1119 "${var.__rep_} min")));
1120 cpp_category_sp->AddTypeSummary(
1121 "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
1123 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
1124
1125 cpp_category_sp->AddTypeSummary(
1126 "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
1127 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1128 eTypeOptionHideValue,
1129 "${var.__rep_} days")));
1130 cpp_category_sp->AddTypeSummary(
1131 "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
1132 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1133 eTypeOptionHideValue,
1134 "${var.__rep_} weeks")));
1135 cpp_category_sp->AddTypeSummary(
1136 "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
1137 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1138 eTypeOptionHideValue,
1139 "${var.__rep_} months")));
1140 cpp_category_sp->AddTypeSummary(
1141 "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
1142 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1143 eTypeOptionHideValue,
1144 "${var.__rep_} years")));
1145 cpp_category_sp->AddTypeSummary(
1146 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1148 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1149
1150 // Chrono time point types
1151
1152 AddCXXSummary(cpp_category_sp,
1154 "libc++ std::chrono::sys_seconds summary provider",
1155 "^std::__[[:alnum:]]+::chrono::time_point<"
1156 "std::__[[:alnum:]]+::chrono::system_clock, "
1157 "std::__[[:alnum:]]+::chrono::duration<.*, "
1158 "std::__[[:alnum:]]+::ratio<1, 1> "
1159 "> >$",
1160 eTypeOptionHideChildren | eTypeOptionHideValue |
1161 eTypeOptionCascade,
1162 true);
1163 AddCXXSummary(cpp_category_sp,
1165 "libc++ std::chrono::sys_seconds summary provider",
1166 "^std::__[[:alnum:]]+::chrono::time_point<"
1167 "std::__[[:alnum:]]+::chrono::system_clock, "
1168 "std::__[[:alnum:]]+::chrono::duration<int, "
1169 "std::__[[:alnum:]]+::ratio<86400, 1> "
1170 "> >$",
1171 eTypeOptionHideChildren | eTypeOptionHideValue |
1172 eTypeOptionCascade,
1173 true);
1174
1176 cpp_category_sp,
1178 "libc++ std::chrono::local_seconds summary provider",
1179 "^std::__[[:alnum:]]+::chrono::time_point<"
1180 "std::__[[:alnum:]]+::chrono::local_t, "
1181 "std::__[[:alnum:]]+::chrono::duration<.*, "
1182 "std::__[[:alnum:]]+::ratio<1, 1> "
1183 "> >$",
1184 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1185 true);
1186 AddCXXSummary(cpp_category_sp,
1188 "libc++ std::chrono::local_seconds summary provider",
1189 "^std::__[[:alnum:]]+::chrono::time_point<"
1190 "std::__[[:alnum:]]+::chrono::local_t, "
1191 "std::__[[:alnum:]]+::chrono::duration<int, "
1192 "std::__[[:alnum:]]+::ratio<86400, 1> "
1193 "> >$",
1194 eTypeOptionHideChildren | eTypeOptionHideValue |
1195 eTypeOptionCascade,
1196 true);
1197
1198 // Chrono calendar types
1199
1200 cpp_category_sp->AddTypeSummary(
1201 "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1202 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1203 eTypeOptionHideValue,
1204 "day=${var.__d_%u}")));
1205
1206 AddCXXSummary(cpp_category_sp,
1208 "libc++ std::chrono::month summary provider",
1209 "^std::__[[:alnum:]]+::chrono::month$",
1210 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1211
1212 cpp_category_sp->AddTypeSummary(
1213 "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1215 eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1216
1217 AddCXXSummary(cpp_category_sp,
1219 "libc++ std::chrono::weekday summary provider",
1220 "^std::__[[:alnum:]]+::chrono::weekday$",
1221 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1222
1223 cpp_category_sp->AddTypeSummary(
1224 "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
1226 eTypeOptionHideChildren | eTypeOptionHideValue,
1227 "${var.__wd_} index=${var.__idx_%u}")));
1228
1229 cpp_category_sp->AddTypeSummary(
1230 "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
1231 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1232 eTypeOptionHideValue,
1233 "${var.__wd_} index=last")));
1234 cpp_category_sp->AddTypeSummary(
1235 "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1236 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1237 eTypeOptionHideValue,
1238 "${var.__m_} ${var.__d_}")));
1239 cpp_category_sp->AddTypeSummary(
1240 "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1241 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1242 eTypeOptionHideValue,
1243 "${var.__m_} day=last")));
1244
1245 cpp_category_sp->AddTypeSummary(
1246 "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
1247 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1248 eTypeOptionHideValue,
1249 "${var.__m_} ${var.__wdi_}")));
1250
1251 cpp_category_sp->AddTypeSummary(
1252 "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
1253 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1254 eTypeOptionHideValue,
1255 "${var.__m_} ${var.__wdl_}")));
1256
1257 cpp_category_sp->AddTypeSummary(
1258 "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
1259 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1260 eTypeOptionHideValue,
1261 "${var.__y_} ${var.__m_}")));
1262
1264 cpp_category_sp,
1266 "libc++ std::chrono::year_month_day summary provider",
1267 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1268 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1269
1270 cpp_category_sp->AddTypeSummary(
1271 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1273 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1274 eTypeOptionHideValue,
1275 "${var.__y_} ${var.__mdl_}")));
1276
1277 cpp_category_sp->AddTypeSummary(
1278 "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
1280 eTypeOptionHideChildren | eTypeOptionHideValue,
1281 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1282
1283 cpp_category_sp->AddTypeSummary(
1284 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1287 eTypeOptionHideChildren | eTypeOptionHideValue,
1288 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1289}
1290
1292 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1293 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1294 auto makeSpecifier = [](llvm::StringRef name) {
1295 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1296 name, eFormatterMatchExact);
1297 };
1298
1299 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1300
1301 category_sp->AddTypeSummary(
1302 makeSpecifier(llvm::formatv("std::basic_string<{}>", char_ty).str()),
1303 summary_sp);
1304
1305 category_sp->AddTypeSummary(
1306 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1307 llvm::formatv("^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1308 char_ty)
1309 .str(),
1311 summary_sp);
1312}
1313
1315 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1316 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1317 // std::string_view
1318 category_sp->AddTypeSummary(
1319 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1320 string_ty, eFormatterMatchExact),
1321 summary_sp);
1322
1323 // std::basic_string_view<char, std::char_traits<char>>
1324 // NativePDB has spaces at different positions compared to PDB and DWARF, so
1325 // use a regex and make them optional.
1326 category_sp->AddTypeSummary(
1327 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1328 llvm::formatv(
1329 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1330 char_ty)
1331 .str(),
1333 summary_sp);
1334}
1335
1337 if (!cpp_category_sp)
1338 return;
1339
1340 TypeSummaryImpl::Flags stl_summary_flags;
1341 stl_summary_flags.SetCascades(true)
1342 .SetSkipPointers(false)
1343 .SetSkipReferences(false)
1344 .SetDontShowChildren(true)
1345 .SetDontShowValue(false)
1347 .SetHideItemNames(false);
1348
1350 stl_summary_flags, LibStdcppStringSummaryProvider,
1351 "libstdc++ std::(w)string summary provider"));
1352 cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1353 string_summary_sp);
1354 cpp_category_sp->AddTypeSummary(
1355 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1356 eFormatterMatchRegex, string_summary_sp);
1357 cpp_category_sp->AddTypeSummary("^std::__cxx11::basic_string<unsigned char, "
1358 "std::char_traits<unsigned char>,.*>$",
1359 eFormatterMatchRegex, string_summary_sp);
1360
1361 cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1362 string_summary_sp);
1363 cpp_category_sp->AddTypeSummary(
1364 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1365 eFormatterMatchRegex, string_summary_sp);
1366
1367 SyntheticChildren::Flags stl_synth_flags;
1368 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1369 false);
1370 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1371 stl_deref_flags.SetFrontEndWantsDereference();
1372
1373 cpp_category_sp->AddTypeSynthetic(
1374 "^std::__debug::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1376 stl_synth_flags,
1377 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1378 cpp_category_sp->AddTypeSynthetic(
1379 "^std::__debug::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1381 stl_synth_flags,
1382 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1383 cpp_category_sp->AddTypeSynthetic(
1384 "^std::__debug::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1386 stl_deref_flags,
1387 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1388 cpp_category_sp->AddTypeSynthetic(
1389 "^std::__debug::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1391 stl_deref_flags,
1392 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1393 cpp_category_sp->AddTypeSynthetic(
1394 "^std::__debug::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1396 stl_deref_flags,
1397 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1398 cpp_category_sp->AddTypeSynthetic(
1399 "^std::__debug::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1401 stl_deref_flags,
1402 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1403 cpp_category_sp->AddTypeSynthetic(
1404 "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1406 stl_deref_flags,
1407 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1408 cpp_category_sp->AddTypeSynthetic(
1409 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", eFormatterMatchRegex,
1411 stl_deref_flags,
1412 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1413 cpp_category_sp->AddTypeSynthetic(
1414 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1416 stl_synth_flags,
1417 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1418
1419 stl_summary_flags.SetDontShowChildren(false);
1420 stl_summary_flags.SetSkipPointers(false);
1421
1424 "libstdc++ std::bitset summary provider",
1425 "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags, true);
1426
1427 AddCXXSummary(cpp_category_sp,
1429 "libstdc++ std::__debug::vector summary provider",
1430 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags, true);
1431
1432 AddCXXSummary(cpp_category_sp,
1434 "libstdc++ debug std::map summary provider",
1435 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags, true);
1436
1437 AddCXXSummary(cpp_category_sp,
1439 "libstdc++ debug std::set summary provider",
1440 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags, true);
1441
1443 "libstdc++ debug std::deque summary provider",
1444 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags, true);
1445
1448 "libstdc++ debug std::multimap summary provider",
1449 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags, true);
1450
1453 "libstdc++ debug std::multiset summary provider",
1454 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags, true);
1455
1456 AddCXXSummary(cpp_category_sp,
1458 "libstdc++ debug std unordered container summary provider",
1459 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1460 stl_summary_flags, true);
1461
1464 "libstdc++ debug std::list summary provider",
1465 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags, true);
1466
1467 cpp_category_sp->AddTypeSummary(
1468 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1470 stl_summary_flags,
1471 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1472
1474 cpp_category_sp,
1476 "std::vector iterator synthetic children",
1477 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1478
1480 cpp_category_sp,
1482 "std::map iterator synthetic children",
1483 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags, true);
1484
1486 cpp_category_sp,
1488 "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1489 stl_synth_flags, true);
1490
1491 static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1492 "^std::coroutine_handle<.+>(( )?&)?$";
1494 cpp_category_sp,
1496 "std::coroutine_handle synthetic children",
1497 libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1498
1500 cpp_category_sp,
1502 "std::bitset synthetic child", "^std::(__debug::)?bitset<.+>(( )?&)?$",
1503 stl_deref_flags, true);
1504
1505 AddCXXSummary(cpp_category_sp,
1507 "libstdc++ std::coroutine_handle summary provider",
1508 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1509}
1510
1511static lldb_private::SyntheticChildrenFrontEnd *
1513 lldb::ValueObjectSP valobj_sp) {
1514 if (!valobj_sp)
1515 return nullptr;
1516
1517 if (IsMsvcStlSmartPointer(*valobj_sp))
1519 return LibStdcppSharedPtrSyntheticFrontEndCreator(children, valobj_sp);
1520}
1521
1522static bool
1524 const TypeSummaryOptions &options) {
1525 if (IsMsvcStlSmartPointer(valobj))
1526 return MsvcStlSmartPointerSummaryProvider(valobj, stream, options);
1527 return LibStdcppSmartPointerSummaryProvider(valobj, stream, options);
1528}
1529
1530static lldb_private::SyntheticChildrenFrontEnd *
1532 lldb::ValueObjectSP valobj_sp) {
1533 if (!valobj_sp)
1534 return nullptr;
1535
1536 if (IsMsvcStlUniquePtr(*valobj_sp))
1538 return LibStdcppUniquePtrSyntheticFrontEndCreator(children, valobj_sp);
1539}
1540
1542 const TypeSummaryOptions &options) {
1543 if (IsMsvcStlUniquePtr(valobj))
1544 return MsvcStlUniquePtrSummaryProvider(valobj, stream, options);
1545 return LibStdcppUniquePointerSummaryProvider(valobj, stream, options);
1546}
1547
1548static SyntheticChildrenFrontEnd *
1550 lldb::ValueObjectSP valobj_sp) {
1551 if (!valobj_sp)
1552 return nullptr;
1553
1554 if (IsMsvcStlTuple(*valobj_sp))
1555 return MsvcStlTupleSyntheticFrontEndCreator(children, valobj_sp);
1556 return LibStdcppTupleSyntheticFrontEndCreator(children, valobj_sp);
1557}
1558
1559static SyntheticChildrenFrontEnd *
1561 lldb::ValueObjectSP valobj_sp) {
1562 if (!valobj_sp)
1563 return nullptr;
1564
1565 // checks for vector<T> and vector<bool>
1566 if (auto *msvc = MsvcStlVectorSyntheticFrontEndCreator(valobj_sp))
1567 return msvc;
1568
1570 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1571}
1572
1573static SyntheticChildrenFrontEnd *
1575 lldb::ValueObjectSP valobj_sp) {
1576 if (!valobj_sp)
1577 return nullptr;
1578
1579 if (IsMsvcStlList(*valobj_sp))
1580 return MsvcStlListSyntheticFrontEndCreator(children, valobj_sp);
1582 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1583}
1584
1585static SyntheticChildrenFrontEnd *
1587 lldb::ValueObjectSP valobj_sp) {
1588 if (!valobj_sp)
1589 return nullptr;
1590
1591 if (IsMsvcStlList(*valobj_sp))
1592 return MsvcStlForwardListSyntheticFrontEndCreator(children, valobj_sp);
1594 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1595 *valobj_sp);
1596}
1597
1598static SyntheticChildrenFrontEnd *
1600 lldb::ValueObjectSP valobj_sp) {
1601 if (!valobj_sp)
1602 return nullptr;
1603
1604 if (IsMsvcStlOptional(*valobj_sp))
1605 return MsvcStlOptionalSyntheticFrontEndCreator(children, valobj_sp);
1606 return LibStdcppOptionalSyntheticFrontEndCreator(children, valobj_sp);
1607}
1608
1609static SyntheticChildrenFrontEnd *
1611 lldb::ValueObjectSP valobj_sp) {
1612 if (!valobj_sp)
1613 return nullptr;
1614
1615 if (IsMsvcStlVariant(*valobj_sp))
1616 return MsvcStlVariantSyntheticFrontEndCreator(children, valobj_sp);
1618 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1619}
1620
1622 const TypeSummaryOptions &options) {
1623 if (IsMsvcStlVariant(valobj))
1624 return MsvcStlVariantSummaryProvider(valobj, stream, options);
1625 return LibStdcppVariantSummaryProvider(valobj, stream, options);
1626}
1627
1628static SyntheticChildrenFrontEnd *
1630 ValueObjectSP valobj_sp) {
1631 if (!valobj_sp)
1632 return nullptr;
1633
1634 if (IsMsvcStlUnordered(*valobj_sp))
1635 return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
1637 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1638 *valobj_sp);
1639}
1640
1641static SyntheticChildrenFrontEnd *
1643 ValueObjectSP valobj_sp) {
1644 if (!valobj_sp)
1645 return nullptr;
1646
1647 if (IsMsvcStlMapLike(*valobj_sp))
1650 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1651}
1652
1653static SyntheticChildrenFrontEnd *
1655 ValueObjectSP valobj_sp) {
1656 if (!valobj_sp)
1657 return nullptr;
1658
1659 if (IsMsvcStlDeque(*valobj_sp))
1660 return MsvcStlDequeSyntheticFrontEndCreator(children, valobj_sp);
1662 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1663}
1664
1665/// Load formatters that are formatting types from more than one STL
1667 if (!cpp_category_sp)
1668 return;
1669
1670 TypeSummaryImpl::Flags stl_summary_flags;
1671 stl_summary_flags.SetCascades(true)
1672 .SetSkipPointers(false)
1673 .SetSkipReferences(false)
1674 .SetDontShowChildren(true)
1675 .SetDontShowValue(false)
1677 .SetHideItemNames(false);
1678 SyntheticChildren::Flags stl_synth_flags;
1679 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1680 false);
1681
1683
1685 cpp_category_sp, "std::string", "char",
1686 std::make_shared<CXXFunctionSummaryFormat>(
1687 stl_summary_flags,
1688 [](ValueObject &valobj, Stream &stream,
1689 const TypeSummaryOptions &options) {
1690 if (IsMsvcStlStringType(valobj))
1692 valobj, stream, options);
1693 return LibStdcppStringSummaryProvider(valobj, stream, options);
1694 },
1695 "MSVC STL/libstdc++ std::string summary provider"));
1697 cpp_category_sp, "std::wstring", "wchar_t",
1698 std::make_shared<CXXFunctionSummaryFormat>(
1699 stl_summary_flags,
1700 [](ValueObject &valobj, Stream &stream,
1701 const TypeSummaryOptions &options) {
1702 if (IsMsvcStlStringType(valobj))
1703 return MsvcStlWStringSummaryProvider(valobj, stream, options);
1704 return LibStdcppStringSummaryProvider(valobj, stream, options);
1705 },
1706 "MSVC STL/libstdc++ std::wstring summary provider"));
1707
1708 stl_summary_flags.SetDontShowChildren(false);
1709 stl_summary_flags.SetSkipPointers(false);
1710
1712 "std::shared_ptr synthetic children",
1713 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1715 "std::weak_ptr synthetic children",
1716 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1718 "std::unique_ptr synthetic children",
1719 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1721 "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$",
1722 stl_synth_flags, true);
1724 "std::list synthetic children", "^std::list<.+>(( )?&)?$",
1725 stl_synth_flags, true);
1727 "std::forward_list synthetic children",
1728 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
1730 "std::variant synthetic children", "^std::variant<.*>$",
1731 stl_synth_flags, true);
1733 "std::unordered container synthetic children",
1734 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
1735 true);
1736
1737 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1738 stl_deref_flags.SetFrontEndWantsDereference();
1740 "std::optional synthetic children",
1741 "^std::optional<.+>(( )?&)?$", stl_deref_flags, true);
1743 "std::deque container synthetic children",
1744 "^std::deque<.+>(( )?&)?$", stl_deref_flags, true);
1745
1747 "std::(multi)?map/set synthetic children",
1748 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
1749 true);
1750
1752 "MSVC STL/libstdc++ std::shared_ptr summary provider",
1753 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1755 "MSVC STL/libstdc++ std::weak_ptr summary provider",
1756 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1758 "MSVC STL/libstdc++ std::unique_ptr summary provider",
1759 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1761 "MSVC STL/libstdc++ std::tuple summary provider",
1762 "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true);
1764 "MSVC/libstdc++ std::vector summary provider",
1765 "^std::vector<.+>(( )?&)?$", stl_summary_flags, true);
1767 "MSVC/libstdc++ std::vector synthetic provider",
1768 "^std::vector<.+>(( )?&)?$", stl_synth_flags, true);
1770 "MSVC STL/libstdc++ std::list summary provider",
1771 "^std::list<.+>(( )?&)?$", stl_summary_flags, true);
1772 cpp_category_sp->AddTypeSummary(
1773 "^std::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1775 stl_summary_flags,
1776 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1778 "MSVC STL/libstd++ std::optional summary provider",
1779 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
1781 "MSVC STL/libstdc++ std::variant summary provider",
1782 "^std::variant<.*>$", stl_summary_flags, true);
1784 "MSVC STL/libstdc++ std unordered container summary provider",
1785 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
1786 true);
1788 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
1789 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
1790 true);
1792 "MSVC STL/libstd++ std::deque summary provider",
1793 "^std::deque<.+>(( )?&)?$", stl_summary_flags, true);
1794}
1795
1797 if (!cpp_category_sp)
1798 return;
1799
1800 TypeSummaryImpl::Flags stl_summary_flags;
1801 stl_summary_flags.SetCascades(true)
1802 .SetSkipPointers(false)
1803 .SetSkipReferences(false)
1804 .SetDontShowChildren(true)
1805 .SetDontShowValue(false)
1807 .SetHideItemNames(false);
1808 SyntheticChildren::Flags stl_synth_flags;
1809 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1810 false);
1811
1813
1815 cpp_category_sp, "std::u8string", "char8_t",
1816 std::make_shared<CXXFunctionSummaryFormat>(
1817 stl_summary_flags,
1819 "MSVC STL std::u8string summary provider"));
1821 cpp_category_sp, "std::u16string", "char16_t",
1822 std::make_shared<CXXFunctionSummaryFormat>(
1823 stl_summary_flags,
1825 "MSVC STL std::u16string summary provider"));
1827 cpp_category_sp, "std::u32string", "char32_t",
1828 std::make_shared<CXXFunctionSummaryFormat>(
1829 stl_summary_flags,
1831 "MSVC STL std::u32string summary provider"));
1832
1834 cpp_category_sp, "std::string_view", "char",
1835 std::make_shared<CXXFunctionSummaryFormat>(
1836 stl_summary_flags,
1838 "MSVC STL std::string_view summary provider"));
1840 cpp_category_sp, "std::u8string_view", "char8_t",
1841 std::make_shared<CXXFunctionSummaryFormat>(
1842 stl_summary_flags,
1844 "MSVC STL std::u8string_view summary provider"));
1846 cpp_category_sp, "std::u16string_view", "char16_t",
1847 std::make_shared<CXXFunctionSummaryFormat>(
1848 stl_summary_flags,
1850 "MSVC STL std::u16string_view summary provider"));
1852 cpp_category_sp, "std::u32string_view", "char32_t",
1853 std::make_shared<CXXFunctionSummaryFormat>(
1854 stl_summary_flags,
1856 "MSVC STL std::u32string_view summary provider"));
1858 cpp_category_sp, "std::wstring_view", "wchar_t",
1859 std::make_shared<CXXFunctionSummaryFormat>(
1860 stl_summary_flags, MsvcStlWStringViewSummaryProvider,
1861 "MSVC STL std::wstring_view summary provider"));
1862
1863 stl_summary_flags.SetDontShowChildren(false);
1864
1866 "MSVC STL std::atomic synthetic children",
1867 "^std::atomic<.+>$", stl_synth_flags, true);
1868
1870 "MSVC STL std::atomic summary provider", "^std::atomic<.+>$",
1871 stl_summary_flags, true);
1873 "MSVC STL tree iterator synthetic children",
1874 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
1875 true);
1877 "MSVC STL tree iterator summary",
1878 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
1879 true);
1880}
1881
1883 if (!cpp_category_sp)
1884 return;
1885
1886 TypeSummaryImpl::Flags string_flags;
1887 string_flags.SetCascades(true)
1888 .SetSkipPointers(true)
1889 .SetSkipReferences(false)
1890 .SetDontShowChildren(true)
1891 .SetDontShowValue(false)
1893 .SetHideItemNames(false);
1894
1895 TypeSummaryImpl::Flags string_array_flags;
1896 string_array_flags.SetCascades(true)
1897 .SetSkipPointers(true)
1898 .SetSkipReferences(false)
1899 .SetDontShowChildren(true)
1900 .SetDontShowValue(true)
1902 .SetHideItemNames(false);
1903
1904 AddCXXSummary(cpp_category_sp,
1906 "char8_t * summary provider", "char8_t *", string_flags);
1907 AddCXXSummary(cpp_category_sp,
1909 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
1910 string_array_flags, true);
1911
1912 AddCXXSummary(cpp_category_sp,
1914 "char16_t * summary provider", "char16_t *", string_flags);
1915 AddCXXSummary(cpp_category_sp,
1917 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
1918 string_array_flags, true);
1919
1920 AddCXXSummary(cpp_category_sp,
1922 "char32_t * summary provider", "char32_t *", string_flags);
1923 AddCXXSummary(cpp_category_sp,
1925 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
1926 string_array_flags, true);
1927
1928 AddCXXSummary(cpp_category_sp,
1930 "wchar_t * summary provider", "wchar_t *", string_flags);
1931 AddCXXSummary(cpp_category_sp,
1933 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
1934 string_array_flags, true);
1935
1936 AddCXXSummary(cpp_category_sp,
1938 "unichar * summary provider", "unichar *", string_flags);
1939
1940 TypeSummaryImpl::Flags widechar_flags;
1941 widechar_flags.SetDontShowValue(true)
1942 .SetSkipPointers(true)
1943 .SetSkipReferences(false)
1944 .SetCascades(true)
1945 .SetDontShowChildren(true)
1946 .SetHideItemNames(true)
1947 .SetShowMembersOneLiner(false);
1948
1950 "char8_t summary provider", "char8_t", widechar_flags);
1951 AddCXXSummary(cpp_category_sp,
1953 "char16_t summary provider", "char16_t", widechar_flags);
1954 AddCXXSummary(cpp_category_sp,
1956 "char32_t summary provider", "char32_t", widechar_flags);
1958 "wchar_t summary provider", "wchar_t", widechar_flags);
1959
1960 AddCXXSummary(cpp_category_sp,
1962 "unichar summary provider", "unichar", widechar_flags);
1963}
1964
1965std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
1966 class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
1967 public:
1968 CompilerType AdjustForInclusion(CompilerType &candidate) override {
1969 LanguageType lang_type(candidate.GetMinimumLanguage());
1970 if (!Language::LanguageIsC(lang_type) &&
1972 return CompilerType();
1973 if (candidate.IsTypedefType())
1974 return candidate.GetTypedefedType();
1975 return candidate;
1976 }
1977 };
1978
1979 return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
1980}
1981
1983 static llvm::once_flag g_initialize;
1984 static TypeCategoryImplSP g_category;
1985
1986 llvm::call_once(g_initialize, [this]() -> void {
1988 g_category);
1989 if (g_category) {
1990 // NOTE: the libstdcpp formatters are loaded after libcxx formatters
1991 // because we don't want to the libcxx formatters to match the potential
1992 // `__debug` inline namespace that libstdcpp may use.
1993 // LLDB prioritizes the last loaded matching formatter.
1994 LoadLibCxxFormatters(g_category);
1995 LoadLibStdcppFormatters(g_category);
1996 LoadMsvcStlFormatters(g_category);
1997 LoadCommonStlFormatters(g_category);
1998 LoadSystemFormatters(g_category);
1999 }
2000 });
2001 return g_category;
2002}
2003
2006 static llvm::once_flag g_initialize;
2007 static ConstString g_vectortypes("VectorTypes");
2009
2010 llvm::call_once(g_initialize, []() -> void {
2011 g_formatters.push_back(
2014 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2018 "Function pointer summary provider"));
2019 if (CompilerType CT = valobj.GetCompilerType();
2020 CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
2022 return formatter_sp;
2023 }
2024 return nullptr;
2025 });
2026 g_formatters.push_back(
2029 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2032 .SetCascades(true)
2033 .SetDontShowChildren(true)
2034 .SetHideItemNames(true)
2035 .SetShowMembersOneLiner(true)
2036 .SetSkipPointers(true)
2037 .SetSkipReferences(false),
2039 "vector_type pointer summary provider"));
2040 if (valobj.GetCompilerType().IsVectorType()) {
2041 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2042 return formatter_sp;
2043 }
2044 return nullptr;
2045 });
2046 g_formatters.push_back(
2049 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2052 .SetCascades(true)
2053 .SetDontShowChildren(true)
2054 .SetHideItemNames(true)
2055 .SetShowMembersOneLiner(true)
2056 .SetSkipPointers(true)
2057 .SetSkipReferences(false),
2059 "block pointer summary provider"));
2060 if (valobj.GetCompilerType().IsBlockPointerType()) {
2061 return formatter_sp;
2062 }
2063 return nullptr;
2064 });
2065 });
2066
2067 return g_formatters;
2068}
2069
2072 static llvm::once_flag g_initialize;
2073 static ConstString g_vectortypes("VectorTypes");
2075
2076 llvm::call_once(g_initialize, []() -> void {
2077 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2080 static CXXSyntheticChildren::SharedPointer formatter_sp(
2083 .SetCascades(true)
2084 .SetSkipPointers(true)
2085 .SetSkipReferences(true)
2086 .SetNonCacheable(true),
2087 "vector_type synthetic children",
2089 if (valobj.GetCompilerType().IsVectorType()) {
2090 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2091 return formatter_sp;
2092 }
2093 return nullptr;
2094 });
2095 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2098 static CXXSyntheticChildren::SharedPointer formatter_sp(
2101 .SetCascades(true)
2102 .SetSkipPointers(true)
2103 .SetSkipReferences(true)
2104 .SetNonCacheable(true),
2105 "block pointer synthetic children",
2107 if (valobj.GetCompilerType().IsBlockPointerType()) {
2108 return formatter_sp;
2109 }
2110 return nullptr;
2111 });
2112 });
2113
2114 return g_formatters;
2115}
2116
2119 !valobj.IsPointerType())
2120 return false;
2121 bool canReadValue = true;
2122 bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
2123 return canReadValue && isZero;
2124}
2125
2126bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
2127 const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",
2128 ".h", ".hh", ".hpp", ".hxx", ".h++"};
2129 for (auto suffix : suffixes) {
2130 if (file_path.ends_with_insensitive(suffix))
2131 return true;
2132 }
2133
2134 // Check if we're in a STL path (where the files usually have no extension
2135 // that we could check for.
2136 return file_path.contains("/usr/include/c++/");
2137}
2138
2140 assert(sc.function);
2141
2142 if (sc.block)
2143 if (Block *inline_block = sc.block->GetContainingInlinedBlock())
2144 return inline_block->GetBlockVariableList(true);
2145
2146 return sc.function->GetBlock(true).GetBlockVariableList(true);
2147}
2148
2150 const ExecutionContext *exe_ctx,
2151 const SymbolContext &sc) {
2152 assert(sc.function);
2153
2154 ExecutionContextScope *exe_scope =
2155 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2156
2157 const char *cstr = sc.GetPossiblyInlinedFunctionName()
2159 .AsCString();
2160 if (!cstr)
2161 return false;
2162
2163 VariableList args;
2164 if (auto variable_list_sp = GetFunctionVariableList(sc))
2166 args);
2167
2168 if (args.GetSize() > 0)
2169 return PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args);
2170
2171 // FIXME: can we just unconditionally call PrettyPrintFunctionNameWithArgs?
2172 // It should be able to handle the "no arguments" case.
2173 s.PutCString(cstr);
2174
2175 return true;
2176}
2177
2179 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2180 FunctionNameRepresentation representation, Stream &s) {
2181 switch (representation) {
2183 // Print the function name with arguments in it
2184 if (sc.function)
2185 return PrintFunctionNameWithArgs(s, exe_ctx, sc);
2186
2187 if (!sc.symbol)
2188 return false;
2189
2190 const char *cstr = sc.symbol->GetName().AsCString(nullptr);
2191 if (!cstr)
2192 return false;
2193
2194 s.PutCString(cstr);
2195
2196 return true;
2197 }
2200 return false;
2201 }
2202}
2203
2205 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2207 switch (type) {
2209 auto scope_or_err = ::GetDemangledScope(sc);
2210 if (!scope_or_err) {
2212 GetLog(LLDBLog::Language), scope_or_err.takeError(),
2213 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2214 return false;
2215 }
2216
2217 s << *scope_or_err;
2218
2219 return true;
2220 }
2221
2223 auto name_or_err = ::GetDemangledBasename(sc);
2224 if (!name_or_err) {
2226 GetLog(LLDBLog::Language), name_or_err.takeError(),
2227 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2228 return false;
2229 }
2230
2231 s << *name_or_err;
2232
2233 return true;
2234 }
2235
2237 auto template_args_or_err = ::GetDemangledTemplateArguments(sc);
2238 if (!template_args_or_err) {
2240 template_args_or_err.takeError(),
2241 "Failed to handle ${{function.template-arguments}} "
2242 "frame-format variable: {0}");
2243 return false;
2244 }
2245
2246 s << *template_args_or_err;
2247
2248 return true;
2249 }
2250
2252 // This ensures we print the arguments even when no debug-info is available.
2253 //
2254 // FIXME: we should have a Entry::Type::FunctionArguments and
2255 // use it in the plugin.cplusplus.display.function-name-format
2256 // once we have a "fallback operator" in the frame-format language.
2257 if (!sc.function && sc.symbol)
2258 return PrintDemangledArgumentList(s, sc);
2259
2260 VariableList args;
2261 if (auto variable_list_sp = GetFunctionVariableList(sc))
2263 args);
2264
2265 ExecutionContextScope *exe_scope =
2266 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2267
2268 s << '(';
2270 s << ')';
2271
2272 return true;
2273 }
2275 auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc);
2276 if (!return_rhs_or_err) {
2277 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(),
2278 "Failed to handle ${{function.return-right}} frame-format "
2279 "variable: {0}");
2280 return false;
2281 }
2282
2283 s << *return_rhs_or_err;
2284
2285 return true;
2286 }
2288 auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc);
2289 if (!return_lhs_or_err) {
2290 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(),
2291 "Failed to handle ${{function.return-left}} frame-format "
2292 "variable: {0}");
2293 return false;
2294 }
2295
2296 s << *return_lhs_or_err;
2297
2298 return true;
2299 }
2301 auto quals_or_err = ::GetDemangledFunctionQualifiers(sc);
2302 if (!quals_or_err) {
2303 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(),
2304 "Failed to handle ${{function.qualifiers}} frame-format "
2305 "variable: {0}");
2306 return false;
2307 }
2308
2309 s << *quals_or_err;
2310
2311 return true;
2312 }
2314 auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
2315 if (!suffix_or_err) {
2317 GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2318 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2319 return false;
2320 }
2321
2322 s << *suffix_or_err;
2323
2324 return true;
2325 }
2326 default:
2327 return false;
2328 }
2329}
2330
2331namespace {
2332class NodeAllocator {
2333 llvm::BumpPtrAllocator Alloc;
2334
2335public:
2336 void reset() { Alloc.Reset(); }
2337
2338 template <typename T, typename... Args> T *makeNode(Args &&...args) {
2339 return new (Alloc.Allocate(sizeof(T), alignof(T)))
2340 T(std::forward<Args>(args)...);
2341 }
2342
2343 void *allocateNodeArray(size_t sz) {
2344 return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
2345 alignof(llvm::itanium_demangle::Node *));
2346 }
2347};
2348
2349template <typename Derived>
2350class ManglingSubstitutor
2351 : public llvm::itanium_demangle::AbstractManglingParser<Derived,
2352 NodeAllocator> {
2353 using Base =
2354 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2355
2356public:
2357 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2358
2359 template <typename... Ts>
2360 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2361 Ts &&...Vals) {
2362 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2363 return substituteImpl(Mangled);
2364 }
2365
2366protected:
2367 void reset(llvm::StringRef Mangled) {
2368 Base::reset(Mangled.begin(), Mangled.end());
2369 Written = Mangled.begin();
2370 Result.clear();
2371 Substituted = false;
2372 }
2373
2374 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2375 if (this->parse() == nullptr)
2376 return llvm::createStringError(
2377 llvm::formatv("Failed to substitute mangling in '{0}'", Mangled));
2378
2379 if (!Substituted)
2380 return ConstString();
2381
2382 // Append any trailing unmodified input.
2383 appendUnchangedInput();
2384 return ConstString(Result);
2385 }
2386
2387 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2388 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2389 return;
2390
2391 // We found a match. Append unmodified input up to this point.
2392 appendUnchangedInput();
2393
2394 // And then perform the replacement.
2395 Result += To;
2396 Written += From.size();
2397 Substituted = true;
2398 }
2399
2400private:
2401 /// Input character until which we have constructed the respective output
2402 /// already.
2403 const char *Written = "";
2404
2405 llvm::SmallString<128> Result;
2406
2407 /// Whether we have performed any substitutions.
2408 bool Substituted = false;
2409
2410 const char *currentParserPos() const { return this->First; }
2411
2412 void appendUnchangedInput() {
2413 Result +=
2414 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2415 Written = currentParserPos();
2416 }
2417};
2418
2419/// Given a mangled function `Mangled`, replace all the primitive function type
2420/// arguments of `Search` with type `Replace`.
2421class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
2422 llvm::StringRef Search;
2423 llvm::StringRef Replace;
2424
2425public:
2426 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2427 llvm::StringRef Replace) {
2428 ManglingSubstitutor::reset(Mangled);
2429 this->Search = Search;
2430 this->Replace = Replace;
2431 }
2432
2433 llvm::itanium_demangle::Node *parseType() {
2434 trySubstitute(Search, Replace);
2435 return ManglingSubstitutor::parseType();
2436 }
2437};
2438
2439class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
2440 llvm::StringRef Search;
2441 llvm::StringRef Replace;
2442
2443public:
2444 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2445 llvm::StringRef Replace) {
2446 ManglingSubstitutor::reset(Mangled);
2447 this->Search = Search;
2448 this->Replace = Replace;
2449 }
2450
2451 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2452
2453 llvm::itanium_demangle::Node *
2454 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
2455 if (!Search.empty() && !Replace.empty()) {
2456 trySubstitute(Search, Replace);
2457 } else {
2458 trySubstitute("D1", "D2");
2459 trySubstitute("C1", "C2");
2460 }
2461 return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
2462 }
2463};
2464} // namespace
2465
2466llvm::Expected<ConstString>
2468 llvm::StringRef subst_from,
2469 llvm::StringRef subst_to) {
2470 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2471}
2472
2474 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2475 llvm::StringRef subst_to) {
2476 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2477}
2478
2479llvm::Expected<ConstString>
2481 llvm::StringRef mangled_name) {
2482 return CtorDtorSubstitutor().substitute(mangled_name);
2483}
2484
2485#define LLDB_PROPERTIES_language_cplusplus
2486#include "LanguageCPlusPlusProperties.inc"
2487
2488enum {
2489#define LLDB_PROPERTIES_language_cplusplus
2490#include "LanguageCPlusPlusPropertiesEnum.inc"
2491};
2492
2493namespace {
2494class PluginProperties : public Properties {
2495public:
2496 static llvm::StringRef GetSettingName() { return "display"; }
2497
2498 PluginProperties() {
2499 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2500 m_collection_sp->Initialize(g_language_cplusplus_properties);
2501 }
2502
2503 FormatEntity::Entry GetFunctionNameFormat() const {
2504 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2505 ePropertyFunctionNameFormat, {});
2506 }
2507};
2508} // namespace
2509
2510static PluginProperties &GetGlobalPluginProperties() {
2511 static PluginProperties g_settings;
2512 return g_settings;
2513}
2514
2518
2521 debugger, PluginProperties::GetSettingName())) {
2523 debugger, GetGlobalPluginProperties().GetValueProperties(),
2524 "Properties for the CPlusPlus language plug-in.",
2525 /*is_global_property=*/true);
2526 }
2527}
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(const SymbolContext &sc)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericDequeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static bool IsTrivialBasename(const llvm::StringRef &basename)
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericTupleSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledBasename(const SymbolContext &sc)
static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericMapLikeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledTemplateArguments(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static lldb_private::SyntheticChildrenFrontEnd * GenericSmartPointerSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringViewSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(const SymbolContext &sc)
static bool ReverseFindMatchingChars(const llvm::StringRef &s, const llvm::StringRef &left_right_chars, size_t &left_pos, size_t &right_pos, size_t pos=llvm::StringRef::npos)
static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
Load formatters that are formatting types from more than one STL.
static SyntheticChildrenFrontEnd * GenericVectorSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static lldb_private::SyntheticChildrenFrontEnd * GenericUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool PrintFunctionNameWithArgs(Stream &s, const ExecutionContext *exe_ctx, const SymbolContext &sc)
static void PrettyPrintFunctionNameWithArgs(Stream &out_stream, char const *full_name, ExecutionContextScope *exe_scope, VariableList const &args)
Writes out the function name in 'full_name' to 'out_stream' but replaces each argument type with the ...
static VariableListSP GetFunctionVariableList(const SymbolContext &sc)
static PluginProperties & GetGlobalPluginProperties()
#define LLDB_LOG_ERROR(log, error,...)
Definition Log.h:392
bool lldb_private::formatters::MsvcStlStringSummaryProvider< StringElementType::ASCII >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:157
#define LLDB_PLUGIN_DEFINE(PluginName)
StringPrinter::StringElementType StringElementType
static bool IsMSVCUndecoratedName(llvm::StringRef name)
static bool ExtractContextAndIdentifier(llvm::StringRef name, llvm::StringRef &context, llvm::StringRef &identifier)
A command line argument class.
Definition Args.h:33
A class that describes a single lexical block.
Definition Block.h:41
lldb::VariableListSP GetBlockVariableList(bool can_create)
Get the variable list for this block only.
Definition Block.cpp:392
Block * GetContainingInlinedBlock()
Get the inlined block that contains this block.
Definition Block.cpp:206
llvm::StringRef GetBasenameNoTemplateParameters()
Returns the Basename of this method without a template parameter list, if any.
bool IsNilReference(ValueObject &valobj) override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledTemplateArguments(llvm::StringRef demangled, const DemangledNameInfo &info)
bool IsSourceFile(llvm::StringRef file_path) const override
ConstString GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override
lldb::TypeCategoryImplSP GetFormatters() override
static llvm::StringRef GetPluginNameStatic()
FormatEntity::Entry GetFunctionNameFormat() const override
bool SymbolNameFitsToLanguage(Mangled mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override
static llvm::StringRef GetDemangledBasename(llvm::StringRef demangled, const DemangledNameInfo &info)
llvm::StringRef GetPluginName() override
std::vector< ConstString > GenerateAlternateFunctionManglings(const ConstString mangled) const override
static llvm::Expected< ConstString > SubstituteType_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium type encoding substrings given by subst_from in mangled_name with subst_to.
bool GetFunctionDisplayName(const SymbolContext &sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream &s) override
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(llvm::StringRef demangled, const DemangledNameInfo &info)
std::pair< lldb::FunctionNameType, std::optional< ConstString > > GetFunctionNameInfo(ConstString name) const override
bool DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(llvm::StringRef demangled, const DemangledNameInfo &info)
ConstString FindBestAlternateFunctionMangledName(const Mangled mangled, const SymbolContext &sym_ctx) const override
static bool ExtractContextAndIdentifier(const char *name, llvm::StringRef &context, llvm::StringRef &identifier)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionArguments(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledScope(llvm::StringRef demangled, const DemangledNameInfo &info)
std::unique_ptr< TypeScavenger > GetTypeScavenger() override
static llvm::Expected< ConstString > SubstituteStructor_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium structor encoding substrings given by subst_from in mangled_name with subst_to.
HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override
static lldb_private::Language * CreateInstance(lldb::LanguageType language)
static llvm::Expected< ConstString > SubstituteStructorAliases_ItaniumMangle(llvm::StringRef mangled_name)
Tries replacing Itanium structor encoding substrings in mangled_name with potential aliases....
virtual std::unique_ptr< Language::MethodName > GetMethodName(ConstString name) const override
bool HandleFrameFormatVariable(const SymbolContext &sc, const ExecutionContext *exe_ctx, FormatEntity::Entry::Type type, Stream &s) override
static void DebuggerInitialize(Debugger &)
std::optional< ParsedFunction > ParseAsFunctionDefinition()
std::optional< ParsedName > ParseAsFullName()
Generic representation of a type in a programming language.
lldb::LanguageType GetMinimumLanguage()
bool IsBlockPointerType(CompilerType *function_pointer_type_ptr=nullptr) const
CompilerType GetTypedefedType() const
If the current object represents a typedef type, get the underlying type.
bool IsVectorType(CompilerType *element_type=nullptr, uint64_t *size=nullptr) const
A uniqued constant string class.
Definition ConstString.h:40
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
static bool GetCategory(ConstString category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
A class to manage flag bits.
Definition Debugger.h:80
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
lldb::TypeCategoryImplSP GetCategory(const char *category_name=nullptr, bool can_create=true)
Block & GetBlock(bool can_create)
Get accessor for the block list.
Definition Function.cpp:382
HardcodedFormatterFinders< SyntheticChildren > HardcodedSyntheticFinder
HardcodedFormatterFinders< TypeSummaryImpl > HardcodedSummaryFinder
llvm::StringRef GetQualifiers()
Definition Language.h:269
llvm::StringRef GetReturnType()
Definition Language.h:275
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:324
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:299
A class that handles mangled names.
Definition Mangled.h:34
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:39
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef const name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:43
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:284
ConstString & GetMangledName()
Mangled name get accessor.
Definition Mangled.h:152
const std::optional< DemangledNameInfo > & GetDemangledInfo() const
Retrieve DemangledNameInfo of the demangled name held by this object.
Definition Mangled.cpp:288
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:369
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static lldb::OptionValuePropertiesSP GetSettingForCPlusPlusLanguagePlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool CreateSettingForCPlusPlusLanguagePlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static bool UnregisterPlugin(ABICreateInstance create_callback)
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition Stream.cpp:65
size_t PutChar(char ch)
Definition Stream.cpp:131
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
Symbol * symbol
The Symbol for a given query.
Mangled GetPossiblyInlinedFunctionName() const
If available, will return the function name according to the specified mangling preference.
Provides public interface for all SymbolFiles.
Definition SymbolFile.h:51
virtual void GetMangledNamesForFunction(const std::string &scope_qualified_name, std::vector< ConstString > &mangled_names)
ConstString GetName() const
Definition Symbol.cpp:511
Flags & SetSkipReferences(bool value=true)
Flags & SetFrontEndWantsDereference(bool value=true)
Flags & SetSkipPointers(bool value=true)
Flags & SetCascades(bool value=true)
std::shared_ptr< SyntheticChildren > SharedPointer
Flags & SetCascades(bool value=true)
Definition TypeSummary.h:86
Flags & SetSkipPointers(bool value=true)
Definition TypeSummary.h:99
Flags & SetHideItemNames(bool value=true)
Flags & SetDontShowChildren(bool value=true)
Flags & SetSkipReferences(bool value=true)
Flags & SetShowMembersOneLiner(bool value=true)
Flags & SetDontShowValue(bool value=true)
std::shared_ptr< TypeSummaryImpl > SharedPointer
CompilerType GetCompilerType()
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
virtual lldb::ValueType GetValueType() const =0
lldb::LanguageType GetObjectRuntimeLanguage()
size_t AppendVariablesWithScope(lldb::ValueType type, VariableList &var_list, bool if_unique=true)
void PrettyPrintFunctionArguments(Stream &out_stream, VariableList const &args, ExecutionContextScope *exe_scope)
For each variable in 'args' this function writes the variable name and it's pretty-printed value repr...
SyntheticChildrenFrontEnd * LibCxxUnorderedMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibStdcppOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxStdSpanSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlDeque(ValueObject &valobj)
bool Char32StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdSliceArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxChronoSysSecondsSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:777
bool LibcxxChronoMonthSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:843
SyntheticChildrenFrontEnd * LibcxxUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
Definition LibCxx.cpp:376
bool IsMsvcStlUnordered(ValueObject &valobj)
bool LibcxxUniquePointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:237
SyntheticChildrenFrontEnd * LibStdcppUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlOptional(ValueObject &valobj)
bool WCharSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlStringType(ValueObject &valobj)
Definition MsvcStl.cpp:142
bool IsMsvcStlTuple(ValueObject &valobj)
bool LibcxxSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:191
bool LibcxxStringViewSummaryProviderASCII(ValueObject &valueObj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:680
bool LibcxxStringViewSummaryProviderUTF16(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:687
lldb_private::SyntheticChildrenFrontEnd * MsvcStlVectorSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibCxxVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
Definition LibCxx.cpp:269
bool VectorTypeSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &)
SyntheticChildrenFrontEnd * LibStdcppTupleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxStringViewSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:694
SyntheticChildrenFrontEnd * VectorTypeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxQueueFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
void AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp, CXXFunctionSummaryFormat::Callback funct, const char *description, llvm::StringRef type_name, TypeSummaryImpl::Flags flags, bool regex=false)
Add a summary that is implemented by a C++ callback.
SyntheticChildrenFrontEnd * MsvcStlListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoYearMonthDaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:885
bool LibStdcppUniquePointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:563
SyntheticChildrenFrontEnd * LibcxxTupleFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxStringSummaryProviderASCII(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:620
SyntheticChildrenFrontEnd * MsvcStlForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoLocalSecondsSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:783
SyntheticChildrenFrontEnd * StdlibCoroutineHandleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * MsvcStlTupleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:701
bool Char8SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxChronoWeekdaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:864
bool MsvcStlVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlMapLike(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxInitializerListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxStringSummaryProviderUTF16(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:627
bool Char16SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxStdSliceArraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxFunctionSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:143
bool MsvcStlSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxStringSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:634
lldb_private::SyntheticChildrenFrontEnd * MsvcStlMapLikeSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlUniquePtr(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxStdListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
void AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp, CXXSyntheticChildren::CreateFrontEndCallback generator, const char *description, llvm::StringRef type_name, ScriptedSyntheticChildren::Flags flags, bool regex=false)
Add a synthetic that is implemented by a C++ callback.
bool MsvcStlStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool LibcxxChronoLocalDaysSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:837
SyntheticChildrenFrontEnd * LibcxxStdValarraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * MsvcStlOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlVariantSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlTreeIterSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool Char8StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdMapSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibStdcppBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxVariantFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxStdProxyArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool StdlibCoroutineHandleSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Summary provider for std::coroutine_handle<T> from libc++, libstdc++ and MSVC STL.
SyntheticChildrenFrontEnd * MsvcStlDequeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:184
bool LibcxxVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * MsvcStlAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibCxxAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool ContainerSizeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool Char16StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * MsvcStlUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibcxxStdVectorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool WCharStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlList(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool GenericOptionalSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdUnorderedMapSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool BlockPointerSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &)
SyntheticChildrenFrontEnd * LibcxxStdForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
Definition LibCxx.cpp:359
SyntheticChildrenFrontEnd * LibCxxMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlSmartPointerSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoSysDaysSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:831
bool LibStdcppVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:148
bool Char32SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlUniquePtrSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlVariant(ValueObject &valobj)
bool CXXFunctionPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlTreeIterSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlSmartPointer(ValueObject &valobj)
bool MsvcStlAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:332
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeObjC_plus_plus
Objective-C++.
@ eFormatterMatchExact
@ eFormatterMatchRegex
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVariableArgument
function argument variables
std::shared_ptr< CXXFunctionSummaryFormat > SharedPointer
Stores information about where certain portions of a demangled function name begin and end.
bool hasSuffix() const
Returns true if this object holds a valid suffix range.
bool hasBasename() const
Returns true if this object holds a valid basename range.
std::pair< size_t, size_t > TemplateArgumentsRange
A [start, end) pair for the function template arguments.
std::pair< size_t, size_t > ArgumentsRange
Indicates the [start, end) of the function argument list.
std::pair< size_t, size_t > SuffixRange
Indicates the [start, end) of the function's suffix.
std::pair< size_t, size_t > BasenameRange
A [start, end) pair for the function basename.
bool hasTemplateArguments() const
Returns true if this object holds a valid template arguments range.
bool hasScope() const
Returns true if this object holds a valid scope range.
bool hasQualifiers() const
Returns true if this object holds a valid qualifiers range.
bool hasArguments() const
Returns true if this object holds a valid arguments range.
std::pair< size_t, size_t > ScopeRange
A [start, end) pair for the function scope qualifiers.
std::pair< size_t, size_t > QualifiersRange
Indicates the [start, end) of the function qualifiers (e.g., CV-qualifiers, reference qualifiers,...