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"
37#include "lldb/Utility/Log.h"
40
41#include "BlockPointer.h"
42#include "CPlusPlusNameParser.h"
43#include "Coroutines.h"
44#include "CxxStringTypes.h"
45#include "Generic.h"
46#include "LibCxx.h"
47#include "LibCxxAtomic.h"
48#include "LibCxxVariant.h"
49#include "LibStdcpp.h"
51#include "MsvcStl.h"
53
54using namespace lldb;
55using namespace lldb_private;
56using namespace lldb_private::formatters;
57
59
64
68
69std::unique_ptr<Language::MethodName>
70CPlusPlusLanguage::GetMethodName(llvm::StringRef full_name) const {
71 std::unique_ptr<CxxMethodName> cpp_method =
72 std::make_unique<CxxMethodName>(full_name.str());
73 cpp_method->IsValid();
74 return cpp_method;
75}
76
77std::pair<FunctionNameType, std::optional<ConstString>>
80 return {eFunctionNameTypeFull, std::nullopt};
81
82 FunctionNameType func_name_type = eFunctionNameTypeNone;
83 CxxMethodName method(name.GetStringRef().str());
84 llvm::StringRef basename = method.GetBasename();
85 if (basename.empty()) {
86 llvm::StringRef context;
87 func_name_type |=
88 (ExtractContextAndIdentifier(name.GetStringRef(), context, basename)
89 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
90 : eFunctionNameTypeFull);
91 } else {
92 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
93 }
94
95 if (!method.GetQualifiers().empty()) {
96 // There is a 'const' or other qualifier following the end of the function
97 // parens, this can't be a eFunctionNameTypeBase.
98 func_name_type &= ~(eFunctionNameTypeBase);
99 }
100
101 if (basename.empty())
102 return {func_name_type, std::nullopt};
103 else
104 return {func_name_type, ConstString(basename)};
105}
106
108 auto mangling_scheme =
110 return mangling_scheme == Mangled::eManglingSchemeItanium ||
111 mangling_scheme == Mangled::eManglingSchemeMSVC;
112}
113
115 Mangled mangled) const {
116 const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
117 ConstString demangled_name = mangled.GetDemangledName();
118 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
119 if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
120 (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
121 // typeinfo structure, and typeinfo
122 // mangled_name
123 mangled_name_cstr[2] != 'G' && // avoid guard variables
124 mangled_name_cstr[2] != 'Z')) // named local entities (if we
125 // eventually handle eSymbolTypeData,
126 // we will want this back)
127 {
128 CxxMethodName cxx_method(demangled_name.GetStringRef().str());
129 if (!cxx_method.GetBasename().empty()) {
130 std::string shortname;
131 if (!cxx_method.GetContext().empty())
132 shortname = cxx_method.GetContext().str() + "::";
133 shortname += cxx_method.GetBasename().str();
134 return ConstString(shortname);
135 }
136 }
137 }
138 if (demangled_name)
139 return demangled_name;
140 return mangled.GetMangledName();
141}
142
143// Static Functions
144
146 // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
147 if (Language::LanguageIsCPlusPlus(language) &&
148 language != eLanguageTypeObjC_plus_plus)
149 return new CPlusPlusLanguage();
150 return nullptr;
151}
152
153static bool ReverseFindMatchingChars(const llvm::StringRef &s,
154 const llvm::StringRef &left_right_chars,
155 size_t &left_pos, size_t &right_pos,
156 size_t pos = llvm::StringRef::npos) {
157 assert(left_right_chars.size() == 2);
158 left_pos = llvm::StringRef::npos;
159 const char left_char = left_right_chars[0];
160 const char right_char = left_right_chars[1];
161 pos = s.find_last_of(left_right_chars, pos);
162 if (pos == llvm::StringRef::npos || s[pos] == left_char)
163 return false;
164 right_pos = pos;
165 uint32_t depth = 1;
166 while (pos > 0 && depth > 0) {
167 pos = s.find_last_of(left_right_chars, pos);
168 if (pos == llvm::StringRef::npos)
169 return false;
170 if (s[pos] == left_char) {
171 if (--depth == 0) {
172 left_pos = pos;
173 return left_pos < right_pos;
174 }
175 } else if (s[pos] == right_char) {
176 ++depth;
177 }
178 }
179 return false;
180}
181
182static bool IsTrivialBasename(const llvm::StringRef &basename) {
183 // Check that the basename matches with the following regular expression
184 // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
185 // because it is significantly more efficient then using the general purpose
186 // regular expression library.
187 size_t idx = 0;
188 if (basename.starts_with('~'))
189 idx = 1;
190
191 if (basename.size() <= idx)
192 return false; // Empty string or "~"
193
194 if (!std::isalpha(static_cast<unsigned char>(basename[idx])) &&
195 basename[idx] != '_')
196 return false; // First character (after removing the possible '~'') isn't in
197 // [A-Za-z_]
198
199 // Read all characters matching [A-Za-z_0-9]
200 ++idx;
201 while (idx < basename.size()) {
202 if (!std::isalnum(static_cast<unsigned char>(basename[idx])) &&
203 basename[idx] != '_')
204 break;
205 ++idx;
206 }
207
208 // We processed all characters. It is a vaild basename.
209 return idx == basename.size();
210}
211
212/// A context is trivial if an only if it matches this pattern.
213/// "^\s*([A-Za-z_:]*)\s*$". for example function `foo::bar::func()`
214/// has a trivial context but. but `foo<int>::bar::func()` doesn't.
215static bool IsTrivialContext(llvm::StringRef context) {
216 // remove trailing or leading whitespace.
217 context = context.trim();
218
219 const auto iter = context.find_if_not([](char current) {
220 return std::isalnum(static_cast<unsigned char>(current)) ||
221 current == '_' || current == ':';
222 });
223 return iter == llvm::StringRef::npos;
224}
225
226/// Writes out the function name in 'full_name' to 'out_stream'
227/// but replaces each argument type with the variable name
228/// and the corresponding pretty-printed value
230 llvm::StringRef full_name,
231 ExecutionContextScope *exe_scope,
232 VariableList const &args) {
233 CPlusPlusLanguage::CxxMethodName cpp_method{full_name.str()};
234
235 if (!cpp_method.IsValid())
236 return false;
237
238 llvm::StringRef return_type = cpp_method.GetReturnType();
239 if (!return_type.empty()) {
240 out_stream.PutCString(return_type);
241 out_stream.PutChar(' ');
242 }
243
244 out_stream.PutCString(cpp_method.GetScopeQualifiedName());
245 out_stream.PutChar('(');
246
247 FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
248
249 out_stream.PutChar(')');
250
251 llvm::StringRef qualifiers = cpp_method.GetQualifiers();
252 if (!qualifiers.empty()) {
253 out_stream.PutChar(' ');
254 out_stream.PutCString(qualifiers);
255 }
256
257 return true;
258}
259
260static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
263 if (!mangled)
264 return llvm::createStringError("function does not have a mangled name");
265
266 auto demangled_name = mangled.GetDemangledName().GetStringRef();
267 if (demangled_name.empty())
268 return llvm::createStringErrorV(
269 "function '{0}' does not have a demangled name",
270 mangled.GetMangledName());
271
272 const DemangledNameInfo *info = mangled.GetDemangledInfo();
273 if (!info)
274 return llvm::createStringErrorV(
275 "function '{0}' does not have demangled info", demangled_name);
276
277 // Function without a basename is nonsense.
278 if (!info->hasBasename())
279 return llvm::createStringErrorV(
280 "demangled info for '{0}' does not have a basename range",
281 demangled_name);
282
283 return std::make_pair(demangled_name, *info);
284}
285
286static llvm::Expected<llvm::StringRef>
288 auto info_or_err = GetAndValidateInfo(sc);
289 if (!info_or_err)
290 return info_or_err.takeError();
291
292 auto [demangled_name, info] = *info_or_err;
293
294 return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info);
295}
296
297llvm::StringRef
299 const DemangledNameInfo &info) {
300 assert(info.hasBasename());
301 return demangled.slice(info.BasenameRange.first, info.BasenameRange.second);
302}
303
304llvm::Expected<llvm::StringRef>
306 llvm::StringRef demangled, const DemangledNameInfo &info) {
307 if (!info.hasTemplateArguments())
308 return llvm::createStringErrorV(
309 "template arguments range for '{0}' is invalid", demangled);
310
311 return demangled.slice(info.TemplateArgumentsRange.first,
312 info.TemplateArgumentsRange.second);
313}
314
315static llvm::Expected<llvm::StringRef>
317 auto info_or_err = GetAndValidateInfo(sc);
318 if (!info_or_err)
319 return info_or_err.takeError();
320
321 auto [demangled_name, info] = *info_or_err;
322
323 return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info);
324}
325
326llvm::Expected<llvm::StringRef>
328 const DemangledNameInfo &info) {
329 if (info.ScopeRange.first >= demangled.size())
330 return llvm::createStringErrorV(
331 "scope range for '{0}' LHS return type is invalid", demangled);
332
333 return demangled.substr(0, info.ScopeRange.first);
334}
335
336static llvm::Expected<llvm::StringRef>
338 auto info_or_err = GetAndValidateInfo(sc);
339 if (!info_or_err)
340 return info_or_err.takeError();
341
342 auto [demangled_name, info] = *info_or_err;
343
344 return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info);
345}
346
347llvm::Expected<llvm::StringRef>
349 llvm::StringRef demangled, const DemangledNameInfo &info) {
350 if (!info.hasQualifiers())
351 return llvm::createStringErrorV("qualifiers range for '{0}' is invalid",
352 demangled);
353
354 return demangled.slice(info.QualifiersRange.first,
355 info.QualifiersRange.second);
356}
357
358static llvm::Expected<llvm::StringRef>
360 auto info_or_err = GetAndValidateInfo(sc);
361 if (!info_or_err)
362 return info_or_err.takeError();
363
364 auto [demangled_name, info] = *info_or_err;
365
367 info);
368}
369
370llvm::Expected<llvm::StringRef>
372 const DemangledNameInfo &info) {
373 if (info.QualifiersRange.first < info.ArgumentsRange.second)
374 return llvm::createStringErrorV(
375 "qualifiers range for '{0}' RHS return type is invalid", demangled);
376
377 return demangled.slice(info.ArgumentsRange.second,
378 info.QualifiersRange.first);
379}
380
381static llvm::Expected<llvm::StringRef>
383 auto info_or_err = GetAndValidateInfo(sc);
384 if (!info_or_err)
385 return info_or_err.takeError();
386
387 auto [demangled_name, info] = *info_or_err;
388
389 return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info);
390}
391
392llvm::Expected<llvm::StringRef>
393CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled,
394 const DemangledNameInfo &info) {
395 if (!info.hasScope())
396 return llvm::createStringErrorV("scope range for '{0}' is invalid",
397 demangled);
398
399 return demangled.slice(info.ScopeRange.first, info.ScopeRange.second);
400}
401
402static llvm::Expected<llvm::StringRef>
404 auto info_or_err = GetAndValidateInfo(sc);
405 if (!info_or_err)
406 return info_or_err.takeError();
407
408 auto [demangled_name, info] = *info_or_err;
409
410 return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
411}
412
413llvm::Expected<llvm::StringRef>
415 const DemangledNameInfo &info) {
416 if (!info.hasSuffix())
417 return llvm::createStringErrorV("suffix range for '{0}' is invalid",
418 demangled);
419
420 return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
421}
422
423static llvm::Expected<llvm::StringRef>
425 auto info_or_err = GetAndValidateInfo(sc);
426 if (!info_or_err)
427 return info_or_err.takeError();
428
429 auto [demangled_name, info] = *info_or_err;
430
431 return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
432}
433
434llvm::Expected<llvm::StringRef>
436 llvm::StringRef demangled, const DemangledNameInfo &info) {
437 if (!info.hasArguments())
438 return llvm::createStringErrorV(
439 "function arguments range for '{0}' is invalid", demangled);
440
441 return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second);
442}
443
445 assert(sc.symbol);
446
447 auto info_or_err = GetAndValidateInfo(sc);
448 if (!info_or_err) {
449 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(),
450 "Failed to handle ${{function.formatted-arguments}} "
451 "frame-format variable: {0}");
452 return false;
453 }
454
455 auto [demangled_name, info] = *info_or_err;
456
457 auto args_or_err =
459 if (!args_or_err) {
460 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(),
461 "Failed to handle ${{function.formatted-arguments}} "
462 "frame-format variable: {0}");
463 return false;
464 }
465
466 s << *args_or_err;
467
468 return true;
469}
470
472 // This method tries to parse simple method definitions which are presumably
473 // most comman in user programs. Definitions that can be parsed by this
474 // function don't have return types and templates in the name.
475 // A::B::C::fun(std::vector<T> &) const
476 size_t arg_start, arg_end;
477 llvm::StringRef full(m_full);
478 llvm::StringRef parens("()", 2);
479 if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
480 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
481 if (arg_end + 1 < full.size())
482 m_qualifiers = full.substr(arg_end + 1).ltrim();
483
484 if (arg_start == 0)
485 return false;
486 size_t basename_end = arg_start;
487 size_t context_start = 0;
488 size_t context_end = full.rfind(':', basename_end);
489 if (context_end == llvm::StringRef::npos)
490 m_basename = full.substr(0, basename_end);
491 else {
492 if (context_start < context_end)
493 m_context = full.substr(context_start, context_end - 1 - context_start);
494 const size_t basename_begin = context_end + 1;
495 m_basename = full.substr(basename_begin, basename_end - basename_begin);
496 }
497
499 return true;
500 }
501 // The C++ basename doesn't match our regular expressions so this can't
502 // be a valid C++ method, clear everything out and indicate an error
503 m_context = llvm::StringRef();
504 m_basename = llvm::StringRef();
505 m_arguments = llvm::StringRef();
506 m_qualifiers = llvm::StringRef();
507 m_return_type = llvm::StringRef();
508 return false;
509 }
510 return false;
511}
512
514 if (!m_parsed && !m_full.empty()) {
515 if (TrySimplifiedParse()) {
516 m_parse_error = false;
517 } else {
519 if (auto function = parser.ParseAsFunctionDefinition()) {
520 m_basename = function->name.basename;
521 m_context = function->name.context;
522 m_arguments = function->arguments;
523 m_qualifiers = function->qualifiers;
524 m_return_type = function->return_type;
525 m_parse_error = false;
526 } else {
527 m_parse_error = true;
528 }
529 }
530 if (m_context.empty()) {
531 m_scope_qualified = std::string(m_basename);
532 } else {
534 m_scope_qualified += "::";
536 }
537 m_parsed = true;
538 }
539}
540
541llvm::StringRef
543 llvm::StringRef basename = GetBasename();
544 size_t arg_start, arg_end;
545 llvm::StringRef parens("<>", 2);
546 if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
547 return basename.substr(0, arg_start);
548
549 return basename;
550}
551
553 if (!m_parsed)
554 Parse();
555
556 // If we can't parse the incoming name, then just check that it contains path.
557 if (m_parse_error)
558 return llvm::StringRef(m_full).contains(path);
559
560 llvm::StringRef identifier;
561 llvm::StringRef context;
562 const bool success =
563 CPlusPlusLanguage::ExtractContextAndIdentifier(path, context, identifier);
564 if (!success)
565 return llvm::StringRef(m_full).contains(path);
566
567 // Basename may include template arguments.
568 // E.g.,
569 // GetBaseName(): func<int>
570 // identifier : func
571 //
572 // ...but we still want to account for identifiers with template parameter
573 // lists, e.g., when users set breakpoints on template specializations.
574 //
575 // E.g.,
576 // GetBaseName(): func<uint32_t>
577 // identifier : func<int32_t*>
578 //
579 // Try to match the basename with or without template parameters.
580 if (GetBasename() != identifier &&
581 GetBasenameNoTemplateParameters() != identifier)
582 return false;
583
584 // Incoming path only had an identifier, so we match.
585 if (context.empty())
586 return true;
587 // Incoming path has context but this method does not, no match.
588 if (m_context.empty())
589 return false;
590
591 llvm::StringRef haystack = m_context;
592 if (!haystack.consume_back(context))
593 return false;
594 if (haystack.empty() || !isalnum(haystack.back()))
595 return true;
596
597 return false;
598}
599
601 ConstString demangled) const {
602 CxxMethodName demangled_name(demangled.GetStringRef().str());
603 return demangled_name.ContainsPath(path);
604}
605
607 llvm::StringRef name, llvm::StringRef &context,
608 llvm::StringRef &identifier) {
611 identifier);
612
613 CPlusPlusNameParser parser(name);
614 if (auto full_name = parser.ParseAsFullName()) {
615 identifier = full_name->basename;
616 context = full_name->context;
617 return true;
618 }
619 return false;
620}
621
623 const ConstString mangled_name) const {
624 std::vector<ConstString> alternates;
625
626 /// Get a basic set of alternative manglings for the given symbol `name`, by
627 /// making a few basic possible substitutions on basic types, storage duration
628 /// and `const`ness for the given symbol. The output parameter `alternates`
629 /// is filled with a best-guess, non-exhaustive set of different manglings
630 /// for the given name.
631
632 // Maybe we're looking for a const symbol but the debug info told us it was
633 // non-const...
634 if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
635 strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
636 std::string fixed_scratch("_ZNK");
637 fixed_scratch.append(mangled_name.GetCString() + 3);
638 alternates.push_back(ConstString(fixed_scratch));
639 }
640
641 // Maybe we're looking for a static symbol but we thought it was global...
642 if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
643 strncmp(mangled_name.GetCString(), "_ZL", 3)) {
644 std::string fixed_scratch("_ZL");
645 fixed_scratch.append(mangled_name.GetCString() + 2);
646 alternates.push_back(ConstString(fixed_scratch));
647 }
648
649 auto *log = GetLog(LLDBLog::Language);
650
651 // `char` is implementation defined as either `signed` or `unsigned`. As a
652 // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
653 // char, 'h'-unsigned char. If we're looking for symbols with a signed char
654 // parameter, try finding matches which have the general case 'c'.
655 if (auto char_fixup_or_err =
656 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "a", "c")) {
657 // LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
658 if (*char_fixup_or_err)
659 alternates.push_back(*char_fixup_or_err);
660 } else
661 LLDB_LOG_ERROR(log, char_fixup_or_err.takeError(),
662 "Failed to substitute 'char' type mangling: {0}");
663
664 // long long parameter mangling 'x', may actually just be a long 'l' argument
665 if (auto long_fixup_or_err =
666 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "x", "l")) {
667 if (*long_fixup_or_err)
668 alternates.push_back(*long_fixup_or_err);
669 } else
670 LLDB_LOG_ERROR(log, long_fixup_or_err.takeError(),
671 "Failed to substitute 'long long' type mangling: {0}");
672
673 // unsigned long long parameter mangling 'y', may actually just be unsigned
674 // long 'm' argument
675 if (auto ulong_fixup_or_err =
676 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "y", "m")) {
677 if (*ulong_fixup_or_err)
678 alternates.push_back(*ulong_fixup_or_err);
679 } else
681 log, ulong_fixup_or_err.takeError(),
682 "Failed to substitute 'unsigned long long' type mangling: {0}");
683
684 if (auto ctor_fixup_or_err = SubstituteStructorAliases_ItaniumMangle(
685 mangled_name.GetStringRef())) {
686 if (*ctor_fixup_or_err) {
687 alternates.push_back(*ctor_fixup_or_err);
688 }
689 } else
690 LLDB_LOG_ERROR(log, ctor_fixup_or_err.takeError(),
691 "Failed to substitute structor alias manglings: {0}");
692
693 return alternates;
694}
695
697 const Mangled mangled, const SymbolContext &sym_ctx) const {
698 ConstString demangled = mangled.GetDemangledName();
699 if (!demangled)
700 return ConstString();
701
702 CxxMethodName cpp_name(demangled.GetStringRef().str());
703 std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
704
705 if (!scope_qualified_name.size())
706 return ConstString();
707
708 if (!sym_ctx.module_sp)
709 return ConstString();
710
711 lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
712 if (!sym_file)
713 return ConstString();
714
715 std::vector<ConstString> alternates;
716 sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
717
718 std::vector<ConstString> param_and_qual_matches;
719 std::vector<ConstString> param_matches;
720 for (size_t i = 0; i < alternates.size(); i++) {
721 ConstString alternate_mangled_name = alternates[i];
722 Mangled mangled(alternate_mangled_name);
723 ConstString demangled = mangled.GetDemangledName();
724
725 CxxMethodName alternate_cpp_name(demangled.GetStringRef().str());
726 if (!cpp_name.IsValid())
727 continue;
728
729 if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
730 if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
731 param_and_qual_matches.push_back(alternate_mangled_name);
732 else
733 param_matches.push_back(alternate_mangled_name);
734 }
735 }
736
737 if (param_and_qual_matches.size())
738 return param_and_qual_matches[0]; // It is assumed that there will be only
739 // one!
740 else if (param_matches.size())
741 return param_matches[0]; // Return one of them as a best match
742 else
743 return ConstString();
744}
745
746static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
747 if (!cpp_category_sp)
748 return;
749
750 TypeSummaryImpl::Flags stl_summary_flags;
751 stl_summary_flags.SetCascades(true)
752 .SetSkipPointers(false)
753 .SetSkipReferences(false)
755 .SetDontShowValue(false)
757 .SetHideItemNames(false);
758
759 AddCXXSummary(cpp_category_sp,
761 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
762 stl_summary_flags, true);
763 AddCXXSummary(cpp_category_sp,
765 "std::string summary provider",
766 "^std::__[[:alnum:]]+::basic_string<char, "
767 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
768 stl_summary_flags, true);
769 AddCXXSummary(cpp_category_sp,
771 "std::string summary provider",
772 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
773 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
774 stl_summary_flags, true);
775
776 AddCXXSummary(cpp_category_sp,
778 "std::u16string summary provider",
779 "^std::__[[:alnum:]]+::basic_string<char16_t, "
780 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
781 stl_summary_flags, true);
782
783 AddCXXSummary(cpp_category_sp,
785 "std::u32string summary provider",
786 "^std::__[[:alnum:]]+::basic_string<char32_t, "
787 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
788 stl_summary_flags, true);
789
790 AddCXXSummary(cpp_category_sp,
792 "std::wstring summary provider",
793 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
794 AddCXXSummary(cpp_category_sp,
796 "std::wstring summary provider",
797 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
798 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
799 stl_summary_flags, true);
800
801 AddCXXSummary(cpp_category_sp,
803 "std::string_view summary provider",
804 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
805 AddCXXSummary(cpp_category_sp,
807 "std::string_view summary provider",
808 "^std::__[[:alnum:]]+::basic_string_view<char, "
809 "std::__[[:alnum:]]+::char_traits<char> >$",
810 stl_summary_flags, true);
811 AddCXXSummary(cpp_category_sp,
813 "std::string_view summary provider",
814 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
815 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
816 stl_summary_flags, true);
817
818 AddCXXSummary(cpp_category_sp,
820 "std::u16string_view summary provider",
821 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
822 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
823 stl_summary_flags, true);
824
825 AddCXXSummary(cpp_category_sp,
827 "std::u32string_view summary provider",
828 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
829 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
830 stl_summary_flags, true);
831
832 AddCXXSummary(cpp_category_sp,
834 "std::wstring_view summary provider",
835 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
836 AddCXXSummary(cpp_category_sp,
838 "std::wstring_view summary provider",
839 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
840 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
841 stl_summary_flags, true);
842
843 SyntheticChildren::Flags stl_synth_flags;
844 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
845 false);
846 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
847 stl_deref_flags.SetFrontEndWantsDereference();
848
850 cpp_category_sp,
852 "libc++ std::bitset synthetic children",
853 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
855 cpp_category_sp,
857 "libc++ std::vector synthetic children",
858 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
860 cpp_category_sp,
862 "libc++ std::valarray synthetic children",
863 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
865 cpp_category_sp,
867 "libc++ std::slice_array synthetic children",
868 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
870 cpp_category_sp,
872 "libc++ synthetic children for the valarray proxy arrays",
873 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
874 stl_deref_flags, true);
876 cpp_category_sp,
878 "libc++ std::forward_list synthetic children",
879 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
881 cpp_category_sp,
883 "libc++ std::list synthetic children", "^std::__[[:alnum:]]+::list<.+>$",
884 stl_deref_flags, true);
886 cpp_category_sp,
888 "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
889 stl_synth_flags, true);
891 cpp_category_sp,
893 "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
894 stl_deref_flags, true);
896 cpp_category_sp,
898 "libc++ std::multiset synthetic children",
899 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
901 cpp_category_sp,
903 "libc++ std::multimap synthetic children",
904 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
906 cpp_category_sp,
908 "libc++ std::unordered containers synthetic children",
909 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
910 stl_synth_flags, true);
912 "libc++ std::queue synthetic children",
913 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
915 "libc++ std::tuple synthetic children",
916 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
918 "libc++ std::optional synthetic children",
919 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
921 "libc++ std::variant synthetic children",
922 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
924 cpp_category_sp,
926 "libc++ std::atomic synthetic children",
927 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
929 cpp_category_sp,
931 "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
932 stl_deref_flags, true);
934 cpp_category_sp,
936 "libc++ std::ranges::ref_view synthetic children",
937 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
938
939 cpp_category_sp->AddTypeSynthetic(
940 "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
942 stl_synth_flags,
943 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
944
946 cpp_category_sp,
948 "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
949 stl_synth_flags, true);
950
951 static constexpr const char *const libcxx_std_unique_ptr_regex =
952 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
954 cpp_category_sp,
956 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
957 stl_synth_flags, true);
958
960 cpp_category_sp,
962 "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
963 stl_synth_flags, true);
964 AddCXXSummary(cpp_category_sp,
966 "libc++ std::function summary provider",
967 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
968
969 static constexpr const char *const libcxx_std_coroutine_handle_regex =
970 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
972 cpp_category_sp,
974 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
975 stl_deref_flags, true);
976
977 stl_summary_flags.SetDontShowChildren(false);
978 stl_summary_flags.SetSkipPointers(false);
979 AddCXXSummary(cpp_category_sp,
981 "libc++ std::bitset summary provider",
982 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
983 AddCXXSummary(cpp_category_sp,
985 "libc++ std::vector summary provider",
986 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
987 AddCXXSummary(cpp_category_sp,
989 "libc++ std::valarray summary provider",
990 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
991 AddCXXSummary(cpp_category_sp,
993 "libc++ std::slice_array summary provider",
994 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
995 true);
996 AddCXXSummary(cpp_category_sp,
998 "libc++ summary provider for the valarray proxy arrays",
999 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1000 stl_summary_flags, true);
1003 "libc++ std::list summary provider",
1004 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
1005 AddCXXSummary(cpp_category_sp,
1007 "libc++ std::list summary provider",
1008 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags, true);
1009 AddCXXSummary(cpp_category_sp,
1011 "libc++ std::map summary provider",
1012 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
1013 AddCXXSummary(cpp_category_sp,
1015 "libc++ std::deque summary provider",
1016 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
1017 AddCXXSummary(cpp_category_sp,
1019 "libc++ std::queue summary provider",
1020 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
1021 AddCXXSummary(cpp_category_sp,
1023 "libc++ std::set summary provider",
1024 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
1025 AddCXXSummary(cpp_category_sp,
1027 "libc++ std::multiset summary provider",
1028 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
1029 AddCXXSummary(cpp_category_sp,
1031 "libc++ std::multimap summary provider",
1032 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
1033 AddCXXSummary(cpp_category_sp,
1035 "libc++ std::unordered containers summary provider",
1036 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1037 stl_summary_flags, true);
1039 "libc++ std::tuple summary provider",
1040 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
1041 AddCXXSummary(cpp_category_sp,
1043 "libc++ std::atomic summary provider",
1044 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
1045 AddCXXSummary(cpp_category_sp,
1047 "libc++ std::optional summary provider",
1048 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
1049 AddCXXSummary(cpp_category_sp,
1051 "libc++ std::variant summary provider",
1052 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
1053 AddCXXSummary(cpp_category_sp,
1055 "libc++ std::span summary provider",
1056 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
1057
1058 stl_summary_flags.SetSkipPointers(true);
1059
1060 AddCXXSummary(cpp_category_sp,
1062 "libc++ std::shared_ptr summary provider",
1063 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1064 true);
1065 AddCXXSummary(cpp_category_sp,
1067 "libc++ std::weak_ptr summary provider",
1068 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
1069 AddCXXSummary(cpp_category_sp,
1071 "libc++ std::unique_ptr summary provider",
1072 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
1073
1074 AddCXXSummary(cpp_category_sp,
1076 "libc++ std::coroutine_handle summary provider",
1077 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
1078
1080 cpp_category_sp,
1082 "std::vector iterator synthetic children",
1083 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
1084
1086 cpp_category_sp,
1088 "std::map iterator synthetic children",
1089 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1090 true);
1091
1092 AddCXXSynthetic(cpp_category_sp,
1095 "std::unordered_map iterator synthetic children",
1096 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1097 stl_synth_flags, true);
1098 // Chrono duration typedefs
1099 cpp_category_sp->AddTypeSummary(
1100 "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
1102 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
1103 cpp_category_sp->AddTypeSummary(
1104 "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
1106 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
1107 cpp_category_sp->AddTypeSummary(
1108 "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
1110 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
1111 cpp_category_sp->AddTypeSummary(
1112 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1114 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1115 cpp_category_sp->AddTypeSummary(
1116 "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
1117 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1118 eTypeOptionHideValue,
1119 "${var.__rep_} min")));
1120 cpp_category_sp->AddTypeSummary(
1121 "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
1123 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
1124
1125 cpp_category_sp->AddTypeSummary(
1126 "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
1127 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1128 eTypeOptionHideValue,
1129 "${var.__rep_} days")));
1130 cpp_category_sp->AddTypeSummary(
1131 "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
1132 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1133 eTypeOptionHideValue,
1134 "${var.__rep_} weeks")));
1135 cpp_category_sp->AddTypeSummary(
1136 "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
1137 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1138 eTypeOptionHideValue,
1139 "${var.__rep_} months")));
1140 cpp_category_sp->AddTypeSummary(
1141 "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
1142 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1143 eTypeOptionHideValue,
1144 "${var.__rep_} years")));
1145 cpp_category_sp->AddTypeSummary(
1146 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1148 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1149
1150 // Chrono time point types
1151
1152 AddCXXSummary(cpp_category_sp,
1154 "libc++ std::chrono::sys_seconds summary provider",
1155 "^std::__[[:alnum:]]+::chrono::time_point<"
1156 "std::__[[:alnum:]]+::chrono::system_clock, "
1157 "std::__[[:alnum:]]+::chrono::duration<.*, "
1158 "std::__[[:alnum:]]+::ratio<1, 1> "
1159 "> >$",
1160 eTypeOptionHideChildren | eTypeOptionHideValue |
1161 eTypeOptionCascade,
1162 true);
1163 AddCXXSummary(cpp_category_sp,
1165 "libc++ std::chrono::sys_seconds summary provider",
1166 "^std::__[[:alnum:]]+::chrono::time_point<"
1167 "std::__[[:alnum:]]+::chrono::system_clock, "
1168 "std::__[[:alnum:]]+::chrono::duration<int, "
1169 "std::__[[:alnum:]]+::ratio<86400, 1> "
1170 "> >$",
1171 eTypeOptionHideChildren | eTypeOptionHideValue |
1172 eTypeOptionCascade,
1173 true);
1174
1176 cpp_category_sp,
1178 "libc++ std::chrono::local_seconds summary provider",
1179 "^std::__[[:alnum:]]+::chrono::time_point<"
1180 "std::__[[:alnum:]]+::chrono::local_t, "
1181 "std::__[[:alnum:]]+::chrono::duration<.*, "
1182 "std::__[[:alnum:]]+::ratio<1, 1> "
1183 "> >$",
1184 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1185 true);
1186 AddCXXSummary(cpp_category_sp,
1188 "libc++ std::chrono::local_seconds summary provider",
1189 "^std::__[[:alnum:]]+::chrono::time_point<"
1190 "std::__[[:alnum:]]+::chrono::local_t, "
1191 "std::__[[:alnum:]]+::chrono::duration<int, "
1192 "std::__[[:alnum:]]+::ratio<86400, 1> "
1193 "> >$",
1194 eTypeOptionHideChildren | eTypeOptionHideValue |
1195 eTypeOptionCascade,
1196 true);
1197
1198 // Chrono calendar types
1199
1200 cpp_category_sp->AddTypeSummary(
1201 "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1202 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1203 eTypeOptionHideValue,
1204 "day=${var.__d_%u}")));
1205
1206 AddCXXSummary(cpp_category_sp,
1208 "libc++ std::chrono::month summary provider",
1209 "^std::__[[:alnum:]]+::chrono::month$",
1210 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1211
1212 cpp_category_sp->AddTypeSummary(
1213 "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1215 eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1216
1217 AddCXXSummary(cpp_category_sp,
1219 "libc++ std::chrono::weekday summary provider",
1220 "^std::__[[:alnum:]]+::chrono::weekday$",
1221 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1222
1223 cpp_category_sp->AddTypeSummary(
1224 "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
1226 eTypeOptionHideChildren | eTypeOptionHideValue,
1227 "${var.__wd_} index=${var.__idx_%u}")));
1228
1229 cpp_category_sp->AddTypeSummary(
1230 "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
1231 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1232 eTypeOptionHideValue,
1233 "${var.__wd_} index=last")));
1234 cpp_category_sp->AddTypeSummary(
1235 "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1236 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1237 eTypeOptionHideValue,
1238 "${var.__m_} ${var.__d_}")));
1239 cpp_category_sp->AddTypeSummary(
1240 "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1241 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1242 eTypeOptionHideValue,
1243 "${var.__m_} day=last")));
1244
1245 cpp_category_sp->AddTypeSummary(
1246 "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
1247 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1248 eTypeOptionHideValue,
1249 "${var.__m_} ${var.__wdi_}")));
1250
1251 cpp_category_sp->AddTypeSummary(
1252 "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
1253 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1254 eTypeOptionHideValue,
1255 "${var.__m_} ${var.__wdl_}")));
1256
1257 cpp_category_sp->AddTypeSummary(
1258 "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
1259 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1260 eTypeOptionHideValue,
1261 "${var.__y_} ${var.__m_}")));
1262
1264 cpp_category_sp,
1266 "libc++ std::chrono::year_month_day summary provider",
1267 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1268 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1269
1270 cpp_category_sp->AddTypeSummary(
1271 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1273 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1274 eTypeOptionHideValue,
1275 "${var.__y_} ${var.__mdl_}")));
1276
1277 cpp_category_sp->AddTypeSummary(
1278 "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
1280 eTypeOptionHideChildren | eTypeOptionHideValue,
1281 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1282
1283 cpp_category_sp->AddTypeSummary(
1284 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1287 eTypeOptionHideChildren | eTypeOptionHideValue,
1288 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1289
1290 AddCXXSummary(cpp_category_sp,
1292 "libc++ std::partial_ordering summary provider",
1293 "^std::__[[:alnum:]]+::partial_ordering$",
1294 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1295 AddCXXSummary(cpp_category_sp,
1297 "libc++ std::weak_ordering summary provider",
1298 "^std::__[[:alnum:]]+::weak_ordering$",
1299 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1300 AddCXXSummary(cpp_category_sp,
1302 "libc++ std::strong_ordering summary provider",
1303 "^std::__[[:alnum:]]+::strong_ordering$",
1304 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1305
1306 AddCXXSummary(cpp_category_sp,
1308 "libc++ std::source_location summary provider",
1309 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1310 true);
1311}
1312
1314 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1315 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1316 auto makeSpecifier = [](llvm::StringRef name) {
1317 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1318 name, eFormatterMatchExact);
1319 };
1320
1321 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1322
1323 category_sp->AddTypeSummary(
1324 makeSpecifier(llvm::formatv("std::basic_string<{}>", char_ty).str()),
1325 summary_sp);
1326
1327 category_sp->AddTypeSummary(
1328 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1329 llvm::formatv("^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1330 char_ty)
1331 .str(),
1333 summary_sp);
1334}
1335
1337 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1338 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1339 // std::string_view
1340 category_sp->AddTypeSummary(
1341 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1342 string_ty, eFormatterMatchExact),
1343 summary_sp);
1344
1345 // std::basic_string_view<char, std::char_traits<char>>
1346 // NativePDB has spaces at different positions compared to PDB and DWARF, so
1347 // use a regex and make them optional.
1348 category_sp->AddTypeSummary(
1349 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1350 llvm::formatv(
1351 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1352 char_ty)
1353 .str(),
1355 summary_sp);
1356}
1357
1359 if (!cpp_category_sp)
1360 return;
1361
1362 TypeSummaryImpl::Flags stl_summary_flags;
1363 stl_summary_flags.SetCascades(true)
1364 .SetSkipPointers(false)
1365 .SetSkipReferences(false)
1366 .SetDontShowChildren(true)
1367 .SetDontShowValue(false)
1369 .SetHideItemNames(false);
1370
1372 stl_summary_flags, LibStdcppStringSummaryProvider,
1373 "libstdc++ std::(w)string summary provider"));
1374 cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1375 string_summary_sp);
1376 cpp_category_sp->AddTypeSummary(
1377 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1378 eFormatterMatchRegex, string_summary_sp);
1379 cpp_category_sp->AddTypeSummary("^std::__cxx11::basic_string<unsigned char, "
1380 "std::char_traits<unsigned char>,.*>$",
1381 eFormatterMatchRegex, string_summary_sp);
1382
1383 cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1384 string_summary_sp);
1385 cpp_category_sp->AddTypeSummary(
1386 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1387 eFormatterMatchRegex, string_summary_sp);
1388
1389 SyntheticChildren::Flags stl_synth_flags;
1390 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1391 false);
1392 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1393 stl_deref_flags.SetFrontEndWantsDereference();
1394
1395 cpp_category_sp->AddTypeSynthetic(
1396 "^std::__debug::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1398 stl_synth_flags,
1399 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1400 cpp_category_sp->AddTypeSynthetic(
1401 "^std::__debug::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1403 stl_synth_flags,
1404 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1405 cpp_category_sp->AddTypeSynthetic(
1406 "^std::__debug::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1408 stl_deref_flags,
1409 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1410 cpp_category_sp->AddTypeSynthetic(
1411 "^std::__debug::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1413 stl_deref_flags,
1414 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1415 cpp_category_sp->AddTypeSynthetic(
1416 "^std::__debug::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1418 stl_deref_flags,
1419 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1420 cpp_category_sp->AddTypeSynthetic(
1421 "^std::__debug::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1423 stl_deref_flags,
1424 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1425 cpp_category_sp->AddTypeSynthetic(
1426 "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1428 stl_deref_flags,
1429 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1430 cpp_category_sp->AddTypeSynthetic(
1431 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", eFormatterMatchRegex,
1433 stl_deref_flags,
1434 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1435 cpp_category_sp->AddTypeSynthetic(
1436 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1438 stl_synth_flags,
1439 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1440
1441 stl_summary_flags.SetDontShowChildren(false);
1442 stl_summary_flags.SetSkipPointers(false);
1443
1444 AddCXXSummary(cpp_category_sp,
1446 "libstdc++ std::bitset summary provider",
1447 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
1448
1449 AddCXXSummary(cpp_category_sp,
1451 "libstdc++ std::__debug::vector summary provider",
1452 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags, true);
1453
1454 AddCXXSummary(cpp_category_sp,
1456 "libstdc++ debug std::map summary provider",
1457 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags, true);
1458
1459 AddCXXSummary(cpp_category_sp,
1461 "libstdc++ debug std::set summary provider",
1462 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags, true);
1463
1465 "libstdc++ debug std::deque summary provider",
1466 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags, true);
1467
1470 "libstdc++ debug std::multimap summary provider",
1471 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags, true);
1472
1475 "libstdc++ debug std::multiset summary provider",
1476 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags, true);
1477
1478 AddCXXSummary(cpp_category_sp,
1480 "libstdc++ debug std unordered container summary provider",
1481 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1482 stl_summary_flags, true);
1483
1486 "libstdc++ debug std::list summary provider",
1487 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags, true);
1488
1489 cpp_category_sp->AddTypeSummary(
1490 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1492 stl_summary_flags,
1493 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1494
1496 cpp_category_sp,
1498 "std::vector iterator synthetic children",
1499 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1500
1502 cpp_category_sp,
1504 "std::map iterator synthetic children",
1505 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags, true);
1506
1508 cpp_category_sp,
1510 "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1511 stl_synth_flags, true);
1512
1513 static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1514 "^std::coroutine_handle<.+>(( )?&)?$";
1516 cpp_category_sp,
1518 "std::coroutine_handle synthetic children",
1519 libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1520
1522 cpp_category_sp,
1524 "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
1525 stl_deref_flags, true);
1526
1527 AddCXXSummary(cpp_category_sp,
1529 "libstdc++ std::coroutine_handle summary provider",
1530 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1531
1533 cpp_category_sp,
1535 "libstdc++ std::source_location summary provider", "std::source_location",
1536 stl_summary_flags);
1537}
1538
1539static lldb_private::SyntheticChildrenFrontEnd *
1541 lldb::ValueObjectSP valobj_sp) {
1542 if (!valobj_sp)
1543 return nullptr;
1544
1545 if (IsMsvcStlSmartPointer(*valobj_sp))
1547 return LibStdcppSharedPtrSyntheticFrontEndCreator(children, valobj_sp);
1548}
1549
1550static bool
1552 const TypeSummaryOptions &options) {
1553 if (IsMsvcStlSmartPointer(valobj))
1554 return MsvcStlSmartPointerSummaryProvider(valobj, stream, options);
1555 return LibStdcppSmartPointerSummaryProvider(valobj, stream, options);
1556}
1557
1558static lldb_private::SyntheticChildrenFrontEnd *
1560 lldb::ValueObjectSP valobj_sp) {
1561 if (!valobj_sp)
1562 return nullptr;
1563
1564 if (IsMsvcStlUniquePtr(*valobj_sp))
1566 return LibStdcppUniquePtrSyntheticFrontEndCreator(children, valobj_sp);
1567}
1568
1570 const TypeSummaryOptions &options) {
1571 if (IsMsvcStlUniquePtr(valobj))
1572 return MsvcStlUniquePtrSummaryProvider(valobj, stream, options);
1573 return LibStdcppUniquePointerSummaryProvider(valobj, stream, options);
1574}
1575
1576static SyntheticChildrenFrontEnd *
1578 lldb::ValueObjectSP valobj_sp) {
1579 if (!valobj_sp)
1580 return nullptr;
1581
1582 if (IsMsvcStlTuple(*valobj_sp))
1583 return MsvcStlTupleSyntheticFrontEndCreator(children, valobj_sp);
1584 return LibStdcppTupleSyntheticFrontEndCreator(children, valobj_sp);
1585}
1586
1587static SyntheticChildrenFrontEnd *
1589 lldb::ValueObjectSP valobj_sp) {
1590 if (!valobj_sp)
1591 return nullptr;
1592
1593 // checks for vector<T> and vector<bool>
1594 if (auto *msvc = MsvcStlVectorSyntheticFrontEndCreator(valobj_sp))
1595 return msvc;
1596
1598 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1599}
1600
1601static SyntheticChildrenFrontEnd *
1603 lldb::ValueObjectSP valobj_sp) {
1604 if (!valobj_sp)
1605 return nullptr;
1606
1607 if (IsMsvcStlList(*valobj_sp))
1608 return MsvcStlListSyntheticFrontEndCreator(children, valobj_sp);
1610 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1611}
1612
1613static SyntheticChildrenFrontEnd *
1615 lldb::ValueObjectSP valobj_sp) {
1616 if (!valobj_sp)
1617 return nullptr;
1618
1619 if (IsMsvcStlList(*valobj_sp))
1620 return MsvcStlForwardListSyntheticFrontEndCreator(children, valobj_sp);
1622 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1623 *valobj_sp);
1624}
1625
1626static SyntheticChildrenFrontEnd *
1628 lldb::ValueObjectSP valobj_sp) {
1629 if (!valobj_sp)
1630 return nullptr;
1631
1632 if (IsMsvcStlOptional(*valobj_sp))
1633 return MsvcStlOptionalSyntheticFrontEndCreator(children, valobj_sp);
1634 return LibStdcppOptionalSyntheticFrontEndCreator(children, valobj_sp);
1635}
1636
1637static SyntheticChildrenFrontEnd *
1639 lldb::ValueObjectSP valobj_sp) {
1640 if (!valobj_sp)
1641 return nullptr;
1642
1643 if (IsMsvcStlVariant(*valobj_sp))
1644 return MsvcStlVariantSyntheticFrontEndCreator(children, valobj_sp);
1646 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1647}
1648
1650 const TypeSummaryOptions &options) {
1651 if (IsMsvcStlVariant(valobj))
1652 return MsvcStlVariantSummaryProvider(valobj, stream, options);
1653 return LibStdcppVariantSummaryProvider(valobj, stream, options);
1654}
1655
1656static SyntheticChildrenFrontEnd *
1658 ValueObjectSP valobj_sp) {
1659 if (!valobj_sp)
1660 return nullptr;
1661
1662 if (IsMsvcStlUnordered(*valobj_sp))
1663 return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
1665 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1666 *valobj_sp);
1667}
1668
1669static SyntheticChildrenFrontEnd *
1671 ValueObjectSP valobj_sp) {
1672 if (!valobj_sp)
1673 return nullptr;
1674
1675 if (IsMsvcStlMapLike(*valobj_sp))
1678 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1679}
1680
1681static SyntheticChildrenFrontEnd *
1683 ValueObjectSP valobj_sp) {
1684 if (!valobj_sp)
1685 return nullptr;
1686
1687 if (IsMsvcStlDeque(*valobj_sp))
1688 return MsvcStlDequeSyntheticFrontEndCreator(children, valobj_sp);
1690 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1691}
1692
1693static SyntheticChildrenFrontEnd *
1695 ValueObjectSP valobj_sp) {
1696 if (!valobj_sp)
1697 return nullptr;
1698
1699 if (IsMsvcStlSpan(*valobj_sp))
1700 return MsvcStlSpanSyntheticFrontEndCreator(children, valobj_sp);
1701 return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
1702}
1703
1704static bool
1706 const TypeSummaryOptions &options) {
1707 if (IsMsvcStlOrdering(valobj))
1708 return MsvcStlPartialOrderingSummaryProvider(valobj, stream, options);
1709 return LibStdcppPartialOrderingSummaryProvider(valobj, stream, options);
1710}
1711
1712static bool
1714 const TypeSummaryOptions &options) {
1715 if (IsMsvcStlOrdering(valobj))
1716 return MsvcStlWeakOrderingSummaryProvider(valobj, stream, options);
1717 return LibStdcppWeakOrderingSummaryProvider(valobj, stream, options);
1718}
1719
1720static bool
1722 const TypeSummaryOptions &options) {
1723 if (IsMsvcStlOrdering(valobj))
1724 return MsvcStlStrongOrderingSummaryProvider(valobj, stream, options);
1725 return LibStdcppStrongOrderingSummaryProvider(valobj, stream, options);
1726}
1727
1728static SyntheticChildrenFrontEnd *
1730 ValueObjectSP valobj_sp) {
1731 if (!valobj_sp)
1732 return nullptr;
1733
1734 if (IsMsvcStlBitset(*valobj_sp))
1735 return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
1736 return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
1737}
1738
1739static SyntheticChildrenFrontEnd *
1741 lldb::ValueObjectSP valobj_sp) {
1742 if (!valobj_sp)
1743 return nullptr;
1744 if (IsMsvcStlExpected(*valobj_sp))
1745 return MsvcStlExpectedSyntheticFrontEndCreator(children, valobj_sp);
1746 return nullptr;
1747}
1748
1750 const TypeSummaryOptions &options) {
1751 if (IsMsvcStlExpected(valobj))
1752 return MsvcStlExpectedSummaryProvider(valobj, stream, options);
1753 return false;
1754}
1755
1756static SyntheticChildrenFrontEnd *
1758 lldb::ValueObjectSP valobj_sp) {
1759 if (!valobj_sp)
1760 return nullptr;
1761 if (IsMsvcStlValarray(*valobj_sp))
1762 return MsvcStlValarraySyntheticFrontEndCreator(children, valobj_sp);
1763 return nullptr;
1764}
1765
1767 const TypeSummaryOptions &options) {
1768 if (!IsMsvcStlValarray(valobj))
1769 return false;
1770 return ContainerSizeSummaryProvider(valobj, stream, options);
1771}
1772
1773static bool
1775 const TypeSummaryOptions &options) {
1776 if (IsMsvcStlSourceLocation(valobj))
1777 return MsvcStlSourceLocationSummaryProvider(valobj, stream, options);
1778 return LibStdcppSourceLocationSummaryProvider(valobj, stream, options);
1779}
1780
1781/// Load formatters that are formatting types from more than one STL
1783 if (!cpp_category_sp)
1784 return;
1785
1786 TypeSummaryImpl::Flags stl_summary_flags;
1787 stl_summary_flags.SetCascades(true)
1788 .SetSkipPointers(false)
1789 .SetSkipReferences(false)
1790 .SetDontShowChildren(true)
1791 .SetDontShowValue(false)
1793 .SetHideItemNames(false);
1794 SyntheticChildren::Flags stl_synth_flags;
1795 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1796 false);
1797
1799
1801 cpp_category_sp, "std::string", "char",
1802 std::make_shared<CXXFunctionSummaryFormat>(
1803 stl_summary_flags,
1804 [](ValueObject &valobj, Stream &stream,
1805 const TypeSummaryOptions &options) {
1806 if (IsMsvcStlStringType(valobj))
1808 valobj, stream, options);
1809 return LibStdcppStringSummaryProvider(valobj, stream, options);
1810 },
1811 "MSVC STL/libstdc++ std::string summary provider"));
1813 cpp_category_sp, "std::wstring", "wchar_t",
1814 std::make_shared<CXXFunctionSummaryFormat>(
1815 stl_summary_flags,
1816 [](ValueObject &valobj, Stream &stream,
1817 const TypeSummaryOptions &options) {
1818 if (IsMsvcStlStringType(valobj))
1819 return MsvcStlWStringSummaryProvider(valobj, stream, options);
1820 return LibStdcppStringSummaryProvider(valobj, stream, options);
1821 },
1822 "MSVC STL/libstdc++ std::wstring summary provider"));
1823
1825 cpp_category_sp, "std::string_view", "char",
1826 std::make_shared<CXXFunctionSummaryFormat>(
1827 stl_summary_flags,
1828 [](ValueObject &valobj, Stream &stream,
1829 const TypeSummaryOptions &options) {
1830 if (IsMsvcStlStringViewType(valobj))
1832 valobj, stream, options);
1834 valobj, stream, options);
1835 },
1836 "MSVC STL/libstdc++ std::string_view summary provider"));
1838 cpp_category_sp, "std::u8string_view", "char8_t",
1839 std::make_shared<CXXFunctionSummaryFormat>(
1840 stl_summary_flags,
1841 [](ValueObject &valobj, Stream &stream,
1842 const TypeSummaryOptions &options) {
1843 if (IsMsvcStlStringViewType(valobj))
1845 valobj, stream, options);
1847 valobj, stream, options);
1848 },
1849 "MSVC STL/libstdc++ std::u8string_view summary provider"));
1851 cpp_category_sp, "std::u16string_view", "char16_t",
1852 std::make_shared<CXXFunctionSummaryFormat>(
1853 stl_summary_flags,
1854 [](ValueObject &valobj, Stream &stream,
1855 const TypeSummaryOptions &options) {
1856 if (IsMsvcStlStringViewType(valobj))
1858 valobj, stream, options);
1860 valobj, stream, options);
1861 },
1862 "MSVC STL/libstdc++ std::u16string_view summary provider"));
1864 cpp_category_sp, "std::u32string_view", "char32_t",
1865 std::make_shared<CXXFunctionSummaryFormat>(
1866 stl_summary_flags,
1867 [](ValueObject &valobj, Stream &stream,
1868 const TypeSummaryOptions &options) {
1869 if (IsMsvcStlStringViewType(valobj))
1871 valobj, stream, options);
1873 valobj, stream, options);
1874 },
1875 "MSVC STL/libstdc++ std::u32string_view summary provider"));
1877 cpp_category_sp, "std::wstring_view", "wchar_t",
1878 std::make_shared<CXXFunctionSummaryFormat>(
1879 stl_summary_flags,
1880 [](ValueObject &valobj, Stream &stream,
1881 const TypeSummaryOptions &options) {
1882 if (IsMsvcStlStringViewType(valobj))
1883 return MsvcStlWStringViewSummaryProvider(valobj, stream, options);
1884 return LibStdcppWStringViewSummaryProvider(valobj, stream, options);
1885 },
1886 "MSVC STL/libstdc++ std::wstring_view summary provider"));
1887
1888 // NOTE: it is loaded as a common formatter because the libc++ version is not
1889 // in the `__1` namespace, hence we need to dispatch based on the class
1890 // layout.
1891 AddCXXSynthetic(cpp_category_sp,
1893 "std::initializer_list synthetic children",
1894 "^std::initializer_list<.+>$", stl_synth_flags, true);
1895
1897 "MSVC STL/libstdc++ std::filesystem::path summary provider",
1898 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags, true);
1899
1901 "MSVC STL/libstdc++ std::source_location summary provider",
1902 "std::source_location", stl_summary_flags);
1903
1904 stl_summary_flags.SetDontShowChildren(false);
1905 stl_summary_flags.SetSkipPointers(false);
1906
1908 "std::shared_ptr synthetic children",
1909 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1911 "std::weak_ptr synthetic children",
1912 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1914 "std::unique_ptr synthetic children",
1915 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags, true);
1917 "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$",
1918 stl_synth_flags, true);
1920 "std::list synthetic children", "^std::list<.+>(( )?&)?$",
1921 stl_synth_flags, true);
1923 "std::forward_list synthetic children",
1924 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
1926 "std::variant synthetic children", "^std::variant<.*>$",
1927 stl_synth_flags, true);
1929 "std::unordered container synthetic children",
1930 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
1931 true);
1932
1933 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1934 stl_deref_flags.SetFrontEndWantsDereference();
1936 "std::optional synthetic children",
1937 "^std::optional<.+>(( )?&)?$", stl_deref_flags, true);
1939 "std::deque container synthetic children",
1940 "^std::deque<.+>(( )?&)?$", stl_deref_flags, true);
1942 "std::span container synthetic children", "^std::span<.+>$",
1943 stl_deref_flags, true);
1944
1946 "std::(multi)?map/set synthetic children",
1947 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
1948 true);
1950 "std::bitset synthetic children", "^std::bitset<.+>(( )?&)?$",
1951 stl_deref_flags, true);
1952
1954 "std::initializer_list summary provider",
1955 "^std::initializer_list<.+>$", stl_summary_flags, true);
1957 "MSVC STL/libstdc++ std::shared_ptr summary provider",
1958 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1960 "MSVC STL/libstdc++ std::weak_ptr summary provider",
1961 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1963 "MSVC STL/libstdc++ std::unique_ptr summary provider",
1964 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1966 "MSVC STL/libstdc++ std::tuple summary provider",
1967 "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true);
1969 "MSVC/libstdc++ std::vector summary provider",
1970 "^std::vector<.+>(( )?&)?$", stl_summary_flags, true);
1972 "MSVC/libstdc++ std::vector synthetic provider",
1973 "^std::vector<.+>(( )?&)?$", stl_synth_flags, true);
1975 "MSVC STL/libstdc++ std::list summary provider",
1976 "^std::list<.+>(( )?&)?$", stl_summary_flags, true);
1977 cpp_category_sp->AddTypeSummary(
1978 "^std::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1980 stl_summary_flags,
1981 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1983 "MSVC STL/libstd++ std::optional summary provider",
1984 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
1986 "MSVC STL/libstdc++ std::variant summary provider",
1987 "^std::variant<.*>$", stl_summary_flags, true);
1989 "MSVC STL/libstdc++ std unordered container summary provider",
1990 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
1991 true);
1993 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
1994 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
1995 true);
1997 "MSVC STL/libstd++ std::deque summary provider",
1998 "^std::deque<.+>(( )?&)?$", stl_summary_flags, true);
2000 "MSVC STL/libstd++ std::span summary provider",
2001 "^std::span<.+>$", stl_summary_flags, true);
2003 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2004 "std::partial_ordering",
2005 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2007 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2008 "std::weak_ordering",
2009 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2011 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2012 "std::strong_ordering",
2013 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2014
2015 // Container adaptors expose the underlying container as the standard
2016 // protected member `c` ([queue.defn], [stack.defn], [priqueue.overview]).
2018 "std::queue synthetic children", "^std::queue<.+>(( )?&)?$",
2019 stl_synth_flags, true);
2021 "std::stack synthetic children", "^std::stack<.+>(( )?&)?$",
2022 stl_synth_flags, true);
2024 "std::priority_queue synthetic children",
2025 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags, true);
2027 "std::queue summary provider", "^std::queue<.+>(( )?&)?$",
2028 stl_summary_flags, true);
2030 "std::stack summary provider", "^std::stack<.+>(( )?&)?$",
2031 stl_summary_flags, true);
2033 "std::priority_queue summary provider",
2034 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags, true);
2035
2037 "MSVC STL/libstdc++ std::error_code summary provider",
2038 "std::error_code", stl_summary_flags);
2040 "MSVC STL/libstdc++ std::error_condition summary provider",
2041 "std::error_condition", stl_summary_flags);
2043 "MSVC STL/libstdc++ std::error_code/error_condition "
2044 "synthetic children",
2045 "^std::error_(code|condition)$", stl_synth_flags, true);
2047 "MSVC STL/libstdc++ std::bitset summary provider",
2048 "^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
2049
2051 "MSVC STL std::expected synthetic children",
2052 "^std::expected<.+>(( )?&)?$", stl_deref_flags, true);
2054 "MSVC STL std::expected summary provider",
2055 "^std::expected<.+>(( )?&)?$", stl_summary_flags, true);
2056
2058 "MSVC STL std::valarray synthetic children",
2059 "^std::valarray<.+>(( )?&)?$", stl_deref_flags, true);
2061 "MSVC STL std::valarray summary provider",
2062 "^std::valarray<.+>(( )?&)?$", stl_summary_flags, true);
2063}
2064
2066 if (!cpp_category_sp)
2067 return;
2068
2069 TypeSummaryImpl::Flags stl_summary_flags;
2070 stl_summary_flags.SetCascades(true)
2071 .SetSkipPointers(false)
2072 .SetSkipReferences(false)
2073 .SetDontShowChildren(true)
2074 .SetDontShowValue(false)
2076 .SetHideItemNames(false);
2077 SyntheticChildren::Flags stl_synth_flags;
2078 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
2079 false);
2080
2082
2084 cpp_category_sp, "std::u8string", "char8_t",
2085 std::make_shared<CXXFunctionSummaryFormat>(
2086 stl_summary_flags,
2088 "MSVC STL std::u8string summary provider"));
2090 cpp_category_sp, "std::u16string", "char16_t",
2091 std::make_shared<CXXFunctionSummaryFormat>(
2092 stl_summary_flags,
2094 "MSVC STL std::u16string summary provider"));
2096 cpp_category_sp, "std::u32string", "char32_t",
2097 std::make_shared<CXXFunctionSummaryFormat>(
2098 stl_summary_flags,
2100 "MSVC STL std::u32string summary provider"));
2101
2102 stl_summary_flags.SetDontShowChildren(false);
2103
2105 "MSVC STL std::atomic synthetic children",
2106 "^std::atomic<.+>$", stl_synth_flags, true);
2107
2109 "MSVC STL std::atomic summary provider", "^std::atomic<.+>$",
2110 stl_summary_flags, true);
2112 "MSVC STL tree iterator synthetic children",
2113 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2114 true);
2116 "MSVC STL tree iterator summary",
2117 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2118 true);
2121 "MSVC STL vector iterator synthetic children",
2122 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags, true);
2123}
2124
2126 if (!cpp_category_sp)
2127 return;
2128
2129 TypeSummaryImpl::Flags string_flags;
2130 string_flags.SetCascades(true)
2131 .SetSkipPointers(true)
2132 .SetSkipReferences(false)
2133 .SetDontShowChildren(true)
2134 .SetDontShowValue(false)
2136 .SetHideItemNames(false);
2137
2138 TypeSummaryImpl::Flags string_array_flags;
2139 string_array_flags.SetCascades(true)
2140 .SetSkipPointers(true)
2141 .SetSkipReferences(false)
2142 .SetDontShowChildren(true)
2143 .SetDontShowValue(true)
2145 .SetHideItemNames(false);
2146
2147 AddCXXSummary(cpp_category_sp,
2149 "char8_t * summary provider", "char8_t *", string_flags);
2150 AddCXXSummary(cpp_category_sp,
2152 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
2153 string_array_flags, true);
2154
2155 AddCXXSummary(cpp_category_sp,
2157 "char16_t * summary provider", "char16_t *", string_flags);
2158 AddCXXSummary(cpp_category_sp,
2160 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
2161 string_array_flags, true);
2162
2163 AddCXXSummary(cpp_category_sp,
2165 "char32_t * summary provider", "char32_t *", string_flags);
2166 AddCXXSummary(cpp_category_sp,
2168 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
2169 string_array_flags, true);
2170
2171 AddCXXSummary(cpp_category_sp,
2173 "wchar_t * summary provider", "wchar_t *", string_flags);
2174 AddCXXSummary(cpp_category_sp,
2176 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
2177 string_array_flags, true);
2178
2179 AddCXXSummary(cpp_category_sp,
2181 "unichar * summary provider", "unichar *", string_flags);
2182
2183 TypeSummaryImpl::Flags widechar_flags;
2184 widechar_flags.SetDontShowValue(true)
2185 .SetSkipPointers(true)
2186 .SetSkipReferences(false)
2187 .SetCascades(true)
2188 .SetDontShowChildren(true)
2189 .SetHideItemNames(true)
2190 .SetShowMembersOneLiner(false);
2191
2193 "char8_t summary provider", "char8_t", widechar_flags);
2194 AddCXXSummary(cpp_category_sp,
2196 "char16_t summary provider", "char16_t", widechar_flags);
2197 AddCXXSummary(cpp_category_sp,
2199 "char32_t summary provider", "char32_t", widechar_flags);
2201 "wchar_t summary provider", "wchar_t", widechar_flags);
2202
2203 AddCXXSummary(cpp_category_sp,
2205 "unichar summary provider", "unichar", widechar_flags);
2206}
2207
2208std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
2209 class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
2210 public:
2211 CompilerType AdjustForInclusion(CompilerType &candidate) override {
2212 LanguageType lang_type(candidate.GetMinimumLanguage());
2213 if (!Language::LanguageIsC(lang_type) &&
2215 return CompilerType();
2216 if (candidate.IsTypedefType())
2217 return candidate.GetTypedefedType();
2218 return candidate;
2219 }
2220 };
2221
2222 return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
2223}
2224
2226 static llvm::once_flag g_initialize;
2227 static TypeCategoryImplSP g_category;
2228
2229 llvm::call_once(g_initialize, [this]() -> void {
2231 g_category);
2232 if (g_category) {
2233 // NOTE: the libstdcpp formatters are loaded after libcxx formatters
2234 // because we don't want to the libcxx formatters to match the potential
2235 // `__debug` inline namespace that libstdcpp may use.
2236 // LLDB prioritizes the last loaded matching formatter.
2237 LoadLibCxxFormatters(g_category);
2238 LoadLibStdcppFormatters(g_category);
2239 LoadMsvcStlFormatters(g_category);
2240 LoadCommonStlFormatters(g_category);
2241 LoadSystemFormatters(g_category);
2242 }
2243 });
2244 return g_category;
2245}
2246
2249 static llvm::once_flag g_initialize;
2250 static ConstString g_vectortypes("VectorTypes");
2252
2253 llvm::call_once(g_initialize, []() -> void {
2254 g_formatters.push_back(
2257 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2261 "Function pointer summary provider"));
2262 if (CompilerType CT = valobj.GetCompilerType();
2263 CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
2265 return formatter_sp;
2266 }
2267 return nullptr;
2268 });
2269 g_formatters.push_back(
2272 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2275 .SetCascades(true)
2276 .SetDontShowChildren(true)
2277 .SetHideItemNames(true)
2278 .SetShowMembersOneLiner(true)
2279 .SetSkipPointers(true)
2280 .SetSkipReferences(false),
2282 "vector_type pointer summary provider"));
2283 if (valobj.GetCompilerType().IsVectorType()) {
2284 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2285 return formatter_sp;
2286 }
2287 return nullptr;
2288 });
2289 g_formatters.push_back(
2292 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2295 .SetCascades(true)
2296 .SetDontShowChildren(true)
2297 .SetHideItemNames(true)
2298 .SetShowMembersOneLiner(true)
2299 .SetSkipPointers(true)
2300 .SetSkipReferences(false),
2302 "block pointer summary provider"));
2303 if (valobj.GetCompilerType().IsBlockPointerType()) {
2304 return formatter_sp;
2305 }
2306 return nullptr;
2307 });
2308 });
2309
2310 return g_formatters;
2311}
2312
2315 static llvm::once_flag g_initialize;
2316 static ConstString g_vectortypes("VectorTypes");
2318
2319 llvm::call_once(g_initialize, []() -> void {
2320 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2323 static CXXSyntheticChildren::SharedPointer formatter_sp(
2326 .SetCascades(true)
2327 .SetSkipPointers(true)
2328 .SetSkipReferences(true)
2329 .SetNonCacheable(true),
2330 "vector_type synthetic children",
2332 if (valobj.GetCompilerType().IsVectorType()) {
2333 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2334 return formatter_sp;
2335 }
2336 return nullptr;
2337 });
2338 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2341 static CXXSyntheticChildren::SharedPointer formatter_sp(
2344 .SetCascades(true)
2345 .SetSkipPointers(true)
2346 .SetSkipReferences(true)
2347 .SetNonCacheable(true),
2348 "block pointer synthetic children",
2350 if (valobj.GetCompilerType().IsBlockPointerType()) {
2351 return formatter_sp;
2352 }
2353 return nullptr;
2354 });
2355 });
2356
2357 return g_formatters;
2358}
2359
2362 !valobj.IsPointerType())
2363 return false;
2364 bool canReadValue = true;
2365 bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
2366 return canReadValue && isZero;
2367}
2368
2369bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
2370 const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",
2371 ".h", ".hh", ".hpp", ".hxx", ".h++"};
2372 for (auto suffix : suffixes) {
2373 if (file_path.ends_with_insensitive(suffix))
2374 return true;
2375 }
2376
2377 // Check if we're in a STL path (where the files usually have no extension
2378 // that we could check for.
2379 return file_path.contains("/usr/include/c++/");
2380}
2381
2383 assert(sc.function);
2384
2385 if (sc.block)
2386 if (Block *inline_block = sc.block->GetContainingInlinedBlock())
2387 return inline_block->GetBlockVariableList(true);
2388
2389 return sc.function->GetBlock(true).GetBlockVariableList(true);
2390}
2391
2393 const ExecutionContext *exe_ctx,
2394 const SymbolContext &sc) {
2395 assert(sc.function);
2396
2397 ExecutionContextScope *exe_scope =
2398 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2399
2400 const char *cstr = sc.GetPossiblyInlinedFunctionName()
2402 .AsCString(nullptr);
2403 if (!cstr)
2404 return false;
2405
2406 VariableList args;
2407 if (auto variable_list_sp = GetFunctionVariableList(sc))
2409 args);
2410
2411 if (args.GetSize() > 0)
2412 return PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args);
2413
2414 // FIXME: can we just unconditionally call PrettyPrintFunctionNameWithArgs?
2415 // It should be able to handle the "no arguments" case.
2416 s.PutCString(cstr);
2417
2418 return true;
2419}
2420
2422 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2423 FunctionNameRepresentation representation, Stream &s) {
2424 switch (representation) {
2426 // Print the function name with arguments in it
2427 if (sc.function)
2428 return PrintFunctionNameWithArgs(s, exe_ctx, sc);
2429
2430 if (!sc.symbol)
2431 return false;
2432
2433 const char *cstr = sc.symbol->GetName().AsCString(nullptr);
2434 if (!cstr)
2435 return false;
2436
2437 s.PutCString(cstr);
2438
2439 return true;
2440 }
2443 return false;
2444 }
2445 llvm_unreachable("Fully covered switch above");
2446}
2447
2449 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2451 switch (type) {
2453 auto scope_or_err = ::GetDemangledScope(sc);
2454 if (!scope_or_err) {
2456 GetLog(LLDBLog::Language), scope_or_err.takeError(),
2457 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2458 return false;
2459 }
2460
2461 s << *scope_or_err;
2462
2463 return true;
2464 }
2465
2467 auto name_or_err = ::GetDemangledBasename(sc);
2468 if (!name_or_err) {
2470 GetLog(LLDBLog::Language), name_or_err.takeError(),
2471 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2472 return false;
2473 }
2474
2475 s << *name_or_err;
2476
2477 return true;
2478 }
2479
2481 auto template_args_or_err = ::GetDemangledTemplateArguments(sc);
2482 if (!template_args_or_err) {
2484 template_args_or_err.takeError(),
2485 "Failed to handle ${{function.template-arguments}} "
2486 "frame-format variable: {0}");
2487 return false;
2488 }
2489
2490 s << *template_args_or_err;
2491
2492 return true;
2493 }
2494
2496 // This ensures we print the arguments even when no debug-info is available.
2497 //
2498 // FIXME: we should have a Entry::Type::FunctionArguments and
2499 // use it in the plugin.cplusplus.display.function-name-format
2500 // once we have a "fallback operator" in the frame-format language.
2501 if (!sc.function && sc.symbol)
2502 return PrintDemangledArgumentList(s, sc);
2503
2504 VariableList args;
2505 if (auto variable_list_sp = GetFunctionVariableList(sc))
2507 args);
2508
2509 ExecutionContextScope *exe_scope =
2510 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2511
2512 s << '(';
2514 s << ')';
2515
2516 return true;
2517 }
2519 auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc);
2520 if (!return_rhs_or_err) {
2521 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(),
2522 "Failed to handle ${{function.return-right}} frame-format "
2523 "variable: {0}");
2524 return false;
2525 }
2526
2527 s << *return_rhs_or_err;
2528
2529 return true;
2530 }
2532 auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc);
2533 if (!return_lhs_or_err) {
2534 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(),
2535 "Failed to handle ${{function.return-left}} frame-format "
2536 "variable: {0}");
2537 return false;
2538 }
2539
2540 s << *return_lhs_or_err;
2541
2542 return true;
2543 }
2545 auto quals_or_err = ::GetDemangledFunctionQualifiers(sc);
2546 if (!quals_or_err) {
2547 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(),
2548 "Failed to handle ${{function.qualifiers}} frame-format "
2549 "variable: {0}");
2550 return false;
2551 }
2552
2553 s << *quals_or_err;
2554
2555 return true;
2556 }
2558 auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
2559 if (!suffix_or_err) {
2561 GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2562 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2563 return false;
2564 }
2565
2566 s << *suffix_or_err;
2567
2568 return true;
2569 }
2570 default:
2571 return false;
2572 }
2573}
2574
2575namespace {
2576class NodeAllocator {
2577 llvm::BumpPtrAllocator Alloc;
2578
2579public:
2580 void reset() { Alloc.Reset(); }
2581
2582 template <typename T, typename... Args> T *makeNode(Args &&...args) {
2583 return new (Alloc.Allocate(sizeof(T), alignof(T)))
2584 T(std::forward<Args>(args)...);
2585 }
2586
2587 void *allocateNodeArray(size_t sz) {
2588 return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
2589 alignof(llvm::itanium_demangle::Node *));
2590 }
2591};
2592
2593template <typename Derived>
2594class ManglingSubstitutor
2595 : public llvm::itanium_demangle::AbstractManglingParser<Derived,
2596 NodeAllocator> {
2597 using Base =
2598 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2599
2600public:
2601 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2602
2603 template <typename... Ts>
2604 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2605 Ts &&...Vals) {
2606 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2607 return substituteImpl(Mangled);
2608 }
2609
2610protected:
2611 void reset(llvm::StringRef Mangled) {
2612 Base::reset(Mangled.begin(), Mangled.end());
2613 Written = Mangled.begin();
2614 Result.clear();
2615 Substituted = false;
2616 }
2617
2618 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2619 if (this->parse() == nullptr)
2620 return llvm::createStringErrorV("failed to substitute mangling in '{0}'",
2621 Mangled);
2622
2623 if (!Substituted)
2624 return ConstString();
2625
2626 // Append any trailing unmodified input.
2627 appendUnchangedInput();
2628 return ConstString(Result);
2629 }
2630
2631 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2632 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2633 return;
2634
2635 // We found a match. Append unmodified input up to this point.
2636 appendUnchangedInput();
2637
2638 // And then perform the replacement.
2639 Result += To;
2640 Written += From.size();
2641 Substituted = true;
2642 }
2643
2644private:
2645 /// Input character until which we have constructed the respective output
2646 /// already.
2647 const char *Written = "";
2648
2649 llvm::SmallString<128> Result;
2650
2651 /// Whether we have performed any substitutions.
2652 bool Substituted = false;
2653
2654 const char *currentParserPos() const { return this->First; }
2655
2656 void appendUnchangedInput() {
2657 Result +=
2658 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2659 Written = currentParserPos();
2660 }
2661};
2662
2663/// Given a mangled function `Mangled`, replace all the primitive function type
2664/// arguments of `Search` with type `Replace`.
2665class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
2666 llvm::StringRef Search;
2667 llvm::StringRef Replace;
2668
2669public:
2670 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2671 llvm::StringRef Replace) {
2672 ManglingSubstitutor::reset(Mangled);
2673 this->Search = Search;
2674 this->Replace = Replace;
2675 }
2676
2677 llvm::itanium_demangle::Node *parseType() {
2678 trySubstitute(Search, Replace);
2679 return ManglingSubstitutor::parseType();
2680 }
2681};
2682
2683class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
2684 llvm::StringRef Search;
2685 llvm::StringRef Replace;
2686
2687public:
2688 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2689 llvm::StringRef Replace) {
2690 ManglingSubstitutor::reset(Mangled);
2691 this->Search = Search;
2692 this->Replace = Replace;
2693 }
2694
2695 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2696
2697 llvm::itanium_demangle::Node *
2698 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
2699 if (!Search.empty() && !Replace.empty()) {
2700 trySubstitute(Search, Replace);
2701 } else {
2702 trySubstitute("D1", "D2");
2703 trySubstitute("C1", "C2");
2704 }
2705 return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
2706 }
2707};
2708} // namespace
2709
2710llvm::Expected<ConstString>
2712 llvm::StringRef subst_from,
2713 llvm::StringRef subst_to) {
2714 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2715}
2716
2718 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2719 llvm::StringRef subst_to) {
2720 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2721}
2722
2723llvm::Expected<ConstString>
2725 llvm::StringRef mangled_name) {
2726 return CtorDtorSubstitutor().substitute(mangled_name);
2727}
2728
2729#define LLDB_PROPERTIES_language_cplusplus
2730#include "LanguageCPlusPlusProperties.inc"
2731
2732enum {
2733#define LLDB_PROPERTIES_language_cplusplus
2734#include "LanguageCPlusPlusPropertiesEnum.inc"
2735};
2736
2737namespace {
2738class PluginProperties : public Properties {
2739public:
2740 static llvm::StringRef GetSettingName() { return "display"; }
2741
2742 PluginProperties() {
2743 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2744 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2745 }
2746
2747 FormatEntity::Entry GetFunctionNameFormat() const {
2748 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2749 ePropertyFunctionNameFormat, {});
2750 }
2751};
2752} // namespace
2753
2754static PluginProperties &GetGlobalPluginProperties() {
2755 static PluginProperties g_settings;
2756 return g_settings;
2757}
2758
2762
2765 debugger, PluginProperties::GetSettingName())) {
2767 debugger, GetGlobalPluginProperties().GetValueProperties(),
2768 "Properties for the CPlusPlus language plug-in.",
2769 /*is_global_property=*/true);
2770 }
2771}
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 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:100
"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:403
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:39
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:174
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:284
const DemangledNameInfo * GetDemangledInfo() const
Retrieve DemangledNameInfo of the demangled name held by this object.
Definition Mangled.cpp:288
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:369
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:43
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.