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#include "llvm/Support/ErrorExtras.h"
22
24#include "lldb/Core/Mangled.h"
25#include "lldb/Core/Module.h"
38#include "lldb/Utility/Log.h"
41
42#include "BlockPointer.h"
43#include "CPlusPlusNameParser.h"
44#include "Coroutines.h"
45#include "CxxStringTypes.h"
46#include "Generic.h"
47#include "LibCxx.h"
48#include "LibCxxAtomic.h"
49#include "LibCxxVariant.h"
50#include "LibStdcpp.h"
52#include "MsvcStl.h"
54
55using namespace lldb;
56using namespace lldb_private;
57using namespace lldb_private::formatters;
58
60
65
69
70std::unique_ptr<Language::MethodName>
71CPlusPlusLanguage::GetMethodName(llvm::StringRef full_name) const {
72 std::unique_ptr<CxxMethodName> cpp_method =
73 std::make_unique<CxxMethodName>(full_name.str());
74 cpp_method->IsValid();
75 return cpp_method;
76}
77
78std::pair<FunctionNameType, std::optional<ConstString>>
81 return {eFunctionNameTypeFull, std::nullopt};
82
83 FunctionNameType func_name_type = eFunctionNameTypeNone;
84 CxxMethodName method(name.GetStringRef().str());
85 llvm::StringRef basename = method.GetBasename();
86 if (basename.empty()) {
87 llvm::StringRef context;
88 func_name_type |=
89 (ExtractContextAndIdentifier(name.GetStringRef(), context, basename)
90 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
91 : eFunctionNameTypeFull);
92 } else {
93 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
94 }
95
96 if (!method.GetQualifiers().empty()) {
97 // There is a 'const' or other qualifier following the end of the function
98 // parens, this can't be a eFunctionNameTypeBase.
99 func_name_type &= ~(eFunctionNameTypeBase);
100 }
101
102 if (basename.empty())
103 return {func_name_type, std::nullopt};
104 else
105 return {func_name_type, ConstString(basename)};
106}
107
109 auto mangling_scheme =
111 return mangling_scheme == Mangled::eManglingSchemeItanium ||
112 mangling_scheme == Mangled::eManglingSchemeMSVC;
113}
114
116 Mangled mangled) const {
117 const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
118 ConstString demangled_name = mangled.GetDemangledName();
119 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
120 if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
121 (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
122 // typeinfo structure, and typeinfo
123 // mangled_name
124 mangled_name_cstr[2] != 'G' && // avoid guard variables
125 mangled_name_cstr[2] != 'Z')) // named local entities (if we
126 // eventually handle eSymbolTypeData,
127 // we will want this back)
128 {
129 CxxMethodName cxx_method(demangled_name.GetStringRef().str());
130 if (!cxx_method.GetBasename().empty()) {
131 std::string shortname;
132 if (!cxx_method.GetContext().empty())
133 shortname = cxx_method.GetContext().str() + "::";
134 shortname += cxx_method.GetBasename().str();
135 return ConstString(shortname);
136 }
137 }
138 }
139 if (demangled_name)
140 return demangled_name;
141 return mangled.GetMangledName();
142}
143
144// Static Functions
145
147 // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
148 if (Language::LanguageIsCPlusPlus(language) &&
149 language != eLanguageTypeObjC_plus_plus)
150 return new CPlusPlusLanguage();
151 return nullptr;
152}
153
154static bool ReverseFindMatchingChars(const llvm::StringRef &s,
155 const llvm::StringRef &left_right_chars,
156 size_t &left_pos, size_t &right_pos,
157 size_t pos = llvm::StringRef::npos) {
158 assert(left_right_chars.size() == 2);
159 left_pos = llvm::StringRef::npos;
160 const char left_char = left_right_chars[0];
161 const char right_char = left_right_chars[1];
162 pos = s.find_last_of(left_right_chars, pos);
163 if (pos == llvm::StringRef::npos || s[pos] == left_char)
164 return false;
165 right_pos = pos;
166 uint32_t depth = 1;
167 while (pos > 0 && depth > 0) {
168 pos = s.find_last_of(left_right_chars, pos);
169 if (pos == llvm::StringRef::npos)
170 return false;
171 if (s[pos] == left_char) {
172 if (--depth == 0) {
173 left_pos = pos;
174 return left_pos < right_pos;
175 }
176 } else if (s[pos] == right_char) {
177 ++depth;
178 }
179 }
180 return false;
181}
182
183static bool IsTrivialBasename(const llvm::StringRef &basename) {
184 // Check that the basename matches with the following regular expression
185 // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
186 // because it is significantly more efficient then using the general purpose
187 // regular expression library.
188 size_t idx = 0;
189 if (basename.starts_with('~'))
190 idx = 1;
191
192 if (basename.size() <= idx)
193 return false; // Empty string or "~"
194
195 if (!std::isalpha(static_cast<unsigned char>(basename[idx])) &&
196 basename[idx] != '_')
197 return false; // First character (after removing the possible '~'') isn't in
198 // [A-Za-z_]
199
200 // Read all characters matching [A-Za-z_0-9]
201 ++idx;
202 while (idx < basename.size()) {
203 if (!std::isalnum(static_cast<unsigned char>(basename[idx])) &&
204 basename[idx] != '_')
205 break;
206 ++idx;
207 }
208
209 // We processed all characters. It is a vaild basename.
210 return idx == basename.size();
211}
212
213/// A context is trivial if an only if it matches this pattern.
214/// "^\s*([A-Za-z_:]*)\s*$". for example function `foo::bar::func()`
215/// has a trivial context but. but `foo<int>::bar::func()` doesn't.
216static bool IsTrivialContext(llvm::StringRef context) {
217 // remove trailing or leading whitespace.
218 context = context.trim();
219
220 const auto iter = context.find_if_not([](char current) {
221 return std::isalnum(static_cast<unsigned char>(current)) ||
222 current == '_' || current == ':';
223 });
224 return iter == llvm::StringRef::npos;
225}
226
227/// Writes out the function name in 'full_name' to 'out_stream'
228/// but replaces each argument type with the variable name
229/// and the corresponding pretty-printed value
231 llvm::StringRef full_name,
232 ExecutionContextScope *exe_scope,
233 VariableList const &args) {
234 CPlusPlusLanguage::CxxMethodName cpp_method{full_name.str()};
235
236 if (!cpp_method.IsValid())
237 return false;
238
239 llvm::StringRef return_type = cpp_method.GetReturnType();
240 if (!return_type.empty()) {
241 out_stream.PutCString(return_type);
242 out_stream.PutChar(' ');
243 }
244
245 out_stream.PutCString(cpp_method.GetScopeQualifiedName());
246 out_stream.PutChar('(');
247
248 FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
249
250 out_stream.PutChar(')');
251
252 llvm::StringRef qualifiers = cpp_method.GetQualifiers();
253 if (!qualifiers.empty()) {
254 out_stream.PutChar(' ');
255 out_stream.PutCString(qualifiers);
256 }
257
258 return true;
259}
260
262 static DemangledNameInfoCache g_cache;
263 // Pick up any changes to the size the user made since the last call.
265 .GetDemangledNameInfoCacheSize());
266 return g_cache;
267}
268
269static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
272 if (!mangled)
273 return llvm::createStringError("function does not have a mangled name");
274
275 auto demangled_name = mangled.GetDemangledName().GetStringRef();
276 if (demangled_name.empty())
277 return llvm::createStringErrorV(
278 "function '{0}' does not have a demangled name",
279 mangled.GetMangledName());
280
281 std::optional<DemangledNameInfo> info = GetDemangledInfoCache().Get(mangled);
282 if (!info)
283 return llvm::createStringErrorV(
284 "function '{0}' does not have demangled info", demangled_name);
285
286 // Function without a basename is nonsense.
287 if (!info->hasBasename())
288 return llvm::createStringErrorV(
289 "demangled info for '{0}' does not have a basename range",
290 demangled_name);
291
292 return std::make_pair(demangled_name, *info);
293}
294
295static llvm::Expected<llvm::StringRef>
297 auto info_or_err = GetAndValidateInfo(sc);
298 if (!info_or_err)
299 return info_or_err.takeError();
300
301 auto [demangled_name, info] = *info_or_err;
302
303 return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info);
304}
305
306llvm::StringRef
308 const DemangledNameInfo &info) {
309 assert(info.hasBasename());
310 return demangled.slice(info.BasenameRange.first, info.BasenameRange.second);
311}
312
313llvm::Expected<llvm::StringRef>
315 llvm::StringRef demangled, const DemangledNameInfo &info) {
316 if (!info.hasTemplateArguments())
317 return llvm::createStringErrorV(
318 "template arguments range for '{0}' is invalid", demangled);
319
320 return demangled.slice(info.TemplateArgumentsRange.first,
321 info.TemplateArgumentsRange.second);
322}
323
324static llvm::Expected<llvm::StringRef>
326 auto info_or_err = GetAndValidateInfo(sc);
327 if (!info_or_err)
328 return info_or_err.takeError();
329
330 auto [demangled_name, info] = *info_or_err;
331
332 return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info);
333}
334
335llvm::Expected<llvm::StringRef>
337 const DemangledNameInfo &info) {
338 if (info.ScopeRange.first >= demangled.size())
339 return llvm::createStringErrorV(
340 "scope range for '{0}' LHS return type is invalid", demangled);
341
342 return demangled.substr(0, info.ScopeRange.first);
343}
344
345static llvm::Expected<llvm::StringRef>
347 auto info_or_err = GetAndValidateInfo(sc);
348 if (!info_or_err)
349 return info_or_err.takeError();
350
351 auto [demangled_name, info] = *info_or_err;
352
353 return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info);
354}
355
356llvm::Expected<llvm::StringRef>
358 llvm::StringRef demangled, const DemangledNameInfo &info) {
359 if (!info.hasQualifiers())
360 return llvm::createStringErrorV("qualifiers range for '{0}' is invalid",
361 demangled);
362
363 return demangled.slice(info.QualifiersRange.first,
364 info.QualifiersRange.second);
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
376 info);
377}
378
379llvm::Expected<llvm::StringRef>
381 const DemangledNameInfo &info) {
382 if (info.QualifiersRange.first < info.ArgumentsRange.second)
383 return llvm::createStringErrorV(
384 "qualifiers range for '{0}' RHS return type is invalid", demangled);
385
386 return demangled.slice(info.ArgumentsRange.second,
387 info.QualifiersRange.first);
388}
389
390static llvm::Expected<llvm::StringRef>
392 auto info_or_err = GetAndValidateInfo(sc);
393 if (!info_or_err)
394 return info_or_err.takeError();
395
396 auto [demangled_name, info] = *info_or_err;
397
398 return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info);
399}
400
401llvm::Expected<llvm::StringRef>
402CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled,
403 const DemangledNameInfo &info) {
404 if (!info.hasScope())
405 return llvm::createStringErrorV("scope range for '{0}' is invalid",
406 demangled);
407
408 return demangled.slice(info.ScopeRange.first, info.ScopeRange.second);
409}
410
411static llvm::Expected<llvm::StringRef>
413 auto info_or_err = GetAndValidateInfo(sc);
414 if (!info_or_err)
415 return info_or_err.takeError();
416
417 auto [demangled_name, info] = *info_or_err;
418
419 return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
420}
421
422llvm::Expected<llvm::StringRef>
424 const DemangledNameInfo &info) {
425 if (!info.hasSuffix())
426 return llvm::createStringErrorV("suffix range for '{0}' is invalid",
427 demangled);
428
429 return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
430}
431
432static llvm::Expected<llvm::StringRef>
434 auto info_or_err = GetAndValidateInfo(sc);
435 if (!info_or_err)
436 return info_or_err.takeError();
437
438 auto [demangled_name, info] = *info_or_err;
439
440 return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
441}
442
443llvm::Expected<llvm::StringRef>
445 llvm::StringRef demangled, const DemangledNameInfo &info) {
446 if (!info.hasArguments())
447 return llvm::createStringErrorV(
448 "function arguments range for '{0}' is invalid", demangled);
449
450 return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second);
451}
452
454 assert(sc.symbol);
455
456 auto info_or_err = GetAndValidateInfo(sc);
457 if (!info_or_err) {
458 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(),
459 "Failed to handle ${{function.formatted-arguments}} "
460 "frame-format variable: {0}");
461 return false;
462 }
463
464 auto [demangled_name, info] = *info_or_err;
465
466 auto args_or_err =
468 if (!args_or_err) {
469 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(),
470 "Failed to handle ${{function.formatted-arguments}} "
471 "frame-format variable: {0}");
472 return false;
473 }
474
475 s << *args_or_err;
476
477 return true;
478}
479
481 // This method tries to parse simple method definitions which are presumably
482 // most comman in user programs. Definitions that can be parsed by this
483 // function don't have return types and templates in the name.
484 // A::B::C::fun(std::vector<T> &) const
485 size_t arg_start, arg_end;
486 llvm::StringRef full(m_full);
487 llvm::StringRef parens("()", 2);
488 if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
489 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
490 if (arg_end + 1 < full.size())
491 m_qualifiers = full.substr(arg_end + 1).ltrim();
492
493 if (arg_start == 0)
494 return false;
495 size_t basename_end = arg_start;
496 size_t context_start = 0;
497 size_t context_end = full.rfind(':', basename_end);
498 if (context_end == llvm::StringRef::npos)
499 m_basename = full.substr(0, basename_end);
500 else {
501 if (context_start < context_end)
502 m_context = full.substr(context_start, context_end - 1 - context_start);
503 const size_t basename_begin = context_end + 1;
504 m_basename = full.substr(basename_begin, basename_end - basename_begin);
505 }
506
508 return true;
509 }
510 // The C++ basename doesn't match our regular expressions so this can't
511 // be a valid C++ method, clear everything out and indicate an error
512 m_context = llvm::StringRef();
513 m_basename = llvm::StringRef();
514 m_arguments = llvm::StringRef();
515 m_qualifiers = llvm::StringRef();
516 m_return_type = llvm::StringRef();
517 return false;
518 }
519 return false;
520}
521
523 if (!m_parsed && !m_full.empty()) {
524 if (TrySimplifiedParse()) {
525 m_parse_error = false;
526 } else {
528 if (auto function = parser.ParseAsFunctionDefinition()) {
529 m_basename = function->name.basename;
530 m_context = function->name.context;
531 m_arguments = function->arguments;
532 m_qualifiers = function->qualifiers;
533 m_return_type = function->return_type;
534 m_parse_error = false;
535 } else {
536 m_parse_error = true;
537 }
538 }
539 if (m_context.empty()) {
540 m_scope_qualified = std::string(m_basename);
541 } else {
543 m_scope_qualified += "::";
545 }
546 m_parsed = true;
547 }
548}
549
550llvm::StringRef
552 llvm::StringRef basename = GetBasename();
553 size_t arg_start, arg_end;
554 llvm::StringRef parens("<>", 2);
555 if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
556 return basename.substr(0, arg_start);
557
558 return basename;
559}
560
562 if (!m_parsed)
563 Parse();
564
565 // If we can't parse the incoming name, then just check that it contains path.
566 if (m_parse_error)
567 return llvm::StringRef(m_full).contains(path);
568
569 llvm::StringRef identifier;
570 llvm::StringRef context;
571 const bool success =
572 CPlusPlusLanguage::ExtractContextAndIdentifier(path, context, identifier);
573 if (!success)
574 return llvm::StringRef(m_full).contains(path);
575
576 // Basename may include template arguments.
577 // E.g.,
578 // GetBaseName(): func<int>
579 // identifier : func
580 //
581 // ...but we still want to account for identifiers with template parameter
582 // lists, e.g., when users set breakpoints on template specializations.
583 //
584 // E.g.,
585 // GetBaseName(): func<uint32_t>
586 // identifier : func<int32_t*>
587 //
588 // Try to match the basename with or without template parameters.
589 if (GetBasename() != identifier &&
590 GetBasenameNoTemplateParameters() != identifier)
591 return false;
592
593 // Incoming path only had an identifier, so we match.
594 if (context.empty())
595 return true;
596 // Incoming path has context but this method does not, no match.
597 if (m_context.empty())
598 return false;
599
600 llvm::StringRef haystack = m_context;
601 if (!haystack.consume_back(context))
602 return false;
603 if (haystack.empty() || !isalnum(haystack.back()))
604 return true;
605
606 return false;
607}
608
610 ConstString demangled) const {
611 CxxMethodName demangled_name(demangled.GetStringRef().str());
612 return demangled_name.ContainsPath(path);
613}
614
616 llvm::StringRef name, llvm::StringRef &context,
617 llvm::StringRef &identifier) {
620 identifier);
621
622 CPlusPlusNameParser parser(name);
623 if (auto full_name = parser.ParseAsFullName()) {
624 identifier = full_name->basename;
625 context = full_name->context;
626 return true;
627 }
628 return false;
629}
630
632 const ConstString mangled_name) const {
633 std::vector<ConstString> alternates;
634
635 /// Get a basic set of alternative manglings for the given symbol `name`, by
636 /// making a few basic possible substitutions on basic types, storage duration
637 /// and `const`ness for the given symbol. The output parameter `alternates`
638 /// is filled with a best-guess, non-exhaustive set of different manglings
639 /// for the given name.
640
641 // Maybe we're looking for a const symbol but the debug info told us it was
642 // non-const...
643 if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
644 strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
645 std::string fixed_scratch("_ZNK");
646 fixed_scratch.append(mangled_name.GetCString() + 3);
647 alternates.push_back(ConstString(fixed_scratch));
648 }
649
650 // Maybe we're looking for a static symbol but we thought it was global...
651 if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
652 strncmp(mangled_name.GetCString(), "_ZL", 3)) {
653 std::string fixed_scratch("_ZL");
654 fixed_scratch.append(mangled_name.GetCString() + 2);
655 alternates.push_back(ConstString(fixed_scratch));
656 }
657
658 auto *log = GetLog(LLDBLog::Language);
659
660 // `char` is implementation defined as either `signed` or `unsigned`. As a
661 // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
662 // char, 'h'-unsigned char. If we're looking for symbols with a signed char
663 // parameter, try finding matches which have the general case 'c'.
664 if (auto char_fixup_or_err =
665 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "a", "c")) {
666 // LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
667 if (*char_fixup_or_err)
668 alternates.push_back(*char_fixup_or_err);
669 } else
670 LLDB_LOG_ERROR(log, char_fixup_or_err.takeError(),
671 "Failed to substitute 'char' type mangling: {0}");
672
673 // long long parameter mangling 'x', may actually just be a long 'l' argument
674 if (auto long_fixup_or_err =
675 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "x", "l")) {
676 if (*long_fixup_or_err)
677 alternates.push_back(*long_fixup_or_err);
678 } else
679 LLDB_LOG_ERROR(log, long_fixup_or_err.takeError(),
680 "Failed to substitute 'long long' type mangling: {0}");
681
682 // unsigned long long parameter mangling 'y', may actually just be unsigned
683 // long 'm' argument
684 if (auto ulong_fixup_or_err =
685 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "y", "m")) {
686 if (*ulong_fixup_or_err)
687 alternates.push_back(*ulong_fixup_or_err);
688 } else
690 log, ulong_fixup_or_err.takeError(),
691 "Failed to substitute 'unsigned long long' type mangling: {0}");
692
693 if (auto ctor_fixup_or_err = SubstituteStructorAliases_ItaniumMangle(
694 mangled_name.GetStringRef())) {
695 if (*ctor_fixup_or_err) {
696 alternates.push_back(*ctor_fixup_or_err);
697 }
698 } else
699 LLDB_LOG_ERROR(log, ctor_fixup_or_err.takeError(),
700 "Failed to substitute structor alias manglings: {0}");
701
702 return alternates;
703}
704
706 const Mangled mangled, const SymbolContext &sym_ctx) const {
707 ConstString demangled = mangled.GetDemangledName();
708 if (!demangled)
709 return ConstString();
710
711 CxxMethodName cpp_name(demangled.GetStringRef().str());
712 std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
713
714 if (!scope_qualified_name.size())
715 return ConstString();
716
717 if (!sym_ctx.module_sp)
718 return ConstString();
719
720 lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
721 if (!sym_file)
722 return ConstString();
723
724 std::vector<ConstString> alternates;
725 sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
726
727 std::vector<ConstString> param_and_qual_matches;
728 std::vector<ConstString> param_matches;
729 for (size_t i = 0; i < alternates.size(); i++) {
730 ConstString alternate_mangled_name = alternates[i];
731 Mangled mangled(alternate_mangled_name);
732 ConstString demangled = mangled.GetDemangledName();
733
734 CxxMethodName alternate_cpp_name(demangled.GetStringRef().str());
735 if (!cpp_name.IsValid())
736 continue;
737
738 if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
739 if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
740 param_and_qual_matches.push_back(alternate_mangled_name);
741 else
742 param_matches.push_back(alternate_mangled_name);
743 }
744 }
745
746 if (param_and_qual_matches.size())
747 return param_and_qual_matches[0]; // It is assumed that there will be only
748 // one!
749 else if (param_matches.size())
750 return param_matches[0]; // Return one of them as a best match
751 else
752 return ConstString();
753}
754
755static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
756 if (!cpp_category_sp)
757 return;
758
759 TypeSummaryImpl::Flags stl_summary_flags;
760 stl_summary_flags.SetCascades(true)
761 .SetSkipPointers(false)
762 .SetSkipReferences(false)
764 .SetDontShowValue(false)
766 .SetHideItemNames(false);
767
768 AddCXXSummary(cpp_category_sp,
770 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
771 stl_summary_flags, true);
772 AddCXXSummary(cpp_category_sp,
774 "std::string summary provider",
775 "^std::__[[:alnum:]]+::basic_string<char, "
776 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
777 stl_summary_flags, true);
778 AddCXXSummary(cpp_category_sp,
780 "std::string summary provider",
781 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
782 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
783 stl_summary_flags, true);
784
785 AddCXXSummary(cpp_category_sp,
787 "std::u16string summary provider",
788 "^std::__[[:alnum:]]+::basic_string<char16_t, "
789 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
790 stl_summary_flags, true);
791
792 AddCXXSummary(cpp_category_sp,
794 "std::u32string summary provider",
795 "^std::__[[:alnum:]]+::basic_string<char32_t, "
796 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
797 stl_summary_flags, true);
798
799 AddCXXSummary(cpp_category_sp,
801 "std::wstring summary provider",
802 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
803 AddCXXSummary(cpp_category_sp,
805 "std::wstring summary provider",
806 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
807 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
808 stl_summary_flags, true);
809
810 AddCXXSummary(cpp_category_sp,
812 "std::string_view summary provider",
813 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
814 AddCXXSummary(cpp_category_sp,
816 "std::string_view summary provider",
817 "^std::__[[:alnum:]]+::basic_string_view<char, "
818 "std::__[[:alnum:]]+::char_traits<char> >$",
819 stl_summary_flags, true);
820 AddCXXSummary(cpp_category_sp,
822 "std::string_view summary provider",
823 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
824 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
825 stl_summary_flags, true);
826
827 AddCXXSummary(cpp_category_sp,
829 "std::u16string_view summary provider",
830 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
831 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
832 stl_summary_flags, true);
833
834 AddCXXSummary(cpp_category_sp,
836 "std::u32string_view summary provider",
837 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
838 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
839 stl_summary_flags, true);
840
841 AddCXXSummary(cpp_category_sp,
843 "std::wstring_view summary provider",
844 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
845 AddCXXSummary(cpp_category_sp,
847 "std::wstring_view summary provider",
848 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
849 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
850 stl_summary_flags, true);
851
852 SyntheticChildren::Flags stl_synth_flags;
853 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
854 false);
855 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
856 stl_deref_flags.SetFrontEndWantsDereference();
857
859 cpp_category_sp,
861 "libc++ std::bitset synthetic children",
862 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
864 cpp_category_sp,
866 "libc++ std::vector synthetic children",
867 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
869 cpp_category_sp,
871 "libc++ std::valarray synthetic children",
872 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
874 cpp_category_sp,
876 "libc++ std::slice_array synthetic children",
877 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
879 cpp_category_sp,
881 "libc++ synthetic children for the valarray proxy arrays",
882 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
883 stl_deref_flags, true);
885 cpp_category_sp,
887 "libc++ std::forward_list synthetic children",
888 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
890 cpp_category_sp,
892 "libc++ std::list synthetic children", "^std::__[[:alnum:]]+::list<.+>$",
893 stl_deref_flags, true);
895 cpp_category_sp,
897 "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
898 stl_synth_flags, true);
900 cpp_category_sp,
902 "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
903 stl_deref_flags, true);
905 cpp_category_sp,
907 "libc++ std::multiset synthetic children",
908 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
910 cpp_category_sp,
912 "libc++ std::multimap synthetic children",
913 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
915 cpp_category_sp,
917 "libc++ std::unordered containers synthetic children",
918 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
919 stl_synth_flags, true);
921 "libc++ std::queue synthetic children",
922 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
924 "libc++ std::tuple synthetic children",
925 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
927 "libc++ std::optional synthetic children",
928 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
930 "libc++ std::variant synthetic children",
931 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
933 cpp_category_sp,
935 "libc++ std::atomic synthetic children",
936 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
938 cpp_category_sp,
940 "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
941 stl_deref_flags, true);
943 cpp_category_sp,
945 "libc++ std::ranges::ref_view synthetic children",
946 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
947
948 cpp_category_sp->AddTypeSynthetic(
949 "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
951 stl_synth_flags,
952 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
953
955 cpp_category_sp,
957 "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
958 stl_synth_flags, true);
959
960 static constexpr const char *const libcxx_std_unique_ptr_regex =
961 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
963 cpp_category_sp,
965 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
966 stl_synth_flags, true);
967
969 cpp_category_sp,
971 "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
972 stl_synth_flags, true);
973 AddCXXSummary(cpp_category_sp,
975 "libc++ std::function summary provider",
976 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
977
978 static constexpr const char *const libcxx_std_coroutine_handle_regex =
979 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
981 cpp_category_sp,
983 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
984 stl_deref_flags, true);
985
986 stl_summary_flags.SetDontShowChildren(false);
987 stl_summary_flags.SetSkipPointers(false);
988 AddCXXSummary(cpp_category_sp,
990 "libc++ std::bitset summary provider",
991 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
992 AddCXXSummary(cpp_category_sp,
994 "libc++ std::vector summary provider",
995 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
996 AddCXXSummary(cpp_category_sp,
998 "libc++ std::valarray summary provider",
999 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
1000 AddCXXSummary(cpp_category_sp,
1002 "libc++ std::slice_array summary provider",
1003 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
1004 true);
1005 AddCXXSummary(cpp_category_sp,
1007 "libc++ summary provider for the valarray proxy arrays",
1008 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1009 stl_summary_flags, true);
1012 "libc++ std::list summary provider",
1013 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
1014 AddCXXSummary(cpp_category_sp,
1016 "libc++ std::list summary provider",
1017 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags, true);
1018 AddCXXSummary(cpp_category_sp,
1020 "libc++ std::map summary provider",
1021 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
1022 AddCXXSummary(cpp_category_sp,
1024 "libc++ std::deque summary provider",
1025 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
1026 AddCXXSummary(cpp_category_sp,
1028 "libc++ std::queue summary provider",
1029 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
1030 AddCXXSummary(cpp_category_sp,
1032 "libc++ std::set summary provider",
1033 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
1034 AddCXXSummary(cpp_category_sp,
1036 "libc++ std::multiset summary provider",
1037 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
1038 AddCXXSummary(cpp_category_sp,
1040 "libc++ std::multimap summary provider",
1041 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
1042 AddCXXSummary(cpp_category_sp,
1044 "libc++ std::unordered containers summary provider",
1045 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1046 stl_summary_flags, true);
1048 "libc++ std::tuple summary provider",
1049 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
1050 AddCXXSummary(cpp_category_sp,
1052 "libc++ std::atomic summary provider",
1053 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
1054 AddCXXSummary(cpp_category_sp,
1056 "libc++ std::optional summary provider",
1057 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
1058 AddCXXSummary(cpp_category_sp,
1060 "libc++ std::variant summary provider",
1061 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
1062 AddCXXSummary(cpp_category_sp,
1064 "libc++ std::span summary provider",
1065 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
1066
1067 stl_summary_flags.SetSkipPointers(true);
1068
1069 AddCXXSummary(cpp_category_sp,
1071 "libc++ std::shared_ptr summary provider",
1072 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1073 true);
1074 AddCXXSummary(cpp_category_sp,
1076 "libc++ std::weak_ptr summary provider",
1077 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
1078 AddCXXSummary(cpp_category_sp,
1080 "libc++ std::unique_ptr summary provider",
1081 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
1082
1083 AddCXXSummary(cpp_category_sp,
1085 "libc++ std::coroutine_handle summary provider",
1086 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
1087
1089 cpp_category_sp,
1091 "std::vector iterator synthetic children",
1092 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
1093
1095 cpp_category_sp,
1097 "std::map iterator synthetic children",
1098 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1099 true);
1100
1101 AddCXXSynthetic(cpp_category_sp,
1104 "std::unordered_map iterator synthetic children",
1105 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1106 stl_synth_flags, true);
1107 // Chrono duration typedefs
1108 cpp_category_sp->AddTypeSummary(
1109 "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
1111 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
1112 cpp_category_sp->AddTypeSummary(
1113 "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
1115 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
1116 cpp_category_sp->AddTypeSummary(
1117 "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
1119 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
1120 cpp_category_sp->AddTypeSummary(
1121 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1123 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1124 cpp_category_sp->AddTypeSummary(
1125 "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
1126 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1127 eTypeOptionHideValue,
1128 "${var.__rep_} min")));
1129 cpp_category_sp->AddTypeSummary(
1130 "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
1132 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
1133
1134 cpp_category_sp->AddTypeSummary(
1135 "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
1136 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1137 eTypeOptionHideValue,
1138 "${var.__rep_} days")));
1139 cpp_category_sp->AddTypeSummary(
1140 "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
1141 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1142 eTypeOptionHideValue,
1143 "${var.__rep_} weeks")));
1144 cpp_category_sp->AddTypeSummary(
1145 "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
1146 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1147 eTypeOptionHideValue,
1148 "${var.__rep_} months")));
1149 cpp_category_sp->AddTypeSummary(
1150 "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
1151 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1152 eTypeOptionHideValue,
1153 "${var.__rep_} years")));
1154 cpp_category_sp->AddTypeSummary(
1155 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1157 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1158
1159 // Chrono time point types
1160
1161 AddCXXSummary(cpp_category_sp,
1163 "libc++ std::chrono::sys_seconds summary provider",
1164 "^std::__[[:alnum:]]+::chrono::time_point<"
1165 "std::__[[:alnum:]]+::chrono::system_clock, "
1166 "std::__[[:alnum:]]+::chrono::duration<.*, "
1167 "std::__[[:alnum:]]+::ratio<1, 1> "
1168 "> >$",
1169 eTypeOptionHideChildren | eTypeOptionHideValue |
1170 eTypeOptionCascade,
1171 true);
1172 AddCXXSummary(cpp_category_sp,
1174 "libc++ std::chrono::sys_seconds summary provider",
1175 "^std::__[[:alnum:]]+::chrono::time_point<"
1176 "std::__[[:alnum:]]+::chrono::system_clock, "
1177 "std::__[[:alnum:]]+::chrono::duration<int, "
1178 "std::__[[:alnum:]]+::ratio<86400, 1> "
1179 "> >$",
1180 eTypeOptionHideChildren | eTypeOptionHideValue |
1181 eTypeOptionCascade,
1182 true);
1183
1185 cpp_category_sp,
1187 "libc++ std::chrono::local_seconds summary provider",
1188 "^std::__[[:alnum:]]+::chrono::time_point<"
1189 "std::__[[:alnum:]]+::chrono::local_t, "
1190 "std::__[[:alnum:]]+::chrono::duration<.*, "
1191 "std::__[[:alnum:]]+::ratio<1, 1> "
1192 "> >$",
1193 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1194 true);
1195 AddCXXSummary(cpp_category_sp,
1197 "libc++ std::chrono::local_seconds summary provider",
1198 "^std::__[[:alnum:]]+::chrono::time_point<"
1199 "std::__[[:alnum:]]+::chrono::local_t, "
1200 "std::__[[:alnum:]]+::chrono::duration<int, "
1201 "std::__[[:alnum:]]+::ratio<86400, 1> "
1202 "> >$",
1203 eTypeOptionHideChildren | eTypeOptionHideValue |
1204 eTypeOptionCascade,
1205 true);
1206
1207 // Chrono calendar types
1208
1209 cpp_category_sp->AddTypeSummary(
1210 "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1211 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1212 eTypeOptionHideValue,
1213 "day=${var.__d_%u}")));
1214
1215 AddCXXSummary(cpp_category_sp,
1217 "libc++ std::chrono::month summary provider",
1218 "^std::__[[:alnum:]]+::chrono::month$",
1219 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1220
1221 cpp_category_sp->AddTypeSummary(
1222 "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1224 eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1225
1226 AddCXXSummary(cpp_category_sp,
1228 "libc++ std::chrono::weekday summary provider",
1229 "^std::__[[:alnum:]]+::chrono::weekday$",
1230 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1231
1232 cpp_category_sp->AddTypeSummary(
1233 "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
1235 eTypeOptionHideChildren | eTypeOptionHideValue,
1236 "${var.__wd_} index=${var.__idx_%u}")));
1237
1238 cpp_category_sp->AddTypeSummary(
1239 "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
1240 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1241 eTypeOptionHideValue,
1242 "${var.__wd_} index=last")));
1243 cpp_category_sp->AddTypeSummary(
1244 "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1245 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1246 eTypeOptionHideValue,
1247 "${var.__m_} ${var.__d_}")));
1248 cpp_category_sp->AddTypeSummary(
1249 "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1250 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1251 eTypeOptionHideValue,
1252 "${var.__m_} day=last")));
1253
1254 cpp_category_sp->AddTypeSummary(
1255 "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
1256 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1257 eTypeOptionHideValue,
1258 "${var.__m_} ${var.__wdi_}")));
1259
1260 cpp_category_sp->AddTypeSummary(
1261 "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
1262 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1263 eTypeOptionHideValue,
1264 "${var.__m_} ${var.__wdl_}")));
1265
1266 cpp_category_sp->AddTypeSummary(
1267 "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
1268 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1269 eTypeOptionHideValue,
1270 "${var.__y_} ${var.__m_}")));
1271
1273 cpp_category_sp,
1275 "libc++ std::chrono::year_month_day summary provider",
1276 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1277 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1278
1279 cpp_category_sp->AddTypeSummary(
1280 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1282 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1283 eTypeOptionHideValue,
1284 "${var.__y_} ${var.__mdl_}")));
1285
1286 cpp_category_sp->AddTypeSummary(
1287 "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
1289 eTypeOptionHideChildren | eTypeOptionHideValue,
1290 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1291
1292 cpp_category_sp->AddTypeSummary(
1293 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1296 eTypeOptionHideChildren | eTypeOptionHideValue,
1297 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1298
1299 AddCXXSummary(cpp_category_sp,
1301 "libc++ std::partial_ordering summary provider",
1302 "^std::__[[:alnum:]]+::partial_ordering$",
1303 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1304 AddCXXSummary(cpp_category_sp,
1306 "libc++ std::weak_ordering summary provider",
1307 "^std::__[[:alnum:]]+::weak_ordering$",
1308 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1309 AddCXXSummary(cpp_category_sp,
1311 "libc++ std::strong_ordering summary provider",
1312 "^std::__[[:alnum:]]+::strong_ordering$",
1313 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1314
1315 AddCXXSummary(cpp_category_sp,
1317 "libc++ std::source_location summary provider",
1318 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1319 true);
1320}
1321
1323 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1324 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1325 auto makeSpecifier = [](llvm::StringRef name) {
1326 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1327 name, eFormatterMatchExact);
1328 };
1329
1330 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1331
1332 category_sp->AddTypeSummary(
1333 makeSpecifier(llvm::formatv("std::basic_string<{}>", char_ty).str()),
1334 summary_sp);
1335
1336 category_sp->AddTypeSummary(
1337 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1338 llvm::formatv("^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1339 char_ty)
1340 .str(),
1342 summary_sp);
1343}
1344
1346 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1347 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1348 // std::string_view
1349 category_sp->AddTypeSummary(
1350 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1351 string_ty, eFormatterMatchExact),
1352 summary_sp);
1353
1354 // std::basic_string_view<char, std::char_traits<char>>
1355 // NativePDB has spaces at different positions compared to PDB and DWARF, so
1356 // use a regex and make them optional.
1357 category_sp->AddTypeSummary(
1358 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1359 llvm::formatv(
1360 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1361 char_ty)
1362 .str(),
1364 summary_sp);
1365}
1366
1368 if (!cpp_category_sp)
1369 return;
1370
1371 TypeSummaryImpl::Flags stl_summary_flags;
1372 stl_summary_flags.SetCascades(true)
1373 .SetSkipPointers(false)
1374 .SetSkipReferences(false)
1375 .SetDontShowChildren(true)
1376 .SetDontShowValue(false)
1378 .SetHideItemNames(false);
1379
1381 stl_summary_flags, LibStdcppStringSummaryProvider,
1382 "libstdc++ std::(w)string summary provider"));
1383 cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1384 string_summary_sp);
1385 cpp_category_sp->AddTypeSummary(
1386 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1387 eFormatterMatchRegex, string_summary_sp);
1388 cpp_category_sp->AddTypeSummary("^std::__cxx11::basic_string<unsigned char, "
1389 "std::char_traits<unsigned char>,.*>$",
1390 eFormatterMatchRegex, string_summary_sp);
1391
1392 cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1393 string_summary_sp);
1394 cpp_category_sp->AddTypeSummary(
1395 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1396 eFormatterMatchRegex, string_summary_sp);
1397
1398 SyntheticChildren::Flags stl_synth_flags;
1399 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1400 false);
1401 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1402 stl_deref_flags.SetFrontEndWantsDereference();
1403
1404 cpp_category_sp->AddTypeSynthetic(
1405 "^std::__debug::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1407 stl_synth_flags,
1408 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1409 cpp_category_sp->AddTypeSynthetic(
1410 "^std::__debug::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1412 stl_synth_flags,
1413 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1414 cpp_category_sp->AddTypeSynthetic(
1415 "^std::__debug::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1417 stl_deref_flags,
1418 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1419 cpp_category_sp->AddTypeSynthetic(
1420 "^std::__debug::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1422 stl_deref_flags,
1423 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1424 cpp_category_sp->AddTypeSynthetic(
1425 "^std::__debug::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1427 stl_deref_flags,
1428 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1429 cpp_category_sp->AddTypeSynthetic(
1430 "^std::__debug::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1432 stl_deref_flags,
1433 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1434 cpp_category_sp->AddTypeSynthetic(
1435 "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1437 stl_deref_flags,
1438 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1439 cpp_category_sp->AddTypeSynthetic(
1440 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", eFormatterMatchRegex,
1442 stl_deref_flags,
1443 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1444 cpp_category_sp->AddTypeSynthetic(
1445 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1447 stl_synth_flags,
1448 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1449
1450 stl_summary_flags.SetDontShowChildren(false);
1451 stl_summary_flags.SetSkipPointers(false);
1452
1453 AddCXXSummary(cpp_category_sp,
1455 "libstdc++ std::bitset summary provider",
1456 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
1457
1458 AddCXXSummary(cpp_category_sp,
1460 "libstdc++ std::__debug::vector summary provider",
1461 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags, true);
1462
1463 AddCXXSummary(cpp_category_sp,
1465 "libstdc++ debug std::map summary provider",
1466 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags, true);
1467
1468 AddCXXSummary(cpp_category_sp,
1470 "libstdc++ debug std::set summary provider",
1471 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags, true);
1472
1474 "libstdc++ debug std::deque summary provider",
1475 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags, true);
1476
1479 "libstdc++ debug std::multimap summary provider",
1480 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags, true);
1481
1484 "libstdc++ debug std::multiset summary provider",
1485 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags, true);
1486
1487 AddCXXSummary(cpp_category_sp,
1489 "libstdc++ debug std unordered container summary provider",
1490 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1491 stl_summary_flags, true);
1492
1495 "libstdc++ debug std::list summary provider",
1496 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags, true);
1497
1498 cpp_category_sp->AddTypeSummary(
1499 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1501 stl_summary_flags,
1502 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1503
1505 cpp_category_sp,
1507 "std::vector iterator synthetic children",
1508 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1509
1511 cpp_category_sp,
1513 "std::map iterator synthetic children",
1514 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags, true);
1515
1517 cpp_category_sp,
1519 "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1520 stl_synth_flags, true);
1521
1522 static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1523 "^std::coroutine_handle<.+>(( )?&)?$";
1525 cpp_category_sp,
1527 "std::coroutine_handle synthetic children",
1528 libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1529
1531 cpp_category_sp,
1533 "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
1534 stl_deref_flags, true);
1535
1536 AddCXXSummary(cpp_category_sp,
1538 "libstdc++ std::coroutine_handle summary provider",
1539 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1540
1542 cpp_category_sp,
1544 "libstdc++ std::source_location summary provider", "std::source_location",
1545 stl_summary_flags);
1546}
1547
1548static lldb_private::SyntheticChildrenFrontEnd *
1550 lldb::ValueObjectSP valobj_sp) {
1551 if (!valobj_sp)
1552 return nullptr;
1553
1554 if (IsMsvcStlSmartPointer(*valobj_sp))
1556 return LibStdcppSharedPtrSyntheticFrontEndCreator(children, valobj_sp);
1557}
1558
1559static bool
1561 const TypeSummaryOptions &options) {
1562 if (IsMsvcStlSmartPointer(valobj))
1563 return MsvcStlSmartPointerSummaryProvider(valobj, stream, options);
1564 return LibStdcppSmartPointerSummaryProvider(valobj, stream, options);
1565}
1566
1567static lldb_private::SyntheticChildrenFrontEnd *
1569 lldb::ValueObjectSP valobj_sp) {
1570 if (!valobj_sp)
1571 return nullptr;
1572
1573 if (IsMsvcStlUniquePtr(*valobj_sp))
1575 return LibStdcppUniquePtrSyntheticFrontEndCreator(children, valobj_sp);
1576}
1577
1579 const TypeSummaryOptions &options) {
1580 if (IsMsvcStlUniquePtr(valobj))
1581 return MsvcStlUniquePtrSummaryProvider(valobj, stream, options);
1582 return LibStdcppUniquePointerSummaryProvider(valobj, stream, options);
1583}
1584
1585static SyntheticChildrenFrontEnd *
1587 lldb::ValueObjectSP valobj_sp) {
1588 if (!valobj_sp)
1589 return nullptr;
1590
1591 if (IsMsvcStlTuple(*valobj_sp))
1592 return MsvcStlTupleSyntheticFrontEndCreator(children, valobj_sp);
1593 return LibStdcppTupleSyntheticFrontEndCreator(children, valobj_sp);
1594}
1595
1596static SyntheticChildrenFrontEnd *
1598 lldb::ValueObjectSP valobj_sp) {
1599 if (!valobj_sp)
1600 return nullptr;
1601
1602 // checks for vector<T> and vector<bool>
1603 if (auto *msvc = MsvcStlVectorSyntheticFrontEndCreator(valobj_sp))
1604 return msvc;
1605
1607 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1608}
1609
1610static SyntheticChildrenFrontEnd *
1612 lldb::ValueObjectSP valobj_sp) {
1613 if (!valobj_sp)
1614 return nullptr;
1615
1616 if (IsMsvcStlList(*valobj_sp))
1617 return MsvcStlListSyntheticFrontEndCreator(children, valobj_sp);
1619 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1620}
1621
1622static SyntheticChildrenFrontEnd *
1624 lldb::ValueObjectSP valobj_sp) {
1625 if (!valobj_sp)
1626 return nullptr;
1627
1628 if (IsMsvcStlList(*valobj_sp))
1629 return MsvcStlForwardListSyntheticFrontEndCreator(children, valobj_sp);
1631 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1632 *valobj_sp);
1633}
1634
1635static SyntheticChildrenFrontEnd *
1637 lldb::ValueObjectSP valobj_sp) {
1638 if (!valobj_sp)
1639 return nullptr;
1640
1641 if (IsMsvcStlOptional(*valobj_sp))
1642 return MsvcStlOptionalSyntheticFrontEndCreator(children, valobj_sp);
1643 return LibStdcppOptionalSyntheticFrontEndCreator(children, valobj_sp);
1644}
1645
1646static SyntheticChildrenFrontEnd *
1648 lldb::ValueObjectSP valobj_sp) {
1649 if (!valobj_sp)
1650 return nullptr;
1651
1652 if (IsMsvcStlVariant(*valobj_sp))
1653 return MsvcStlVariantSyntheticFrontEndCreator(children, valobj_sp);
1655 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1656}
1657
1659 const TypeSummaryOptions &options) {
1660 if (IsMsvcStlVariant(valobj))
1661 return MsvcStlVariantSummaryProvider(valobj, stream, options);
1662 return LibStdcppVariantSummaryProvider(valobj, stream, options);
1663}
1664
1665static SyntheticChildrenFrontEnd *
1667 ValueObjectSP valobj_sp) {
1668 if (!valobj_sp)
1669 return nullptr;
1670
1671 if (IsMsvcStlUnordered(*valobj_sp))
1672 return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
1674 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1675 *valobj_sp);
1676}
1677
1678static SyntheticChildrenFrontEnd *
1680 ValueObjectSP valobj_sp) {
1681 if (!valobj_sp)
1682 return nullptr;
1683
1684 if (IsMsvcStlMapLike(*valobj_sp))
1687 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1688}
1689
1690static SyntheticChildrenFrontEnd *
1692 ValueObjectSP valobj_sp) {
1693 if (!valobj_sp)
1694 return nullptr;
1695
1696 if (IsMsvcStlDeque(*valobj_sp))
1697 return MsvcStlDequeSyntheticFrontEndCreator(children, valobj_sp);
1699 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1700}
1701
1702static SyntheticChildrenFrontEnd *
1704 ValueObjectSP valobj_sp) {
1705 if (!valobj_sp)
1706 return nullptr;
1707
1708 if (IsMsvcStlSpan(*valobj_sp))
1709 return MsvcStlSpanSyntheticFrontEndCreator(children, valobj_sp);
1710 return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
1711}
1712
1713static bool
1715 const TypeSummaryOptions &options) {
1716 if (IsMsvcStlOrdering(valobj))
1717 return MsvcStlPartialOrderingSummaryProvider(valobj, stream, options);
1718 return LibStdcppPartialOrderingSummaryProvider(valobj, stream, options);
1719}
1720
1721static bool
1723 const TypeSummaryOptions &options) {
1724 if (IsMsvcStlOrdering(valobj))
1725 return MsvcStlWeakOrderingSummaryProvider(valobj, stream, options);
1726 return LibStdcppWeakOrderingSummaryProvider(valobj, stream, options);
1727}
1728
1729static bool
1731 const TypeSummaryOptions &options) {
1732 if (IsMsvcStlOrdering(valobj))
1733 return MsvcStlStrongOrderingSummaryProvider(valobj, stream, options);
1734 return LibStdcppStrongOrderingSummaryProvider(valobj, stream, options);
1735}
1736
1737static SyntheticChildrenFrontEnd *
1739 ValueObjectSP valobj_sp) {
1740 if (!valobj_sp)
1741 return nullptr;
1742
1743 if (IsMsvcStlBitset(*valobj_sp))
1744 return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
1745 return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
1746}
1747
1748static SyntheticChildrenFrontEnd *
1750 lldb::ValueObjectSP valobj_sp) {
1751 if (!valobj_sp)
1752 return nullptr;
1753 if (IsMsvcStlExpected(*valobj_sp))
1754 return MsvcStlExpectedSyntheticFrontEndCreator(children, valobj_sp);
1755 return nullptr;
1756}
1757
1759 const TypeSummaryOptions &options) {
1760 if (IsMsvcStlExpected(valobj))
1761 return MsvcStlExpectedSummaryProvider(valobj, stream, options);
1762 return false;
1763}
1764
1765static SyntheticChildrenFrontEnd *
1767 lldb::ValueObjectSP valobj_sp) {
1768 if (!valobj_sp)
1769 return nullptr;
1770 if (IsMsvcStlValarray(*valobj_sp))
1771 return MsvcStlValarraySyntheticFrontEndCreator(children, valobj_sp);
1772 return nullptr;
1773}
1774
1776 const TypeSummaryOptions &options) {
1777 if (!IsMsvcStlValarray(valobj))
1778 return false;
1779 return ContainerSizeSummaryProvider(valobj, stream, options);
1780}
1781
1782static bool
1784 const TypeSummaryOptions &options) {
1785 if (IsMsvcStlSourceLocation(valobj))
1786 return MsvcStlSourceLocationSummaryProvider(valobj, stream, options);
1787 return LibStdcppSourceLocationSummaryProvider(valobj, stream, options);
1788}
1789
1790/// Load formatters that are formatting types from more than one STL
1792 if (!cpp_category_sp)
1793 return;
1794
1795 TypeSummaryImpl::Flags stl_summary_flags;
1796 stl_summary_flags.SetCascades(true)
1797 .SetSkipPointers(false)
1798 .SetSkipReferences(false)
1799 .SetDontShowChildren(true)
1800 .SetDontShowValue(false)
1802 .SetHideItemNames(false);
1803 SyntheticChildren::Flags stl_synth_flags;
1804 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1805 false);
1806
1808
1810 cpp_category_sp, "std::string", "char",
1811 std::make_shared<CXXFunctionSummaryFormat>(
1812 stl_summary_flags,
1813 [](ValueObject &valobj, Stream &stream,
1814 const TypeSummaryOptions &options) {
1815 if (IsMsvcStlStringType(valobj))
1817 valobj, stream, options);
1818 return LibStdcppStringSummaryProvider(valobj, stream, options);
1819 },
1820 "MSVC STL/libstdc++ std::string summary provider"));
1822 cpp_category_sp, "std::wstring", "wchar_t",
1823 std::make_shared<CXXFunctionSummaryFormat>(
1824 stl_summary_flags,
1825 [](ValueObject &valobj, Stream &stream,
1826 const TypeSummaryOptions &options) {
1827 if (IsMsvcStlStringType(valobj))
1828 return MsvcStlWStringSummaryProvider(valobj, stream, options);
1829 return LibStdcppStringSummaryProvider(valobj, stream, options);
1830 },
1831 "MSVC STL/libstdc++ std::wstring summary provider"));
1832
1834 cpp_category_sp, "std::string_view", "char",
1835 std::make_shared<CXXFunctionSummaryFormat>(
1836 stl_summary_flags,
1837 [](ValueObject &valobj, Stream &stream,
1838 const TypeSummaryOptions &options) {
1839 if (IsMsvcStlStringViewType(valobj))
1841 valobj, stream, options);
1843 valobj, stream, options);
1844 },
1845 "MSVC STL/libstdc++ std::string_view summary provider"));
1847 cpp_category_sp, "std::u8string_view", "char8_t",
1848 std::make_shared<CXXFunctionSummaryFormat>(
1849 stl_summary_flags,
1850 [](ValueObject &valobj, Stream &stream,
1851 const TypeSummaryOptions &options) {
1852 if (IsMsvcStlStringViewType(valobj))
1854 valobj, stream, options);
1856 valobj, stream, options);
1857 },
1858 "MSVC STL/libstdc++ std::u8string_view summary provider"));
1860 cpp_category_sp, "std::u16string_view", "char16_t",
1861 std::make_shared<CXXFunctionSummaryFormat>(
1862 stl_summary_flags,
1863 [](ValueObject &valobj, Stream &stream,
1864 const TypeSummaryOptions &options) {
1865 if (IsMsvcStlStringViewType(valobj))
1867 valobj, stream, options);
1869 valobj, stream, options);
1870 },
1871 "MSVC STL/libstdc++ std::u16string_view summary provider"));
1873 cpp_category_sp, "std::u32string_view", "char32_t",
1874 std::make_shared<CXXFunctionSummaryFormat>(
1875 stl_summary_flags,
1876 [](ValueObject &valobj, Stream &stream,
1877 const TypeSummaryOptions &options) {
1878 if (IsMsvcStlStringViewType(valobj))
1880 valobj, stream, options);
1882 valobj, stream, options);
1883 },
1884 "MSVC STL/libstdc++ std::u32string_view summary provider"));
1886 cpp_category_sp, "std::wstring_view", "wchar_t",
1887 std::make_shared<CXXFunctionSummaryFormat>(
1888 stl_summary_flags,
1889 [](ValueObject &valobj, Stream &stream,
1890 const TypeSummaryOptions &options) {
1891 if (IsMsvcStlStringViewType(valobj))
1892 return MsvcStlWStringViewSummaryProvider(valobj, stream, options);
1893 return LibStdcppWStringViewSummaryProvider(valobj, stream, options);
1894 },
1895 "MSVC STL/libstdc++ std::wstring_view summary provider"));
1896
1897 // NOTE: it is loaded as a common formatter because the libc++ version is not
1898 // in the `__1` namespace, hence we need to dispatch based on the class
1899 // layout.
1900 AddCXXSynthetic(cpp_category_sp,
1902 "std::initializer_list synthetic children",
1903 "^std::initializer_list<.+>$", stl_synth_flags, true);
1904
1906 "MSVC STL/libstdc++ std::filesystem::path summary provider",
1907 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags, true);
1908
1910 "MSVC STL/libstdc++ std::source_location summary provider",
1911 "std::source_location", stl_summary_flags);
1912
1913 stl_summary_flags.SetDontShowChildren(false);
1914 stl_summary_flags.SetSkipPointers(false);
1915
1917 "std::shared_ptr synthetic children",
1918 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1920 "std::weak_ptr synthetic children",
1921 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1923 "std::unique_ptr synthetic children",
1924 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1926 "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$",
1927 stl_synth_flags, true);
1929 "std::list synthetic children", "^std::list<.+>(( )?&)?$",
1930 stl_synth_flags, true);
1932 "std::forward_list synthetic children",
1933 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
1935 "std::variant synthetic children", "^std::variant<.*>$",
1936 stl_synth_flags, true);
1938 "std::unordered container synthetic children",
1939 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
1940 true);
1941
1942 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1943 stl_deref_flags.SetFrontEndWantsDereference();
1945 "std::optional synthetic children",
1946 "^std::optional<.+>(( )?&)?$", stl_deref_flags, true);
1948 "std::deque container synthetic children",
1949 "^std::deque<.+>(( )?&)?$", stl_deref_flags, true);
1951 "std::span container synthetic children", "^std::span<.+>$",
1952 stl_deref_flags, true);
1953
1955 "std::(multi)?map/set synthetic children",
1956 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
1957 true);
1959 "std::bitset synthetic children", "^std::bitset<.+>(( )?&)?$",
1960 stl_deref_flags, true);
1961
1963 "std::initializer_list summary provider",
1964 "^std::initializer_list<.+>$", stl_summary_flags, true);
1966 "MSVC STL/libstdc++ std::shared_ptr summary provider",
1967 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1969 "MSVC STL/libstdc++ std::weak_ptr summary provider",
1970 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1972 "MSVC STL/libstdc++ std::unique_ptr summary provider",
1973 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1975 "MSVC STL/libstdc++ std::tuple summary provider",
1976 "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true);
1978 "MSVC/libstdc++ std::vector summary provider",
1979 "^std::vector<.+>(( )?&)?$", stl_summary_flags, true);
1981 "MSVC/libstdc++ std::vector synthetic provider",
1982 "^std::vector<.+>(( )?&)?$", stl_synth_flags, true);
1984 "MSVC STL/libstdc++ std::list summary provider",
1985 "^std::list<.+>(( )?&)?$", stl_summary_flags, true);
1986 cpp_category_sp->AddTypeSummary(
1987 "^std::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1989 stl_summary_flags,
1990 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1992 "MSVC STL/libstd++ std::optional summary provider",
1993 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
1995 "MSVC STL/libstdc++ std::variant summary provider",
1996 "^std::variant<.*>$", stl_summary_flags, true);
1998 "MSVC STL/libstdc++ std unordered container summary provider",
1999 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
2000 true);
2002 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
2003 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
2004 true);
2006 "MSVC STL/libstd++ std::deque summary provider",
2007 "^std::deque<.+>(( )?&)?$", stl_summary_flags, true);
2009 "MSVC STL/libstd++ std::span summary provider",
2010 "^std::span<.+>$", stl_summary_flags, true);
2012 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2013 "std::partial_ordering",
2014 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2016 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2017 "std::weak_ordering",
2018 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2020 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2021 "std::strong_ordering",
2022 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2023
2024 // Container adaptors expose the underlying container as the standard
2025 // protected member `c` ([queue.defn], [stack.defn], [priqueue.overview]).
2027 "std::queue synthetic children", "^std::queue<.+>(( )?&)?$",
2028 stl_synth_flags, true);
2030 "std::stack synthetic children", "^std::stack<.+>(( )?&)?$",
2031 stl_synth_flags, true);
2033 "std::priority_queue synthetic children",
2034 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags, true);
2036 "std::queue summary provider", "^std::queue<.+>(( )?&)?$",
2037 stl_summary_flags, true);
2039 "std::stack summary provider", "^std::stack<.+>(( )?&)?$",
2040 stl_summary_flags, true);
2042 "std::priority_queue summary provider",
2043 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags, true);
2044
2046 "MSVC STL/libstdc++ std::error_code summary provider",
2047 "std::error_code", stl_summary_flags);
2049 "MSVC STL/libstdc++ std::error_condition summary provider",
2050 "std::error_condition", stl_summary_flags);
2052 "MSVC STL/libstdc++ std::error_code/error_condition "
2053 "synthetic children",
2054 "^std::error_(code|condition)$", stl_synth_flags, true);
2056 "MSVC STL/libstdc++ std::bitset summary provider",
2057 "^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
2058
2060 "MSVC STL std::expected synthetic children",
2061 "^std::expected<.+>(( )?&)?$", stl_deref_flags, true);
2063 "MSVC STL std::expected summary provider",
2064 "^std::expected<.+>(( )?&)?$", stl_summary_flags, true);
2065
2067 "MSVC STL std::valarray synthetic children",
2068 "^std::valarray<.+>(( )?&)?$", stl_deref_flags, true);
2070 "MSVC STL std::valarray summary provider",
2071 "^std::valarray<.+>(( )?&)?$", stl_summary_flags, true);
2072}
2073
2075 if (!cpp_category_sp)
2076 return;
2077
2078 TypeSummaryImpl::Flags stl_summary_flags;
2079 stl_summary_flags.SetCascades(true)
2080 .SetSkipPointers(false)
2081 .SetSkipReferences(false)
2082 .SetDontShowChildren(true)
2083 .SetDontShowValue(false)
2085 .SetHideItemNames(false);
2086 SyntheticChildren::Flags stl_synth_flags;
2087 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
2088 false);
2089
2091
2093 cpp_category_sp, "std::u8string", "char8_t",
2094 std::make_shared<CXXFunctionSummaryFormat>(
2095 stl_summary_flags,
2097 "MSVC STL std::u8string summary provider"));
2099 cpp_category_sp, "std::u16string", "char16_t",
2100 std::make_shared<CXXFunctionSummaryFormat>(
2101 stl_summary_flags,
2103 "MSVC STL std::u16string summary provider"));
2105 cpp_category_sp, "std::u32string", "char32_t",
2106 std::make_shared<CXXFunctionSummaryFormat>(
2107 stl_summary_flags,
2109 "MSVC STL std::u32string summary provider"));
2110
2111 stl_summary_flags.SetDontShowChildren(false);
2112
2114 "MSVC STL std::atomic synthetic children",
2115 "^std::atomic<.+>$", stl_synth_flags, true);
2116
2118 "MSVC STL std::atomic summary provider", "^std::atomic<.+>$",
2119 stl_summary_flags, true);
2121 "MSVC STL tree iterator synthetic children",
2122 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2123 true);
2125 "MSVC STL tree iterator summary",
2126 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2127 true);
2130 "MSVC STL vector iterator synthetic children",
2131 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags, true);
2132}
2133
2135 if (!cpp_category_sp)
2136 return;
2137
2138 TypeSummaryImpl::Flags string_flags;
2139 string_flags.SetCascades(true)
2140 .SetSkipPointers(true)
2141 .SetSkipReferences(false)
2142 .SetDontShowChildren(true)
2143 .SetDontShowValue(false)
2145 .SetHideItemNames(false);
2146
2147 TypeSummaryImpl::Flags string_array_flags;
2148 string_array_flags.SetCascades(true)
2149 .SetSkipPointers(true)
2150 .SetSkipReferences(false)
2151 .SetDontShowChildren(true)
2152 .SetDontShowValue(true)
2154 .SetHideItemNames(false);
2155
2156 AddCXXSummary(cpp_category_sp,
2158 "char8_t * summary provider", "char8_t *", string_flags);
2159 AddCXXSummary(cpp_category_sp,
2161 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
2162 string_array_flags, true);
2163
2164 AddCXXSummary(cpp_category_sp,
2166 "char16_t * summary provider", "char16_t *", string_flags);
2167 AddCXXSummary(cpp_category_sp,
2169 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
2170 string_array_flags, true);
2171
2172 AddCXXSummary(cpp_category_sp,
2174 "char32_t * summary provider", "char32_t *", string_flags);
2175 AddCXXSummary(cpp_category_sp,
2177 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
2178 string_array_flags, true);
2179
2180 AddCXXSummary(cpp_category_sp,
2182 "wchar_t * summary provider", "wchar_t *", string_flags);
2183 AddCXXSummary(cpp_category_sp,
2185 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
2186 string_array_flags, true);
2187
2188 AddCXXSummary(cpp_category_sp,
2190 "unichar * summary provider", "unichar *", string_flags);
2191
2192 TypeSummaryImpl::Flags widechar_flags;
2193 widechar_flags.SetDontShowValue(true)
2194 .SetSkipPointers(true)
2195 .SetSkipReferences(false)
2196 .SetCascades(true)
2197 .SetDontShowChildren(true)
2198 .SetHideItemNames(true)
2199 .SetShowMembersOneLiner(false);
2200
2202 "char8_t summary provider", "char8_t", widechar_flags);
2203 AddCXXSummary(cpp_category_sp,
2205 "char16_t summary provider", "char16_t", widechar_flags);
2206 AddCXXSummary(cpp_category_sp,
2208 "char32_t summary provider", "char32_t", widechar_flags);
2210 "wchar_t summary provider", "wchar_t", widechar_flags);
2211
2212 AddCXXSummary(cpp_category_sp,
2214 "unichar summary provider", "unichar", widechar_flags);
2215}
2216
2217std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
2218 class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
2219 public:
2220 CompilerType AdjustForInclusion(CompilerType &candidate) override {
2221 LanguageType lang_type(candidate.GetMinimumLanguage());
2222 if (!Language::LanguageIsC(lang_type) &&
2224 return CompilerType();
2225 if (candidate.IsTypedefType())
2226 return candidate.GetTypedefedType();
2227 return candidate;
2228 }
2229 };
2230
2231 return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
2232}
2233
2235 static llvm::once_flag g_initialize;
2236 static TypeCategoryImplSP g_category;
2237
2238 llvm::call_once(g_initialize, [this]() -> void {
2240 g_category);
2241 if (g_category) {
2242 // NOTE: the libstdcpp formatters are loaded after libcxx formatters
2243 // because we don't want to the libcxx formatters to match the potential
2244 // `__debug` inline namespace that libstdcpp may use.
2245 // LLDB prioritizes the last loaded matching formatter.
2246 LoadLibCxxFormatters(g_category);
2247 LoadLibStdcppFormatters(g_category);
2248 LoadMsvcStlFormatters(g_category);
2249 LoadCommonStlFormatters(g_category);
2250 LoadSystemFormatters(g_category);
2251 }
2252 });
2253 return g_category;
2254}
2255
2258 static llvm::once_flag g_initialize;
2259 static ConstString g_vectortypes("VectorTypes");
2261
2262 llvm::call_once(g_initialize, []() -> void {
2263 g_formatters.push_back(
2266 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2270 "Function pointer summary provider"));
2271 if (CompilerType CT = valobj.GetCompilerType();
2272 CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
2274 return formatter_sp;
2275 }
2276 return nullptr;
2277 });
2278 g_formatters.push_back(
2281 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2284 .SetCascades(true)
2285 .SetDontShowChildren(true)
2286 .SetHideItemNames(true)
2287 .SetShowMembersOneLiner(true)
2288 .SetSkipPointers(true)
2289 .SetSkipReferences(false),
2291 "vector_type pointer summary provider"));
2292 if (valobj.GetCompilerType().IsVectorType()) {
2293 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2294 return formatter_sp;
2295 }
2296 return nullptr;
2297 });
2298 g_formatters.push_back(
2301 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2304 .SetCascades(true)
2305 .SetDontShowChildren(true)
2306 .SetHideItemNames(true)
2307 .SetShowMembersOneLiner(true)
2308 .SetSkipPointers(true)
2309 .SetSkipReferences(false),
2311 "block pointer summary provider"));
2312 if (valobj.GetCompilerType().IsBlockPointerType()) {
2313 return formatter_sp;
2314 }
2315 return nullptr;
2316 });
2317 });
2318
2319 return g_formatters;
2320}
2321
2324 static llvm::once_flag g_initialize;
2325 static ConstString g_vectortypes("VectorTypes");
2327
2328 llvm::call_once(g_initialize, []() -> void {
2329 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2332 static CXXSyntheticChildren::SharedPointer formatter_sp(
2335 .SetCascades(true)
2336 .SetSkipPointers(true)
2337 .SetSkipReferences(true)
2338 .SetNonCacheable(true),
2339 "vector_type synthetic children",
2341 if (valobj.GetCompilerType().IsVectorType()) {
2342 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2343 return formatter_sp;
2344 }
2345 return nullptr;
2346 });
2347 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2350 static CXXSyntheticChildren::SharedPointer formatter_sp(
2353 .SetCascades(true)
2354 .SetSkipPointers(true)
2355 .SetSkipReferences(true)
2356 .SetNonCacheable(true),
2357 "block pointer synthetic children",
2359 if (valobj.GetCompilerType().IsBlockPointerType()) {
2360 return formatter_sp;
2361 }
2362 return nullptr;
2363 });
2364 });
2365
2366 return g_formatters;
2367}
2368
2371 !valobj.IsPointerType())
2372 return false;
2373 bool canReadValue = true;
2374 bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
2375 return canReadValue && isZero;
2376}
2377
2378bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
2379 const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",
2380 ".h", ".hh", ".hpp", ".hxx", ".h++"};
2381 for (auto suffix : suffixes) {
2382 if (file_path.ends_with_insensitive(suffix))
2383 return true;
2384 }
2385
2386 // Check if we're in a STL path (where the files usually have no extension
2387 // that we could check for.
2388 return file_path.contains("/usr/include/c++/");
2389}
2390
2392 assert(sc.function);
2393
2394 if (sc.block)
2395 if (Block *inline_block = sc.block->GetContainingInlinedBlock())
2396 return inline_block->GetBlockVariableList(true);
2397
2398 return sc.function->GetBlock(true).GetBlockVariableList(true);
2399}
2400
2402 const ExecutionContext *exe_ctx,
2403 const SymbolContext &sc) {
2404 assert(sc.function);
2405
2406 ExecutionContextScope *exe_scope =
2407 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2408
2409 const char *cstr = sc.GetPossiblyInlinedFunctionName()
2411 .AsCString(nullptr);
2412 if (!cstr)
2413 return false;
2414
2415 VariableList args;
2416 if (auto variable_list_sp = GetFunctionVariableList(sc))
2418 args);
2419
2420 if (args.GetSize() > 0)
2421 return PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args);
2422
2423 // FIXME: can we just unconditionally call PrettyPrintFunctionNameWithArgs?
2424 // It should be able to handle the "no arguments" case.
2425 s.PutCString(cstr);
2426
2427 return true;
2428}
2429
2431 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2432 FunctionNameRepresentation representation, Stream &s) {
2433 switch (representation) {
2435 // Print the function name with arguments in it
2436 if (sc.function)
2437 return PrintFunctionNameWithArgs(s, exe_ctx, sc);
2438
2439 if (!sc.symbol)
2440 return false;
2441
2442 const char *cstr = sc.symbol->GetName().AsCString(nullptr);
2443 if (!cstr)
2444 return false;
2445
2446 s.PutCString(cstr);
2447
2448 return true;
2449 }
2452 return false;
2453 }
2454 llvm_unreachable("Fully covered switch above");
2455}
2456
2458 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2460 switch (type) {
2462 auto scope_or_err = ::GetDemangledScope(sc);
2463 if (!scope_or_err) {
2465 GetLog(LLDBLog::Language), scope_or_err.takeError(),
2466 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2467 return false;
2468 }
2469
2470 s << *scope_or_err;
2471
2472 return true;
2473 }
2474
2476 auto name_or_err = ::GetDemangledBasename(sc);
2477 if (!name_or_err) {
2479 GetLog(LLDBLog::Language), name_or_err.takeError(),
2480 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2481 return false;
2482 }
2483
2484 s << *name_or_err;
2485
2486 return true;
2487 }
2488
2490 auto template_args_or_err = ::GetDemangledTemplateArguments(sc);
2491 if (!template_args_or_err) {
2493 template_args_or_err.takeError(),
2494 "Failed to handle ${{function.template-arguments}} "
2495 "frame-format variable: {0}");
2496 return false;
2497 }
2498
2499 s << *template_args_or_err;
2500
2501 return true;
2502 }
2503
2505 // This ensures we print the arguments even when no debug-info is available.
2506 //
2507 // FIXME: we should have a Entry::Type::FunctionArguments and
2508 // use it in the plugin.cplusplus.display.function-name-format
2509 // once we have a "fallback operator" in the frame-format language.
2510 if (!sc.function && sc.symbol)
2511 return PrintDemangledArgumentList(s, sc);
2512
2513 VariableList args;
2514 if (auto variable_list_sp = GetFunctionVariableList(sc))
2516 args);
2517
2518 ExecutionContextScope *exe_scope =
2519 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2520
2521 s << '(';
2523 s << ')';
2524
2525 return true;
2526 }
2528 auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc);
2529 if (!return_rhs_or_err) {
2530 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(),
2531 "Failed to handle ${{function.return-right}} frame-format "
2532 "variable: {0}");
2533 return false;
2534 }
2535
2536 s << *return_rhs_or_err;
2537
2538 return true;
2539 }
2541 auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc);
2542 if (!return_lhs_or_err) {
2543 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(),
2544 "Failed to handle ${{function.return-left}} frame-format "
2545 "variable: {0}");
2546 return false;
2547 }
2548
2549 s << *return_lhs_or_err;
2550
2551 return true;
2552 }
2554 auto quals_or_err = ::GetDemangledFunctionQualifiers(sc);
2555 if (!quals_or_err) {
2556 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(),
2557 "Failed to handle ${{function.qualifiers}} frame-format "
2558 "variable: {0}");
2559 return false;
2560 }
2561
2562 s << *quals_or_err;
2563
2564 return true;
2565 }
2567 auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
2568 if (!suffix_or_err) {
2570 GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2571 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2572 return false;
2573 }
2574
2575 s << *suffix_or_err;
2576
2577 return true;
2578 }
2579 default:
2580 return false;
2581 }
2582}
2583
2584namespace {
2585class NodeAllocator {
2586 llvm::BumpPtrAllocator Alloc;
2587
2588public:
2589 void reset() { Alloc.Reset(); }
2590
2591 template <typename T, typename... Args> T *makeNode(Args &&...args) {
2592 return new (Alloc.Allocate(sizeof(T), alignof(T)))
2593 T(std::forward<Args>(args)...);
2594 }
2595
2596 void *allocateNodeArray(size_t sz) {
2597 return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
2598 alignof(llvm::itanium_demangle::Node *));
2599 }
2600};
2601
2602template <typename Derived>
2603class ManglingSubstitutor
2604 : public llvm::itanium_demangle::AbstractManglingParser<Derived,
2605 NodeAllocator> {
2606 using Base =
2607 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2608
2609public:
2610 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2611
2612 template <typename... Ts>
2613 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2614 Ts &&...Vals) {
2615 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2616 return substituteImpl(Mangled);
2617 }
2618
2619protected:
2620 void reset(llvm::StringRef Mangled) {
2621 Base::reset(Mangled.begin(), Mangled.end());
2622 Written = Mangled.begin();
2623 Result.clear();
2624 Substituted = false;
2625 }
2626
2627 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2628 if (this->parse() == nullptr)
2629 return llvm::createStringErrorV("failed to substitute mangling in '{0}'",
2630 Mangled);
2631
2632 if (!Substituted)
2633 return ConstString();
2634
2635 // Append any trailing unmodified input.
2636 appendUnchangedInput();
2637 return ConstString(Result);
2638 }
2639
2640 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2641 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2642 return;
2643
2644 // We found a match. Append unmodified input up to this point.
2645 appendUnchangedInput();
2646
2647 // And then perform the replacement.
2648 Result += To;
2649 Written += From.size();
2650 Substituted = true;
2651 }
2652
2653private:
2654 /// Input character until which we have constructed the respective output
2655 /// already.
2656 const char *Written = "";
2657
2658 llvm::SmallString<128> Result;
2659
2660 /// Whether we have performed any substitutions.
2661 bool Substituted = false;
2662
2663 const char *currentParserPos() const { return this->First; }
2664
2665 void appendUnchangedInput() {
2666 Result +=
2667 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2668 Written = currentParserPos();
2669 }
2670};
2671
2672/// Given a mangled function `Mangled`, replace all the primitive function type
2673/// arguments of `Search` with type `Replace`.
2674class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
2675 llvm::StringRef Search;
2676 llvm::StringRef Replace;
2677
2678public:
2679 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2680 llvm::StringRef Replace) {
2681 ManglingSubstitutor::reset(Mangled);
2682 this->Search = Search;
2683 this->Replace = Replace;
2684 }
2685
2686 llvm::itanium_demangle::Node *parseType() {
2687 trySubstitute(Search, Replace);
2688 return ManglingSubstitutor::parseType();
2689 }
2690};
2691
2692class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
2693 llvm::StringRef Search;
2694 llvm::StringRef Replace;
2695
2696public:
2697 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2698 llvm::StringRef Replace) {
2699 ManglingSubstitutor::reset(Mangled);
2700 this->Search = Search;
2701 this->Replace = Replace;
2702 }
2703
2704 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2705
2706 llvm::itanium_demangle::Node *
2707 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
2708 if (!Search.empty() && !Replace.empty()) {
2709 trySubstitute(Search, Replace);
2710 } else {
2711 trySubstitute("D1", "D2");
2712 trySubstitute("C1", "C2");
2713 }
2714 return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
2715 }
2716};
2717} // namespace
2718
2719llvm::Expected<ConstString>
2721 llvm::StringRef subst_from,
2722 llvm::StringRef subst_to) {
2723 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2724}
2725
2727 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2728 llvm::StringRef subst_to) {
2729 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2730}
2731
2732llvm::Expected<ConstString>
2734 llvm::StringRef mangled_name) {
2735 return CtorDtorSubstitutor().substitute(mangled_name);
2736}
2737
2738#define LLDB_PROPERTIES_language_cplusplus
2739#include "LanguageCPlusPlusProperties.inc"
2740
2741enum {
2742#define LLDB_PROPERTIES_language_cplusplus
2743#include "LanguageCPlusPlusPropertiesEnum.inc"
2744};
2745
2746namespace {
2747class PluginProperties : public Properties {
2748public:
2749 static llvm::StringRef GetSettingName() { return "display"; }
2750
2751 PluginProperties() {
2752 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2753 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2754 }
2755
2756 FormatEntity::Entry GetFunctionNameFormat() const {
2757 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2758 ePropertyFunctionNameFormat, {});
2759 }
2760};
2761} // namespace
2762
2763static PluginProperties &GetGlobalPluginProperties() {
2764 static PluginProperties g_settings;
2765 return g_settings;
2766}
2767
2771
2774 debugger, PluginProperties::GetSettingName())) {
2776 debugger, GetGlobalPluginProperties().GetValueProperties(),
2777 "Properties for the CPlusPlus language plug-in.",
2778 /*is_global_property=*/true);
2779 }
2780}
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(const SymbolContext &sc)
static bool GenericStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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 SyntheticChildrenFrontEnd * GenericExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
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 SyntheticChildrenFrontEnd * GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericValarraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool IsTrivialContext(llvm::StringRef context)
A context is trivial if an only if it matches this pattern.
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static bool GenericSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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 * GenericValarraySyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_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 bool GenericExpectedSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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 SyntheticChildrenFrontEnd * GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static DemangledNameInfoCache & GetDemangledInfoCache()
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()
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::ASCII >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF32 >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF16 >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF8 >(ValueObject &, Stream &, const TypeSummaryOptions &)
#define LLDB_LOG_ERROR(log, error,...)
Definition Log.h:405
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF32 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:221
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF8 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:207
bool lldb_private::formatters::MsvcStlStringSummaryProvider< StringElementType::ASCII >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:164
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::ASCII >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:200
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF16 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition MsvcStl.cpp:214
#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:382
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
static bool ExtractContextAndIdentifier(llvm::StringRef name, llvm::StringRef &context, llvm::StringRef &identifier)
lldb::TypeCategoryImplSP GetFormatters() override
static llvm::StringRef GetPluginNameStatic()
FormatEntity::Entry GetFunctionNameFormat() const override
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
bool SymbolNameFitsToLanguage(const Mangled &mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
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....
bool HandleFrameFormatVariable(const SymbolContext &sc, const ExecutionContext *exe_ctx, FormatEntity::Entry::Type type, Stream &s) override
static void DebuggerInitialize(Debugger &)
virtual std::unique_ptr< Language::MethodName > GetMethodName(llvm::StringRef name) const override
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
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) 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:101
A cache from mangled names to DemangledNameInfo.
void SetMaxEntries(size_t max_entries)
Changes the maximum number of entries. A limit of 0 disables the cache.
std::optional< DemangledNameInfo > Get(const Mangled &mangled)
Calculates the DemangledNameInfo and caches the result.
"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(ConstString category_name, bool can_create=true)
Block & GetBlock(bool can_create)
Get accessor for the block list.
Definition Function.cpp:401
HardcodedFormatterFinders< SyntheticChildren > HardcodedSyntheticFinder
HardcodedFormatterFinders< TypeSummaryImpl > HardcodedSummaryFinder
llvm::StringRef GetQualifiers()
Definition Language.h:271
llvm::StringRef GetReturnType()
Definition Language.h:277
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:367
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:342
A class that handles mangled names.
Definition Mangled.h:34
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:40
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:146
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:285
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:362
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:44
static ModuleListProperties & GetGlobalModuleListProperties()
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:63
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:612
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:93
Flags & SetSkipPointers(bool value=true)
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
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
virtual lldb::ValueType GetValueType() const =0
lldb::LanguageType GetObjectRuntimeLanguage()
CompilerType GetCompilerType()
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 * MsvcStlValarraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoSysSecondsSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:840
bool LibcxxChronoMonthSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:906
SyntheticChildrenFrontEnd * VectorTypeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlUnordered(ValueObject &valobj)
bool LibcxxUniquePointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:225
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:143
bool LibcxxPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:258
bool LibStdcppStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlExpected(ValueObject &valobj)
bool IsMsvcStlTuple(ValueObject &valobj)
bool LibcxxSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:179
bool LibcxxStringViewSummaryProviderASCII(ValueObject &valueObj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:743
bool LibcxxStringViewSummaryProviderUTF16(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:750
lldb_private::SyntheticChildrenFrontEnd * MsvcStlVectorSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool MsvcStlExpectedSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibCxxVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool VectorTypeSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &)
SyntheticChildrenFrontEnd * LibStdcppTupleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxStdVectorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:984
bool LibcxxStringViewSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:757
SyntheticChildrenFrontEnd * LibStdcppSpanSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibStdcppStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:282
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 MsvcStlPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:244
bool MsvcStlWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:268
bool IsMsvcStlSourceLocation(ValueObject &valobj)
Definition MsvcStl.cpp:310
bool LibcxxChronoYearMonthDaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:948
bool LibStdcppUniquePointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:626
SyntheticChildrenFrontEnd * LibcxxTupleFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxStringSummaryProviderASCII(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:683
SyntheticChildrenFrontEnd * MsvcStlForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoLocalSecondsSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:846
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:764
bool Char8SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxChronoWeekdaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:927
bool MsvcStlVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlMapLike(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool MsvcStlStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:289
SyntheticChildrenFrontEnd * LibcxxStdProxyArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * GenericErrorCodeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxStringSummaryProviderUTF16(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:690
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:133
bool MsvcStlSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxStringSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:697
bool IsMsvcStlUniquePtr(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxStdListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool MsvcStlSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:316
bool LibcxxStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:303
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.
SyntheticChildrenFrontEnd * GenericInitializerListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
SyntheticChildrenFrontEnd * GenericContainerAdaptorFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoLocalDaysSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:900
SyntheticChildrenFrontEnd * LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * MsvcStlBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlVariantSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlMapLikeSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlTreeIterSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlOrdering(ValueObject &valobj)
Definition MsvcStl.cpp:227
bool Char8StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdMapSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlStringViewType(ValueObject &valobj)
Definition MsvcStl.cpp:149
SyntheticChildrenFrontEnd * LibStdcppBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxVariantFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppSharedPtrSyntheticFrontEndCreator(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.
bool MsvcStlWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:191
bool LibcxxVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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)
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)
SyntheticChildrenFrontEnd * BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlSpan(ValueObject &valobj)
SyntheticChildrenFrontEnd * MsvcStlSpanSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlDequeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool BlockPointerSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &)
bool IsMsvcStlValarray(ValueObject &valobj)
SyntheticChildrenFrontEnd * MsvcStlExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlTreeIterSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibcxxStdForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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:894
bool LibStdcppVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:155
SyntheticChildrenFrontEnd * LibcxxStdSliceArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
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)
bool GenericErrorCodeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibStdcppWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * MsvcStlAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlBitset(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxStdValarraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlSmartPointer(ValueObject &valobj)
bool MsvcStlAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool GenericFilesystemPathSummaryProvider(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:338
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeObjC_plus_plus
Objective-C++.
std::shared_ptr< lldb_private::VariableList > VariableListSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVariableArgument
function argument variables
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
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< uint32_t, uint32_t > TemplateArgumentsRange
A [start, end) pair for the function template arguments.
bool hasTemplateArguments() const
Returns true if this object holds a valid template arguments range.
std::pair< uint32_t, uint32_t > QualifiersRange
Indicates the [start, end) of the function qualifiers (e.g., CV-qualifiers, reference qualifiers,...
std::pair< uint32_t, uint32_t > BasenameRange
A [start, end) pair for the function basename.
std::pair< uint32_t, uint32_t > SuffixRange
Indicates the [start, end) of the function's suffix.
bool hasScope() const
Returns true if this object holds a valid scope range.
std::pair< uint32_t, uint32_t > ScopeRange
A [start, end) pair for the function scope qualifiers.
bool hasQualifiers() const
Returns true if this object holds a valid qualifiers range.
std::pair< uint32_t, uint32_t > ArgumentsRange
Indicates the [start, end) of the function argument list.
bool hasArguments() const
Returns true if this object holds a valid arguments range.