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 <cstdlib>
13#include <cstring>
14
15#include <functional>
16#include <memory>
17#include <mutex>
18#include <set>
19
20#include "llvm/ADT/StringRef.h"
21#include "llvm/Demangle/Demangle.h"
22#include "llvm/Demangle/ItaniumDemangle.h"
23#include "llvm/Support/ErrorExtras.h"
24
26#include "lldb/Core/Mangled.h"
27#include "lldb/Core/Module.h"
41#include "lldb/Utility/Log.h"
44
45#include "BlockPointer.h"
46#include "CPlusPlusNameParser.h"
47#include "Coroutines.h"
48#include "CxxStringTypes.h"
49#include "Generic.h"
50#include "LibCxx.h"
51#include "LibCxxAtomic.h"
52#include "LibCxxVariant.h"
53#include "LibStdcpp.h"
55#include "MsvcStl.h"
57
58using namespace lldb;
59using namespace lldb_private;
60using namespace lldb_private::formatters;
61
63
64static Mangled::ManglingScheme g_itanium_scheme = Mangled::eManglingSchemeNone;
65static Mangled::ManglingScheme g_msvc_scheme = Mangled::eManglingSchemeNone;
66
67static bool IsCPlusPlusManglingScheme(Mangled::ManglingScheme scheme) {
68 // A scheme that couldn't be registered, because the registry was full, is
69 // eManglingSchemeNone.
70 return scheme != Mangled::eManglingSchemeNone &&
71 (scheme == g_itanium_scheme || scheme == g_msvc_scheme);
72}
73
83
89
90std::unique_ptr<Language::MethodName>
91CPlusPlusLanguage::GetMethodName(llvm::StringRef full_name) const {
92 std::unique_ptr<CxxMethodName> cpp_method =
93 std::make_unique<CxxMethodName>(full_name.str());
94 cpp_method->IsValid();
95 return cpp_method;
96}
97
98std::pair<FunctionNameType, std::optional<ConstString>>
101 return {eFunctionNameTypeFull, std::nullopt};
102
103 FunctionNameType func_name_type = eFunctionNameTypeNone;
104 CxxMethodName method(name.GetStringRef().str());
105 llvm::StringRef basename = method.GetBasename();
106 if (basename.empty()) {
107 llvm::StringRef context;
108 func_name_type |=
109 (ExtractContextAndIdentifier(name.GetStringRef(), context, basename)
110 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
111 : eFunctionNameTypeFull);
112 } else {
113 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
114 }
115
116 if (!method.GetQualifiers().empty()) {
117 // There is a 'const' or other qualifier following the end of the function
118 // parens, this can't be a eFunctionNameTypeBase.
119 func_name_type &= ~(eFunctionNameTypeBase);
120 }
121
122 if (basename.empty())
123 return {func_name_type, std::nullopt};
124 else
125 return {func_name_type, ConstString(basename)};
126}
127
132
133static char *GetMSVCDemangledStr(llvm::StringRef M) {
134 char *demangled_cstr = llvm::microsoftDemangle(
135 M, nullptr, nullptr,
136 llvm::MSDemangleFlags(
137 llvm::MSDF_NoAccessSpecifier | llvm::MSDF_NoCallingConvention |
138 llvm::MSDF_NoMemberType | llvm::MSDF_NoVariableType));
139
140 if (Log *log = GetLog(LLDBLog::Demangle)) {
141 if (demangled_cstr && demangled_cstr[0])
142 LLDB_LOGF(log, "demangled msvc: %s -> \"%s\"", M.data(), demangled_cstr);
143 else
144 LLDB_LOGF(log, "demangled msvc: %s -> error", M.data());
145 }
146
147 return demangled_cstr;
148}
149
150static std::pair<char *, DemangledNameInfo>
152 char *demangled_cstr = nullptr;
153
155 llvm::ItaniumPartialDemangler ipd;
156 bool err = ipd.partialDemangle(M);
157 if (!err) {
158 // Default buffer and size (OutputBuffer will realloc in case it's too
159 // small).
160 size_t demangled_size = 80;
161 demangled_cstr = static_cast<char *>(std::malloc(80));
162
163 TrackingOutputBuffer OB(demangled_cstr, demangled_size);
164 demangled_cstr = ipd.finishDemangle(&OB);
165 info = std::move(OB.NameInfo);
166
167 assert(demangled_cstr &&
168 "finishDemangle must always succeed if partialDemangle did");
169 assert(demangled_cstr[OB.getCurrentPosition() - 1] == '\0' &&
170 "Expected demangled_size to return length including trailing null");
171 }
172
173 if (Log *log = GetLog(LLDBLog::Demangle)) {
174 if (demangled_cstr)
175 LLDB_LOGF(log, "demangled itanium: %s -> \"%s\"", M, demangled_cstr);
176 else
177 LLDB_LOGF(log, "demangled itanium: %s -> error: failed to demangle", M);
178
179 if (!info.hasBasename())
180 LLDB_LOGF(log,
181 "demangled itanium: %s -> error: failed to retrieve name info",
182 M);
183 }
184
185 return {demangled_cstr, std::move(info)};
186}
187
191 const DemangleOptions &options) const {
192 DemangledName demangled;
193 if (scheme == g_itanium_scheme) {
194 auto [demangled_cstr, info] = GetItaniumDemangledStr(mangled.GetCString());
195 if (demangled_cstr) {
196 demangled.name = demangled_cstr;
197 std::free(demangled_cstr);
198 }
199 if (options.want_info)
200 demangled.info = std::move(info);
201 } else if (scheme == g_msvc_scheme) {
202 if (char *demangled_cstr = GetMSVCDemangledStr(mangled.GetStringRef())) {
203 demangled.name = demangled_cstr;
204 std::free(demangled_cstr);
205 }
206 }
207 return demangled;
208}
209
210/// Returns true for the Itanium names that aren't worth indexing as functions.
211static bool SkipItaniumName(llvm::StringRef mangled) {
212 if (mangled.size() < 3 || !mangled.starts_with("_Z"))
213 return true;
214
215 // Avoid the following types of symbols in the index.
216 switch (mangled[2]) {
217 case 'G': // guard variables
218 case 'T': // virtual tables, VTT structures, typeinfo structures + names
219 case 'Z': // named local entities (if we eventually handle
220 // eSymbolTypeData, we will want this back)
221 return true;
222
223 default:
224 return false;
225 }
226}
227
228namespace {
229/// Parses Itanium or MSVC mangled function names. Their mangling doesn't tell
230/// whether a declaration context is a class or a namespace.
231class CPlusPlusMangledNameParser : public Language::MangledNameParser {
232public:
233 explicit CPlusPlusMangledNameParser(Mangled::ManglingScheme scheme)
234 : m_scheme(scheme) {}
235
236 std::optional<Mangled::FunctionNameParts>
237 Parse(const Mangled &mangled) override {
238 if (!ParseRichManglingInfo(mangled))
239 return std::nullopt;
240
241 Mangled::FunctionNameParts parts;
242 llvm::StringRef base_name = m_rmc.ParseFunctionBaseName();
243 if (base_name.empty())
244 return parts;
245
246 // Parsing the context reuses the buffer that base_name points into.
247 parts.basename = ConstString(base_name);
248 llvm::StringRef decl_context = m_rmc.ParseFunctionDeclContextName();
249 if (decl_context.empty()) {
250 parts.kind = Mangled::FunctionNameKind::TopLevel;
251 return parts;
252 }
253
254 parts.decl_context = ConstString(decl_context);
255 parts.kind = m_rmc.IsCtorOrDtor()
256 ? Mangled::FunctionNameKind::ConstructorOrDestructor
257 : Mangled::FunctionNameKind::Unknown;
258 return parts;
259 }
260
261private:
262 bool ParseRichManglingInfo(const Mangled &mangled) {
263 ConstString mangled_name = mangled.GetMangledName();
264 if (m_scheme == g_itanium_scheme)
265 return !SkipItaniumName(mangled_name) &&
266 m_rmc.FromItaniumName(mangled_name);
267
268 // There is no rich mangling info for MSVC names, so parse the demangled
269 // name with CPlusPlusLanguage::CxxMethodName instead.
270 ConstString demangled = mangled.GetDemangledName();
271 return !demangled.IsEmpty() && m_rmc.FromCxxMethodName(demangled);
272 }
273
275 /// Instantiation of the demangler is expensive, so better use a single one
276 /// for all entries during batch processing.
277 RichManglingContext m_rmc;
278};
279} // namespace
280
281std::unique_ptr<Language::MangledNameParser>
283 Mangled::ManglingScheme scheme) const {
284 if (!IsCPlusPlusManglingScheme(scheme))
285 return nullptr;
286 return std::make_unique<CPlusPlusMangledNameParser>(scheme);
287}
288
290 Mangled mangled) const {
291 const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
292 ConstString demangled_name = mangled.GetDemangledName();
293 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
294 if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
295 (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
296 // typeinfo structure, and typeinfo
297 // mangled_name
298 mangled_name_cstr[2] != 'G' && // avoid guard variables
299 mangled_name_cstr[2] != 'Z')) // named local entities (if we
300 // eventually handle eSymbolTypeData,
301 // we will want this back)
302 {
303 CxxMethodName cxx_method(demangled_name.GetStringRef().str());
304 if (!cxx_method.GetBasename().empty()) {
305 std::string shortname;
306 if (!cxx_method.GetContext().empty())
307 shortname = cxx_method.GetContext().str() + "::";
308 shortname += cxx_method.GetBasename().str();
309 return ConstString(shortname);
310 }
311 }
312 }
313 if (demangled_name)
314 return demangled_name;
315 return mangled.GetMangledName();
316}
317
318// Static Functions
319
321 // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
322 if (Language::LanguageIsCPlusPlus(language) &&
323 language != eLanguageTypeObjC_plus_plus)
324 return new CPlusPlusLanguage();
325 return nullptr;
326}
327
328static bool ReverseFindMatchingChars(const llvm::StringRef &s,
329 const llvm::StringRef &left_right_chars,
330 size_t &left_pos, size_t &right_pos,
331 size_t pos = llvm::StringRef::npos) {
332 assert(left_right_chars.size() == 2);
333 left_pos = llvm::StringRef::npos;
334 const char left_char = left_right_chars[0];
335 const char right_char = left_right_chars[1];
336 pos = s.find_last_of(left_right_chars, pos);
337 if (pos == llvm::StringRef::npos || s[pos] == left_char)
338 return false;
339 right_pos = pos;
340 uint32_t depth = 1;
341 while (pos > 0 && depth > 0) {
342 pos = s.find_last_of(left_right_chars, pos);
343 if (pos == llvm::StringRef::npos)
344 return false;
345 if (s[pos] == left_char) {
346 if (--depth == 0) {
347 left_pos = pos;
348 return left_pos < right_pos;
349 }
350 } else if (s[pos] == right_char) {
351 ++depth;
352 }
353 }
354 return false;
355}
356
357static bool IsTrivialBasename(const llvm::StringRef &basename) {
358 // Check that the basename matches with the following regular expression
359 // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
360 // because it is significantly more efficient then using the general purpose
361 // regular expression library.
362 size_t idx = 0;
363 if (basename.starts_with('~'))
364 idx = 1;
365
366 if (basename.size() <= idx)
367 return false; // Empty string or "~"
368
369 if (!std::isalpha(static_cast<unsigned char>(basename[idx])) &&
370 basename[idx] != '_')
371 return false; // First character (after removing the possible '~'') isn't in
372 // [A-Za-z_]
373
374 // Read all characters matching [A-Za-z_0-9]
375 ++idx;
376 while (idx < basename.size()) {
377 if (!std::isalnum(static_cast<unsigned char>(basename[idx])) &&
378 basename[idx] != '_')
379 break;
380 ++idx;
381 }
382
383 // We processed all characters. It is a vaild basename.
384 return idx == basename.size();
385}
386
387/// A context is trivial if an only if it matches this pattern.
388/// "^\s*([A-Za-z_:]*)\s*$". for example function `foo::bar::func()`
389/// has a trivial context but. but `foo<int>::bar::func()` doesn't.
390static bool IsTrivialContext(llvm::StringRef context) {
391 // remove trailing or leading whitespace.
392 context = context.trim();
393
394 const auto iter = context.find_if_not([](char current) {
395 return std::isalnum(static_cast<unsigned char>(current)) ||
396 current == '_' || current == ':';
397 });
398 return iter == llvm::StringRef::npos;
399}
400
401/// Writes out the function name in 'full_name' to 'out_stream'
402/// but replaces each argument type with the variable name
403/// and the corresponding pretty-printed value
405 llvm::StringRef full_name,
406 ExecutionContextScope *exe_scope,
407 VariableList const &args) {
408 CPlusPlusLanguage::CxxMethodName cpp_method{full_name.str()};
409
410 if (!cpp_method.IsValid())
411 return false;
412
413 llvm::StringRef return_type = cpp_method.GetReturnType();
414 if (!return_type.empty()) {
415 out_stream.PutCString(return_type);
416 out_stream.PutChar(' ');
417 }
418
419 out_stream.PutCString(cpp_method.GetScopeQualifiedName());
420 out_stream.PutChar('(');
421
422 FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
423
424 out_stream.PutChar(')');
425
426 llvm::StringRef qualifiers = cpp_method.GetQualifiers();
427 if (!qualifiers.empty()) {
428 out_stream.PutChar(' ');
429 out_stream.PutCString(qualifiers);
430 }
431
432 return true;
433}
434
436 static DemangledNameInfoCache g_cache;
437 // Pick up any changes to the size the user made since the last call.
439 .GetDemangledNameInfoCacheSize());
440 return g_cache;
441}
442
443static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
446 if (!mangled)
447 return llvm::createStringError("function does not have a mangled name");
448
449 auto demangled_name = mangled.GetDemangledName().GetStringRef();
450 if (demangled_name.empty())
451 return llvm::createStringErrorV(
452 "function '{0}' does not have a demangled name",
453 mangled.GetMangledName());
454
455 std::optional<DemangledNameInfo> info = GetDemangledInfoCache().Get(mangled);
456 if (!info)
457 return llvm::createStringErrorV(
458 "function '{0}' does not have demangled info", demangled_name);
459
460 // Function without a basename is nonsense.
461 if (!info->hasBasename())
462 return llvm::createStringErrorV(
463 "demangled info for '{0}' does not have a basename range",
464 demangled_name);
465
466 return std::make_pair(demangled_name, *info);
467}
468
469static llvm::Expected<llvm::StringRef>
471 auto info_or_err = GetAndValidateInfo(sc);
472 if (!info_or_err)
473 return info_or_err.takeError();
474
475 auto [demangled_name, info] = *info_or_err;
476
477 return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info);
478}
479
480llvm::StringRef
482 const DemangledNameInfo &info) {
483 assert(info.hasBasename());
484 return demangled.slice(info.BasenameRange.first, info.BasenameRange.second);
485}
486
487llvm::Expected<llvm::StringRef>
489 llvm::StringRef demangled, const DemangledNameInfo &info) {
490 if (!info.hasTemplateArguments())
491 return llvm::createStringErrorV(
492 "template arguments range for '{0}' is invalid", demangled);
493
494 return demangled.slice(info.TemplateArgumentsRange.first,
495 info.TemplateArgumentsRange.second);
496}
497
498static llvm::Expected<llvm::StringRef>
500 auto info_or_err = GetAndValidateInfo(sc);
501 if (!info_or_err)
502 return info_or_err.takeError();
503
504 auto [demangled_name, info] = *info_or_err;
505
506 return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info);
507}
508
509llvm::Expected<llvm::StringRef>
511 const DemangledNameInfo &info) {
512 if (info.ScopeRange.first >= demangled.size())
513 return llvm::createStringErrorV(
514 "scope range for '{0}' LHS return type is invalid", demangled);
515
516 return demangled.substr(0, info.ScopeRange.first);
517}
518
519static llvm::Expected<llvm::StringRef>
521 auto info_or_err = GetAndValidateInfo(sc);
522 if (!info_or_err)
523 return info_or_err.takeError();
524
525 auto [demangled_name, info] = *info_or_err;
526
527 return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info);
528}
529
530llvm::Expected<llvm::StringRef>
532 llvm::StringRef demangled, const DemangledNameInfo &info) {
533 if (!info.hasQualifiers())
534 return llvm::createStringErrorV("qualifiers range for '{0}' is invalid",
535 demangled);
536
537 return demangled.slice(info.QualifiersRange.first,
538 info.QualifiersRange.second);
539}
540
541static llvm::Expected<llvm::StringRef>
543 auto info_or_err = GetAndValidateInfo(sc);
544 if (!info_or_err)
545 return info_or_err.takeError();
546
547 auto [demangled_name, info] = *info_or_err;
548
550 info);
551}
552
553llvm::Expected<llvm::StringRef>
555 const DemangledNameInfo &info) {
556 if (info.QualifiersRange.first < info.ArgumentsRange.second)
557 return llvm::createStringErrorV(
558 "qualifiers range for '{0}' RHS return type is invalid", demangled);
559
560 return demangled.slice(info.ArgumentsRange.second,
561 info.QualifiersRange.first);
562}
563
564static llvm::Expected<llvm::StringRef>
566 auto info_or_err = GetAndValidateInfo(sc);
567 if (!info_or_err)
568 return info_or_err.takeError();
569
570 auto [demangled_name, info] = *info_or_err;
571
572 return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info);
573}
574
575llvm::Expected<llvm::StringRef>
576CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled,
577 const DemangledNameInfo &info) {
578 if (!info.hasScope())
579 return llvm::createStringErrorV("scope range for '{0}' is invalid",
580 demangled);
581
582 return demangled.slice(info.ScopeRange.first, info.ScopeRange.second);
583}
584
585static llvm::Expected<llvm::StringRef>
587 auto info_or_err = GetAndValidateInfo(sc);
588 if (!info_or_err)
589 return info_or_err.takeError();
590
591 auto [demangled_name, info] = *info_or_err;
592
593 return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
594}
595
596llvm::Expected<llvm::StringRef>
598 const DemangledNameInfo &info) {
599 if (!info.hasSuffix())
600 return llvm::createStringErrorV("suffix range for '{0}' is invalid",
601 demangled);
602
603 return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
604}
605
606static llvm::Expected<llvm::StringRef>
608 auto info_or_err = GetAndValidateInfo(sc);
609 if (!info_or_err)
610 return info_or_err.takeError();
611
612 auto [demangled_name, info] = *info_or_err;
613
614 return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
615}
616
617llvm::Expected<llvm::StringRef>
619 llvm::StringRef demangled, const DemangledNameInfo &info) {
620 if (!info.hasArguments())
621 return llvm::createStringErrorV(
622 "function arguments range for '{0}' is invalid", demangled);
623
624 return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second);
625}
626
628 assert(sc.symbol);
629
630 auto info_or_err = GetAndValidateInfo(sc);
631 if (!info_or_err) {
632 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(),
633 "Failed to handle ${{function.formatted-arguments}} "
634 "frame-format variable: {0}");
635 return false;
636 }
637
638 auto [demangled_name, info] = *info_or_err;
639
640 auto args_or_err =
642 if (!args_or_err) {
643 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(),
644 "Failed to handle ${{function.formatted-arguments}} "
645 "frame-format variable: {0}");
646 return false;
647 }
648
649 s << *args_or_err;
650
651 return true;
652}
653
655 // This method tries to parse simple method definitions which are presumably
656 // most comman in user programs. Definitions that can be parsed by this
657 // function don't have return types and templates in the name.
658 // A::B::C::fun(std::vector<T> &) const
659 size_t arg_start, arg_end;
660 llvm::StringRef full(m_full);
661 llvm::StringRef parens("()", 2);
662 if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
663 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
664 if (arg_end + 1 < full.size())
665 m_qualifiers = full.substr(arg_end + 1).ltrim();
666
667 if (arg_start == 0)
668 return false;
669 size_t basename_end = arg_start;
670 size_t context_start = 0;
671 size_t context_end = full.rfind(':', basename_end);
672 if (context_end == llvm::StringRef::npos)
673 m_basename = full.substr(0, basename_end);
674 else {
675 if (context_start < context_end)
676 m_context = full.substr(context_start, context_end - 1 - context_start);
677 const size_t basename_begin = context_end + 1;
678 m_basename = full.substr(basename_begin, basename_end - basename_begin);
679 }
680
682 return true;
683 }
684 // The C++ basename doesn't match our regular expressions so this can't
685 // be a valid C++ method, clear everything out and indicate an error
686 m_context = llvm::StringRef();
687 m_basename = llvm::StringRef();
688 m_arguments = llvm::StringRef();
689 m_qualifiers = llvm::StringRef();
690 m_return_type = llvm::StringRef();
691 return false;
692 }
693 return false;
694}
695
697 if (!m_parsed && !m_full.empty()) {
698 if (TrySimplifiedParse()) {
699 m_parse_error = false;
700 } else {
702 if (auto function = parser.ParseAsFunctionDefinition()) {
703 m_basename = function->name.basename;
704 m_context = function->name.context;
705 m_arguments = function->arguments;
706 m_qualifiers = function->qualifiers;
707 m_return_type = function->return_type;
708 m_parse_error = false;
709 } else {
710 m_parse_error = true;
711 }
712 }
713 if (m_context.empty()) {
714 m_scope_qualified = std::string(m_basename);
715 } else {
717 m_scope_qualified += "::";
719 }
720 m_parsed = true;
721 }
722}
723
724llvm::StringRef
726 llvm::StringRef basename = GetBasename();
727 size_t arg_start, arg_end;
728 llvm::StringRef parens("<>", 2);
729 if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
730 return basename.substr(0, arg_start);
731
732 return basename;
733}
734
736 if (!m_parsed)
737 Parse();
738
739 // If we can't parse the incoming name, then just check that it contains path.
740 if (m_parse_error)
741 return llvm::StringRef(m_full).contains(path);
742
743 llvm::StringRef identifier;
744 llvm::StringRef context;
745 const bool success =
746 CPlusPlusLanguage::ExtractContextAndIdentifier(path, context, identifier);
747 if (!success)
748 return llvm::StringRef(m_full).contains(path);
749
750 // Basename may include template arguments.
751 // E.g.,
752 // GetBaseName(): func<int>
753 // identifier : func
754 //
755 // ...but we still want to account for identifiers with template parameter
756 // lists, e.g., when users set breakpoints on template specializations.
757 //
758 // E.g.,
759 // GetBaseName(): func<uint32_t>
760 // identifier : func<int32_t*>
761 //
762 // Try to match the basename with or without template parameters.
763 if (GetBasename() != identifier &&
764 GetBasenameNoTemplateParameters() != identifier)
765 return false;
766
767 // Incoming path only had an identifier, so we match.
768 if (context.empty())
769 return true;
770 // Incoming path has context but this method does not, no match.
771 if (m_context.empty())
772 return false;
773
774 llvm::StringRef haystack = m_context;
775 if (!haystack.consume_back(context))
776 return false;
777 if (haystack.empty() || !isalnum(haystack.back()))
778 return true;
779
780 return false;
781}
782
784 ConstString demangled) const {
785 CxxMethodName demangled_name(demangled.GetStringRef().str());
786 return demangled_name.ContainsPath(path);
787}
788
790 llvm::StringRef name, llvm::StringRef &context,
791 llvm::StringRef &identifier) {
794 identifier);
795
796 CPlusPlusNameParser parser(name);
797 if (auto full_name = parser.ParseAsFullName()) {
798 identifier = full_name->basename;
799 context = full_name->context;
800 return true;
801 }
802 return false;
803}
804
806 const ConstString mangled_name) const {
807 std::vector<ConstString> alternates;
808
809 /// Get a basic set of alternative manglings for the given symbol `name`, by
810 /// making a few basic possible substitutions on basic types, storage duration
811 /// and `const`ness for the given symbol. The output parameter `alternates`
812 /// is filled with a best-guess, non-exhaustive set of different manglings
813 /// for the given name.
814
815 // Maybe we're looking for a const symbol but the debug info told us it was
816 // non-const...
817 if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
818 strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
819 std::string fixed_scratch("_ZNK");
820 fixed_scratch.append(mangled_name.GetCString() + 3);
821 alternates.push_back(ConstString(fixed_scratch));
822 }
823
824 // Maybe we're looking for a static symbol but we thought it was global...
825 if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
826 strncmp(mangled_name.GetCString(), "_ZL", 3)) {
827 std::string fixed_scratch("_ZL");
828 fixed_scratch.append(mangled_name.GetCString() + 2);
829 alternates.push_back(ConstString(fixed_scratch));
830 }
831
832 auto *log = GetLog(LLDBLog::Language);
833
834 // `char` is implementation defined as either `signed` or `unsigned`. As a
835 // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
836 // char, 'h'-unsigned char. If we're looking for symbols with a signed char
837 // parameter, try finding matches which have the general case 'c'.
838 if (auto char_fixup_or_err =
839 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "a", "c")) {
840 // LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
841 if (*char_fixup_or_err)
842 alternates.push_back(*char_fixup_or_err);
843 } else
844 LLDB_LOG_ERROR(log, char_fixup_or_err.takeError(),
845 "Failed to substitute 'char' type mangling: {0}");
846
847 // long long parameter mangling 'x', may actually just be a long 'l' argument
848 if (auto long_fixup_or_err =
849 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "x", "l")) {
850 if (*long_fixup_or_err)
851 alternates.push_back(*long_fixup_or_err);
852 } else
853 LLDB_LOG_ERROR(log, long_fixup_or_err.takeError(),
854 "Failed to substitute 'long long' type mangling: {0}");
855
856 // unsigned long long parameter mangling 'y', may actually just be unsigned
857 // long 'm' argument
858 if (auto ulong_fixup_or_err =
859 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "y", "m")) {
860 if (*ulong_fixup_or_err)
861 alternates.push_back(*ulong_fixup_or_err);
862 } else
864 log, ulong_fixup_or_err.takeError(),
865 "Failed to substitute 'unsigned long long' type mangling: {0}");
866
867 if (auto ctor_fixup_or_err = SubstituteStructorAliases_ItaniumMangle(
868 mangled_name.GetStringRef())) {
869 if (*ctor_fixup_or_err) {
870 alternates.push_back(*ctor_fixup_or_err);
871 }
872 } else
873 LLDB_LOG_ERROR(log, ctor_fixup_or_err.takeError(),
874 "Failed to substitute structor alias manglings: {0}");
875
876 return alternates;
877}
878
880 const Mangled mangled, const SymbolContext &sym_ctx) const {
881 ConstString demangled = mangled.GetDemangledName();
882 if (!demangled)
883 return ConstString();
884
885 CxxMethodName cpp_name(demangled.GetStringRef().str());
886 std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
887
888 if (!scope_qualified_name.size())
889 return ConstString();
890
891 if (!sym_ctx.module_sp)
892 return ConstString();
893
894 lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
895 if (!sym_file)
896 return ConstString();
897
898 std::vector<ConstString> alternates;
899 sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
900
901 std::vector<ConstString> param_and_qual_matches;
902 std::vector<ConstString> param_matches;
903 for (size_t i = 0; i < alternates.size(); i++) {
904 ConstString alternate_mangled_name = alternates[i];
905 Mangled mangled(alternate_mangled_name);
906 ConstString demangled = mangled.GetDemangledName();
907
908 CxxMethodName alternate_cpp_name(demangled.GetStringRef().str());
909 if (!cpp_name.IsValid())
910 continue;
911
912 if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
913 if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
914 param_and_qual_matches.push_back(alternate_mangled_name);
915 else
916 param_matches.push_back(alternate_mangled_name);
917 }
918 }
919
920 if (param_and_qual_matches.size())
921 return param_and_qual_matches[0]; // It is assumed that there will be only
922 // one!
923 else if (param_matches.size())
924 return param_matches[0]; // Return one of them as a best match
925 else
926 return ConstString();
927}
928
929static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
930 if (!cpp_category_sp)
931 return;
932
933 TypeSummaryImpl::Flags stl_summary_flags;
934 stl_summary_flags.SetCascades(true)
935 .SetSkipPointers(false)
936 .SetSkipReferences(false)
938 .SetDontShowValue(false)
940 .SetHideItemNames(false);
941
942 AddCXXSummary(cpp_category_sp,
944 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
945 stl_summary_flags, true);
946 AddCXXSummary(cpp_category_sp,
948 "std::string summary provider",
949 "^std::__[[:alnum:]]+::basic_string<char, "
950 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
951 stl_summary_flags, true);
952 AddCXXSummary(cpp_category_sp,
954 "std::string summary provider",
955 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
956 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
957 stl_summary_flags, true);
958
959 AddCXXSummary(cpp_category_sp,
961 "std::u16string summary provider",
962 "^std::__[[:alnum:]]+::basic_string<char16_t, "
963 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
964 stl_summary_flags, true);
965
966 AddCXXSummary(cpp_category_sp,
968 "std::u32string summary provider",
969 "^std::__[[:alnum:]]+::basic_string<char32_t, "
970 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
971 stl_summary_flags, true);
972
973 AddCXXSummary(cpp_category_sp,
975 "std::wstring summary provider",
976 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
977 AddCXXSummary(cpp_category_sp,
979 "std::wstring summary provider",
980 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
981 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
982 stl_summary_flags, true);
983
984 AddCXXSummary(cpp_category_sp,
986 "std::string_view summary provider",
987 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
988 AddCXXSummary(cpp_category_sp,
990 "std::string_view summary provider",
991 "^std::__[[:alnum:]]+::basic_string_view<char, "
992 "std::__[[:alnum:]]+::char_traits<char> >$",
993 stl_summary_flags, true);
994 AddCXXSummary(cpp_category_sp,
996 "std::string_view summary provider",
997 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
998 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
999 stl_summary_flags, true);
1000
1001 AddCXXSummary(cpp_category_sp,
1003 "std::u16string_view summary provider",
1004 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
1005 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
1006 stl_summary_flags, true);
1007
1008 AddCXXSummary(cpp_category_sp,
1010 "std::u32string_view summary provider",
1011 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
1012 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
1013 stl_summary_flags, true);
1014
1015 AddCXXSummary(cpp_category_sp,
1017 "std::wstring_view summary provider",
1018 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
1019 AddCXXSummary(cpp_category_sp,
1021 "std::wstring_view summary provider",
1022 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
1023 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
1024 stl_summary_flags, true);
1025
1026 SyntheticChildren::Flags stl_synth_flags;
1027 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1028 false);
1029 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1030 stl_deref_flags.SetFrontEndWantsDereference();
1031
1033 cpp_category_sp,
1035 "libc++ std::bitset synthetic children",
1036 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
1038 cpp_category_sp,
1040 "libc++ std::vector synthetic children",
1041 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
1043 cpp_category_sp,
1045 "libc++ std::valarray synthetic children",
1046 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
1048 cpp_category_sp,
1050 "libc++ std::slice_array synthetic children",
1051 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
1053 cpp_category_sp,
1055 "libc++ synthetic children for the valarray proxy arrays",
1056 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1057 stl_deref_flags, true);
1059 cpp_category_sp,
1061 "libc++ std::forward_list synthetic children",
1062 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
1064 cpp_category_sp,
1066 "libc++ std::list synthetic children", "^std::__[[:alnum:]]+::list<.+>$",
1067 stl_deref_flags, true);
1069 cpp_category_sp,
1071 "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
1072 stl_synth_flags, true);
1074 cpp_category_sp,
1076 "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
1077 stl_deref_flags, true);
1079 cpp_category_sp,
1081 "libc++ std::multiset synthetic children",
1082 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
1084 cpp_category_sp,
1086 "libc++ std::multimap synthetic children",
1087 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
1089 cpp_category_sp,
1091 "libc++ std::unordered containers synthetic children",
1092 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1093 stl_synth_flags, true);
1095 "libc++ std::queue synthetic children",
1096 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
1098 "libc++ std::tuple synthetic children",
1099 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
1101 "libc++ std::optional synthetic children",
1102 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
1104 "libc++ std::variant synthetic children",
1105 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
1107 cpp_category_sp,
1109 "libc++ std::atomic synthetic children",
1110 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
1112 cpp_category_sp,
1114 "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
1115 stl_deref_flags, true);
1117 cpp_category_sp,
1119 "libc++ std::ranges::ref_view synthetic children",
1120 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
1121
1122 cpp_category_sp->AddTypeSynthetic(
1123 "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
1125 stl_synth_flags,
1126 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
1127
1129 cpp_category_sp,
1131 "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
1132 stl_synth_flags, true);
1133
1134 static constexpr const char *const libcxx_std_unique_ptr_regex =
1135 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
1137 cpp_category_sp,
1139 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
1140 stl_synth_flags, true);
1141
1143 cpp_category_sp,
1145 "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
1146 stl_synth_flags, true);
1147 AddCXXSummary(cpp_category_sp,
1149 "libc++ std::function summary provider",
1150 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
1151
1152 static constexpr const char *const libcxx_std_coroutine_handle_regex =
1153 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
1155 cpp_category_sp,
1157 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
1158 stl_deref_flags, true);
1159
1160 stl_summary_flags.SetDontShowChildren(false);
1161 stl_summary_flags.SetSkipPointers(false);
1162 AddCXXSummary(cpp_category_sp,
1164 "libc++ std::bitset summary provider",
1165 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
1166 AddCXXSummary(cpp_category_sp,
1168 "libc++ std::vector summary provider",
1169 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
1170 AddCXXSummary(cpp_category_sp,
1172 "libc++ std::valarray summary provider",
1173 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
1174 AddCXXSummary(cpp_category_sp,
1176 "libc++ std::slice_array summary provider",
1177 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
1178 true);
1179 AddCXXSummary(cpp_category_sp,
1181 "libc++ summary provider for the valarray proxy arrays",
1182 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1183 stl_summary_flags, true);
1186 "libc++ std::list summary provider",
1187 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
1188 AddCXXSummary(cpp_category_sp,
1190 "libc++ std::list summary provider",
1191 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags, true);
1192 AddCXXSummary(cpp_category_sp,
1194 "libc++ std::map summary provider",
1195 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
1196 AddCXXSummary(cpp_category_sp,
1198 "libc++ std::deque summary provider",
1199 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
1200 AddCXXSummary(cpp_category_sp,
1202 "libc++ std::queue summary provider",
1203 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
1204 AddCXXSummary(cpp_category_sp,
1206 "libc++ std::set summary provider",
1207 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
1208 AddCXXSummary(cpp_category_sp,
1210 "libc++ std::multiset summary provider",
1211 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
1212 AddCXXSummary(cpp_category_sp,
1214 "libc++ std::multimap summary provider",
1215 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
1216 AddCXXSummary(cpp_category_sp,
1218 "libc++ std::unordered containers summary provider",
1219 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1220 stl_summary_flags, true);
1222 "libc++ std::tuple summary provider",
1223 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
1224 AddCXXSummary(cpp_category_sp,
1226 "libc++ std::atomic summary provider",
1227 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
1228 AddCXXSummary(cpp_category_sp,
1230 "libc++ std::optional summary provider",
1231 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
1232 AddCXXSummary(cpp_category_sp,
1234 "libc++ std::variant summary provider",
1235 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
1236 AddCXXSummary(cpp_category_sp,
1238 "libc++ std::span summary provider",
1239 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
1240
1241 stl_summary_flags.SetSkipPointers(true);
1242
1243 AddCXXSummary(cpp_category_sp,
1245 "libc++ std::shared_ptr summary provider",
1246 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1247 true);
1248 AddCXXSummary(cpp_category_sp,
1250 "libc++ std::weak_ptr summary provider",
1251 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
1252 AddCXXSummary(cpp_category_sp,
1254 "libc++ std::unique_ptr summary provider",
1255 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
1256
1257 AddCXXSummary(cpp_category_sp,
1259 "libc++ std::coroutine_handle summary provider",
1260 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
1261
1263 cpp_category_sp,
1265 "std::vector iterator synthetic children",
1266 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
1267
1269 cpp_category_sp,
1271 "std::map iterator synthetic children",
1272 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1273 true);
1274
1275 AddCXXSynthetic(cpp_category_sp,
1278 "std::unordered_map iterator synthetic children",
1279 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1280 stl_synth_flags, true);
1281 // Chrono duration typedefs
1282 cpp_category_sp->AddTypeSummary(
1283 "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
1285 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
1286 cpp_category_sp->AddTypeSummary(
1287 "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
1289 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
1290 cpp_category_sp->AddTypeSummary(
1291 "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
1293 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
1294 cpp_category_sp->AddTypeSummary(
1295 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1297 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1298 cpp_category_sp->AddTypeSummary(
1299 "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
1300 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1301 eTypeOptionHideValue,
1302 "${var.__rep_} min")));
1303 cpp_category_sp->AddTypeSummary(
1304 "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
1306 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
1307
1308 cpp_category_sp->AddTypeSummary(
1309 "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
1310 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1311 eTypeOptionHideValue,
1312 "${var.__rep_} days")));
1313 cpp_category_sp->AddTypeSummary(
1314 "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
1315 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1316 eTypeOptionHideValue,
1317 "${var.__rep_} weeks")));
1318 cpp_category_sp->AddTypeSummary(
1319 "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
1320 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1321 eTypeOptionHideValue,
1322 "${var.__rep_} months")));
1323 cpp_category_sp->AddTypeSummary(
1324 "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
1325 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1326 eTypeOptionHideValue,
1327 "${var.__rep_} years")));
1328 cpp_category_sp->AddTypeSummary(
1329 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1331 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1332
1333 // Chrono time point types
1334
1335 AddCXXSummary(cpp_category_sp,
1337 "libc++ std::chrono::sys_seconds summary provider",
1338 "^std::__[[:alnum:]]+::chrono::time_point<"
1339 "std::__[[:alnum:]]+::chrono::system_clock, "
1340 "std::__[[:alnum:]]+::chrono::duration<.*, "
1341 "std::__[[:alnum:]]+::ratio<1, 1> "
1342 "> >$",
1343 eTypeOptionHideChildren | eTypeOptionHideValue |
1344 eTypeOptionCascade,
1345 true);
1346 AddCXXSummary(cpp_category_sp,
1348 "libc++ std::chrono::sys_seconds summary provider",
1349 "^std::__[[:alnum:]]+::chrono::time_point<"
1350 "std::__[[:alnum:]]+::chrono::system_clock, "
1351 "std::__[[:alnum:]]+::chrono::duration<int, "
1352 "std::__[[:alnum:]]+::ratio<86400, 1> "
1353 "> >$",
1354 eTypeOptionHideChildren | eTypeOptionHideValue |
1355 eTypeOptionCascade,
1356 true);
1357
1359 cpp_category_sp,
1361 "libc++ std::chrono::local_seconds summary provider",
1362 "^std::__[[:alnum:]]+::chrono::time_point<"
1363 "std::__[[:alnum:]]+::chrono::local_t, "
1364 "std::__[[:alnum:]]+::chrono::duration<.*, "
1365 "std::__[[:alnum:]]+::ratio<1, 1> "
1366 "> >$",
1367 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1368 true);
1369 AddCXXSummary(cpp_category_sp,
1371 "libc++ std::chrono::local_seconds summary provider",
1372 "^std::__[[:alnum:]]+::chrono::time_point<"
1373 "std::__[[:alnum:]]+::chrono::local_t, "
1374 "std::__[[:alnum:]]+::chrono::duration<int, "
1375 "std::__[[:alnum:]]+::ratio<86400, 1> "
1376 "> >$",
1377 eTypeOptionHideChildren | eTypeOptionHideValue |
1378 eTypeOptionCascade,
1379 true);
1380
1381 // Chrono calendar types
1382
1383 cpp_category_sp->AddTypeSummary(
1384 "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1385 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1386 eTypeOptionHideValue,
1387 "day=${var.__d_%u}")));
1388
1389 AddCXXSummary(cpp_category_sp,
1391 "libc++ std::chrono::month summary provider",
1392 "^std::__[[:alnum:]]+::chrono::month$",
1393 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1394
1395 cpp_category_sp->AddTypeSummary(
1396 "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1398 eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1399
1400 AddCXXSummary(cpp_category_sp,
1402 "libc++ std::chrono::weekday summary provider",
1403 "^std::__[[:alnum:]]+::chrono::weekday$",
1404 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1405
1406 cpp_category_sp->AddTypeSummary(
1407 "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
1409 eTypeOptionHideChildren | eTypeOptionHideValue,
1410 "${var.__wd_} index=${var.__idx_%u}")));
1411
1412 cpp_category_sp->AddTypeSummary(
1413 "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
1414 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1415 eTypeOptionHideValue,
1416 "${var.__wd_} index=last")));
1417 cpp_category_sp->AddTypeSummary(
1418 "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1419 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1420 eTypeOptionHideValue,
1421 "${var.__m_} ${var.__d_}")));
1422 cpp_category_sp->AddTypeSummary(
1423 "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1424 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1425 eTypeOptionHideValue,
1426 "${var.__m_} day=last")));
1427
1428 cpp_category_sp->AddTypeSummary(
1429 "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
1430 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1431 eTypeOptionHideValue,
1432 "${var.__m_} ${var.__wdi_}")));
1433
1434 cpp_category_sp->AddTypeSummary(
1435 "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
1436 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1437 eTypeOptionHideValue,
1438 "${var.__m_} ${var.__wdl_}")));
1439
1440 cpp_category_sp->AddTypeSummary(
1441 "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
1442 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1443 eTypeOptionHideValue,
1444 "${var.__y_} ${var.__m_}")));
1445
1447 cpp_category_sp,
1449 "libc++ std::chrono::year_month_day summary provider",
1450 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1451 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1452
1453 cpp_category_sp->AddTypeSummary(
1454 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1456 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1457 eTypeOptionHideValue,
1458 "${var.__y_} ${var.__mdl_}")));
1459
1460 cpp_category_sp->AddTypeSummary(
1461 "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
1463 eTypeOptionHideChildren | eTypeOptionHideValue,
1464 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1465
1466 cpp_category_sp->AddTypeSummary(
1467 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1470 eTypeOptionHideChildren | eTypeOptionHideValue,
1471 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1472
1473 AddCXXSummary(cpp_category_sp,
1475 "libc++ std::partial_ordering summary provider",
1476 "^std::__[[:alnum:]]+::partial_ordering$",
1477 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1478 AddCXXSummary(cpp_category_sp,
1480 "libc++ std::weak_ordering summary provider",
1481 "^std::__[[:alnum:]]+::weak_ordering$",
1482 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1483 AddCXXSummary(cpp_category_sp,
1485 "libc++ std::strong_ordering summary provider",
1486 "^std::__[[:alnum:]]+::strong_ordering$",
1487 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1488
1489 AddCXXSummary(cpp_category_sp,
1491 "libc++ std::source_location summary provider",
1492 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1493 true);
1494}
1495
1497 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1498 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1499 auto makeSpecifier = [](llvm::StringRef name) {
1500 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1501 name, eFormatterMatchExact);
1502 };
1503
1504 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1505
1506 category_sp->AddTypeSummary(
1507 makeSpecifier(llvm::formatv("std::basic_string<{}>", char_ty).str()),
1508 summary_sp);
1509
1510 category_sp->AddTypeSummary(
1511 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1512 llvm::formatv("^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1513 char_ty)
1514 .str(),
1516 summary_sp);
1517}
1518
1520 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1521 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1522 // std::string_view
1523 category_sp->AddTypeSummary(
1524 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1525 string_ty, eFormatterMatchExact),
1526 summary_sp);
1527
1528 // std::basic_string_view<char, std::char_traits<char>>
1529 // NativePDB has spaces at different positions compared to PDB and DWARF, so
1530 // use a regex and make them optional.
1531 category_sp->AddTypeSummary(
1532 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1533 llvm::formatv(
1534 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1535 char_ty)
1536 .str(),
1538 summary_sp);
1539}
1540
1542 if (!cpp_category_sp)
1543 return;
1544
1545 TypeSummaryImpl::Flags stl_summary_flags;
1546 stl_summary_flags.SetCascades(true)
1547 .SetSkipPointers(false)
1548 .SetSkipReferences(false)
1549 .SetDontShowChildren(true)
1550 .SetDontShowValue(false)
1552 .SetHideItemNames(false);
1553
1555 stl_summary_flags, LibStdcppStringSummaryProvider,
1556 "libstdc++ std::(w)string summary provider"));
1557 cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1558 string_summary_sp);
1559 cpp_category_sp->AddTypeSummary(
1560 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1561 eFormatterMatchRegex, string_summary_sp);
1562 cpp_category_sp->AddTypeSummary("^std::__cxx11::basic_string<unsigned char, "
1563 "std::char_traits<unsigned char>,.*>$",
1564 eFormatterMatchRegex, string_summary_sp);
1565
1566 cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1567 string_summary_sp);
1568 cpp_category_sp->AddTypeSummary(
1569 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1570 eFormatterMatchRegex, string_summary_sp);
1571
1572 SyntheticChildren::Flags stl_synth_flags;
1573 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1574 false);
1575 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1576 stl_deref_flags.SetFrontEndWantsDereference();
1577
1578 cpp_category_sp->AddTypeSynthetic(
1579 "^std::__debug::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1581 stl_synth_flags,
1582 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1583 cpp_category_sp->AddTypeSynthetic(
1584 "^std::__debug::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1586 stl_synth_flags,
1587 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1588 cpp_category_sp->AddTypeSynthetic(
1589 "^std::__debug::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1591 stl_deref_flags,
1592 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1593 cpp_category_sp->AddTypeSynthetic(
1594 "^std::__debug::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1596 stl_deref_flags,
1597 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1598 cpp_category_sp->AddTypeSynthetic(
1599 "^std::__debug::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1601 stl_deref_flags,
1602 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1603 cpp_category_sp->AddTypeSynthetic(
1604 "^std::__debug::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1606 stl_deref_flags,
1607 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1608 cpp_category_sp->AddTypeSynthetic(
1609 "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1611 stl_deref_flags,
1612 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1613 cpp_category_sp->AddTypeSynthetic(
1614 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", eFormatterMatchRegex,
1616 stl_deref_flags,
1617 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1618 cpp_category_sp->AddTypeSynthetic(
1619 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1621 stl_synth_flags,
1622 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1623
1624 stl_summary_flags.SetDontShowChildren(false);
1625 stl_summary_flags.SetSkipPointers(false);
1626
1627 AddCXXSummary(cpp_category_sp,
1629 "libstdc++ std::bitset summary provider",
1630 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
1631
1632 AddCXXSummary(cpp_category_sp,
1634 "libstdc++ std::__debug::vector summary provider",
1635 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags, true);
1636
1637 AddCXXSummary(cpp_category_sp,
1639 "libstdc++ debug std::map summary provider",
1640 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags, true);
1641
1642 AddCXXSummary(cpp_category_sp,
1644 "libstdc++ debug std::set summary provider",
1645 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags, true);
1646
1648 "libstdc++ debug std::deque summary provider",
1649 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags, true);
1650
1653 "libstdc++ debug std::multimap summary provider",
1654 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags, true);
1655
1658 "libstdc++ debug std::multiset summary provider",
1659 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags, true);
1660
1661 AddCXXSummary(cpp_category_sp,
1663 "libstdc++ debug std unordered container summary provider",
1664 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1665 stl_summary_flags, true);
1666
1669 "libstdc++ debug std::list summary provider",
1670 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags, true);
1671
1672 cpp_category_sp->AddTypeSummary(
1673 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1675 stl_summary_flags,
1676 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1677
1679 cpp_category_sp,
1681 "std::vector iterator synthetic children",
1682 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1683
1685 cpp_category_sp,
1687 "std::map iterator synthetic children",
1688 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags, true);
1689
1691 cpp_category_sp,
1693 "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1694 stl_synth_flags, true);
1695
1696 static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1697 "^std::coroutine_handle<.+>(( )?&)?$";
1699 cpp_category_sp,
1701 "std::coroutine_handle synthetic children",
1702 libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1703
1705 cpp_category_sp,
1707 "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
1708 stl_deref_flags, true);
1709
1710 AddCXXSummary(cpp_category_sp,
1712 "libstdc++ std::coroutine_handle summary provider",
1713 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1714
1716 cpp_category_sp,
1718 "libstdc++ std::source_location summary provider", "std::source_location",
1719 stl_summary_flags);
1720}
1721
1722static lldb_private::SyntheticChildrenFrontEnd *
1724 const lldb::ValueObjectSP &valobj_sp) {
1725 if (!valobj_sp)
1726 return nullptr;
1727
1728 if (IsMsvcStlAtomic(*valobj_sp))
1729 return MsvcStlAtomicSyntheticFrontEndCreator(children, valobj_sp);
1730 return LibStdcppAtomicSyntheticFrontEndCreator(children, valobj_sp);
1731}
1732
1734 const TypeSummaryOptions &options) {
1735 if (IsMsvcStlAtomic(valobj))
1736 return MsvcStlAtomicSummaryProvider(valobj, stream, options);
1737 return LibStdcppAtomicSummaryProvider(valobj, stream, options);
1738}
1739
1740static lldb_private::SyntheticChildrenFrontEnd *
1742 lldb::ValueObjectSP valobj_sp) {
1743 if (!valobj_sp)
1744 return nullptr;
1745
1746 if (IsMsvcStlSmartPointer(*valobj_sp))
1748 return LibStdcppSharedPtrSyntheticFrontEndCreator(children, valobj_sp);
1749}
1750
1751static bool
1753 const TypeSummaryOptions &options) {
1754 if (IsMsvcStlSmartPointer(valobj))
1755 return MsvcStlSmartPointerSummaryProvider(valobj, stream, options);
1756 return LibStdcppSmartPointerSummaryProvider(valobj, stream, options);
1757}
1758
1759static lldb_private::SyntheticChildrenFrontEnd *
1761 lldb::ValueObjectSP valobj_sp) {
1762 if (!valobj_sp)
1763 return nullptr;
1764
1765 if (IsMsvcStlUniquePtr(*valobj_sp))
1767 return LibStdcppUniquePtrSyntheticFrontEndCreator(children, valobj_sp);
1768}
1769
1771 const TypeSummaryOptions &options) {
1772 if (IsMsvcStlUniquePtr(valobj))
1773 return MsvcStlUniquePtrSummaryProvider(valobj, stream, options);
1774 return LibStdcppUniquePointerSummaryProvider(valobj, stream, options);
1775}
1776
1777static SyntheticChildrenFrontEnd *
1779 lldb::ValueObjectSP valobj_sp) {
1780 if (!valobj_sp)
1781 return nullptr;
1782
1783 if (IsMsvcStlTuple(*valobj_sp))
1784 return MsvcStlTupleSyntheticFrontEndCreator(children, valobj_sp);
1785 return LibStdcppTupleSyntheticFrontEndCreator(children, valobj_sp);
1786}
1787
1788static SyntheticChildrenFrontEnd *
1790 lldb::ValueObjectSP valobj_sp) {
1791 if (!valobj_sp)
1792 return nullptr;
1793
1794 // checks for vector<T> and vector<bool>
1795 if (auto *msvc = MsvcStlVectorSyntheticFrontEndCreator(valobj_sp))
1796 return msvc;
1797
1799 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1800}
1801
1802static SyntheticChildrenFrontEnd *
1804 lldb::ValueObjectSP valobj_sp) {
1805 if (!valobj_sp)
1806 return nullptr;
1807
1808 if (IsMsvcStlList(*valobj_sp))
1809 return MsvcStlListSyntheticFrontEndCreator(children, valobj_sp);
1811 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1812}
1813
1814static SyntheticChildrenFrontEnd *
1816 lldb::ValueObjectSP valobj_sp) {
1817 if (!valobj_sp)
1818 return nullptr;
1819
1820 if (IsMsvcStlList(*valobj_sp))
1821 return MsvcStlForwardListSyntheticFrontEndCreator(children, valobj_sp);
1823 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1824 *valobj_sp);
1825}
1826
1827static SyntheticChildrenFrontEnd *
1829 lldb::ValueObjectSP valobj_sp) {
1830 if (!valobj_sp)
1831 return nullptr;
1832
1833 if (IsMsvcStlOptional(*valobj_sp))
1834 return MsvcStlOptionalSyntheticFrontEndCreator(children, valobj_sp);
1835 return LibStdcppOptionalSyntheticFrontEndCreator(children, valobj_sp);
1836}
1837
1838static SyntheticChildrenFrontEnd *
1840 lldb::ValueObjectSP valobj_sp) {
1841 if (!valobj_sp)
1842 return nullptr;
1843
1844 if (IsMsvcStlVariant(*valobj_sp))
1845 return MsvcStlVariantSyntheticFrontEndCreator(children, valobj_sp);
1847 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1848}
1849
1851 const TypeSummaryOptions &options) {
1852 if (IsMsvcStlVariant(valobj))
1853 return MsvcStlVariantSummaryProvider(valobj, stream, options);
1854 return LibStdcppVariantSummaryProvider(valobj, stream, options);
1855}
1856
1857static SyntheticChildrenFrontEnd *
1859 ValueObjectSP valobj_sp) {
1860 if (!valobj_sp)
1861 return nullptr;
1862
1863 if (IsMsvcStlUnordered(*valobj_sp))
1864 return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
1866 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1867 *valobj_sp);
1868}
1869
1870static SyntheticChildrenFrontEnd *
1872 ValueObjectSP valobj_sp) {
1873 if (!valobj_sp)
1874 return nullptr;
1875
1876 if (IsMsvcStlMapLike(*valobj_sp))
1879 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1880}
1881
1882static SyntheticChildrenFrontEnd *
1884 ValueObjectSP valobj_sp) {
1885 if (!valobj_sp)
1886 return nullptr;
1887
1888 if (IsMsvcStlDeque(*valobj_sp))
1889 return MsvcStlDequeSyntheticFrontEndCreator(children, valobj_sp);
1891 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1892}
1893
1894static SyntheticChildrenFrontEnd *
1896 ValueObjectSP valobj_sp) {
1897 if (!valobj_sp)
1898 return nullptr;
1899
1900 if (IsMsvcStlSpan(*valobj_sp))
1901 return MsvcStlSpanSyntheticFrontEndCreator(children, valobj_sp);
1902 return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
1903}
1904
1905static bool
1907 const TypeSummaryOptions &options) {
1908 if (IsMsvcStlOrdering(valobj))
1909 return MsvcStlPartialOrderingSummaryProvider(valobj, stream, options);
1910 return LibStdcppPartialOrderingSummaryProvider(valobj, stream, options);
1911}
1912
1913static bool
1915 const TypeSummaryOptions &options) {
1916 if (IsMsvcStlOrdering(valobj))
1917 return MsvcStlWeakOrderingSummaryProvider(valobj, stream, options);
1918 return LibStdcppWeakOrderingSummaryProvider(valobj, stream, options);
1919}
1920
1921static bool
1923 const TypeSummaryOptions &options) {
1924 if (IsMsvcStlOrdering(valobj))
1925 return MsvcStlStrongOrderingSummaryProvider(valobj, stream, options);
1926 return LibStdcppStrongOrderingSummaryProvider(valobj, stream, options);
1927}
1928
1929static SyntheticChildrenFrontEnd *
1931 ValueObjectSP valobj_sp) {
1932 if (!valobj_sp)
1933 return nullptr;
1934
1935 if (IsMsvcStlBitset(*valobj_sp))
1936 return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
1937 return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
1938}
1939
1940static SyntheticChildrenFrontEnd *
1942 lldb::ValueObjectSP valobj_sp) {
1943 if (!valobj_sp)
1944 return nullptr;
1945 if (IsMsvcStlExpected(*valobj_sp))
1946 return MsvcStlExpectedSyntheticFrontEndCreator(children, valobj_sp);
1947 return nullptr;
1948}
1949
1951 const TypeSummaryOptions &options) {
1952 if (IsMsvcStlExpected(valobj))
1953 return MsvcStlExpectedSummaryProvider(valobj, stream, options);
1954 return false;
1955}
1956
1957static SyntheticChildrenFrontEnd *
1959 lldb::ValueObjectSP valobj_sp) {
1960 if (!valobj_sp)
1961 return nullptr;
1962 if (IsMsvcStlValarray(*valobj_sp))
1963 return MsvcStlValarraySyntheticFrontEndCreator(children, valobj_sp);
1964 return nullptr;
1965}
1966
1968 const TypeSummaryOptions &options) {
1969 if (!IsMsvcStlValarray(valobj))
1970 return false;
1971 return ContainerSizeSummaryProvider(valobj, stream, options);
1972}
1973
1974static bool
1976 const TypeSummaryOptions &options) {
1977 if (IsMsvcStlSourceLocation(valobj))
1978 return MsvcStlSourceLocationSummaryProvider(valobj, stream, options);
1979 return LibStdcppSourceLocationSummaryProvider(valobj, stream, options);
1980}
1981
1982/// Load formatters that are formatting types from more than one STL
1984 if (!cpp_category_sp)
1985 return;
1986
1987 TypeSummaryImpl::Flags stl_summary_flags;
1988 stl_summary_flags.SetCascades(true)
1989 .SetSkipPointers(false)
1990 .SetSkipReferences(false)
1991 .SetDontShowChildren(true)
1992 .SetDontShowValue(false)
1994 .SetHideItemNames(false);
1995 SyntheticChildren::Flags stl_synth_flags;
1996 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1997 false);
1998
2000
2002 cpp_category_sp, "std::string", "char",
2003 std::make_shared<CXXFunctionSummaryFormat>(
2004 stl_summary_flags,
2005 [](ValueObject &valobj, Stream &stream,
2006 const TypeSummaryOptions &options) {
2007 if (IsMsvcStlStringType(valobj))
2009 valobj, stream, options);
2010 return LibStdcppStringSummaryProvider(valobj, stream, options);
2011 },
2012 "MSVC STL/libstdc++ std::string summary provider"));
2014 cpp_category_sp, "std::wstring", "wchar_t",
2015 std::make_shared<CXXFunctionSummaryFormat>(
2016 stl_summary_flags,
2017 [](ValueObject &valobj, Stream &stream,
2018 const TypeSummaryOptions &options) {
2019 if (IsMsvcStlStringType(valobj))
2020 return MsvcStlWStringSummaryProvider(valobj, stream, options);
2021 return LibStdcppStringSummaryProvider(valobj, stream, options);
2022 },
2023 "MSVC STL/libstdc++ std::wstring summary provider"));
2024
2026 cpp_category_sp, "std::string_view", "char",
2027 std::make_shared<CXXFunctionSummaryFormat>(
2028 stl_summary_flags,
2029 [](ValueObject &valobj, Stream &stream,
2030 const TypeSummaryOptions &options) {
2031 if (IsMsvcStlStringViewType(valobj))
2033 valobj, stream, options);
2035 valobj, stream, options);
2036 },
2037 "MSVC STL/libstdc++ std::string_view summary provider"));
2039 cpp_category_sp, "std::u8string_view", "char8_t",
2040 std::make_shared<CXXFunctionSummaryFormat>(
2041 stl_summary_flags,
2042 [](ValueObject &valobj, Stream &stream,
2043 const TypeSummaryOptions &options) {
2044 if (IsMsvcStlStringViewType(valobj))
2046 valobj, stream, options);
2048 valobj, stream, options);
2049 },
2050 "MSVC STL/libstdc++ std::u8string_view summary provider"));
2052 cpp_category_sp, "std::u16string_view", "char16_t",
2053 std::make_shared<CXXFunctionSummaryFormat>(
2054 stl_summary_flags,
2055 [](ValueObject &valobj, Stream &stream,
2056 const TypeSummaryOptions &options) {
2057 if (IsMsvcStlStringViewType(valobj))
2059 valobj, stream, options);
2061 valobj, stream, options);
2062 },
2063 "MSVC STL/libstdc++ std::u16string_view summary provider"));
2065 cpp_category_sp, "std::u32string_view", "char32_t",
2066 std::make_shared<CXXFunctionSummaryFormat>(
2067 stl_summary_flags,
2068 [](ValueObject &valobj, Stream &stream,
2069 const TypeSummaryOptions &options) {
2070 if (IsMsvcStlStringViewType(valobj))
2072 valobj, stream, options);
2074 valobj, stream, options);
2075 },
2076 "MSVC STL/libstdc++ std::u32string_view summary provider"));
2078 cpp_category_sp, "std::wstring_view", "wchar_t",
2079 std::make_shared<CXXFunctionSummaryFormat>(
2080 stl_summary_flags,
2081 [](ValueObject &valobj, Stream &stream,
2082 const TypeSummaryOptions &options) {
2083 if (IsMsvcStlStringViewType(valobj))
2084 return MsvcStlWStringViewSummaryProvider(valobj, stream, options);
2085 return LibStdcppWStringViewSummaryProvider(valobj, stream, options);
2086 },
2087 "MSVC STL/libstdc++ std::wstring_view summary provider"));
2088
2090 "std::atomic synthetic children", "^std::atomic<.+>$",
2091 stl_synth_flags, true);
2092 // NOTE: it is loaded as a common formatter because the libc++ version is not
2093 // in the `__1` namespace, hence we need to dispatch based on the class
2094 // layout.
2095 AddCXXSynthetic(cpp_category_sp,
2097 "std::initializer_list synthetic children",
2098 "^std::initializer_list<.+>$", stl_synth_flags, true);
2099
2101 "MSVC STL/libstdc++ std::filesystem::path summary provider",
2102 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags, true);
2103
2105 "MSVC STL/libstdc++ std::source_location summary provider",
2106 "std::source_location", stl_summary_flags);
2107
2108 stl_summary_flags.SetDontShowChildren(false);
2109 stl_summary_flags.SetSkipPointers(false);
2110
2112 "std::shared_ptr synthetic children",
2113 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2115 "std::weak_ptr synthetic children",
2116 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2118 "std::unique_ptr synthetic children",
2119 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2121 "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$",
2122 stl_synth_flags, true);
2124 "std::list synthetic children", "^std::list<.+>(( )?&)?$",
2125 stl_synth_flags, true);
2127 "std::forward_list synthetic children",
2128 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
2130 "std::variant synthetic children", "^std::variant<.*>$",
2131 stl_synth_flags, true);
2133 "std::unordered container synthetic children",
2134 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
2135 true);
2136
2137 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
2138 stl_deref_flags.SetFrontEndWantsDereference();
2140 "std::optional synthetic children",
2141 "^std::optional<.+>(( )?&)?$", stl_deref_flags, true);
2143 "std::deque container synthetic children",
2144 "^std::deque<.+>(( )?&)?$", stl_deref_flags, true);
2146 "std::span container synthetic children", "^std::span<.+>$",
2147 stl_deref_flags, true);
2148
2150 "std::(multi)?map/set synthetic children",
2151 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
2152 true);
2154 "std::bitset synthetic children", "^std::bitset<.+>(( )?&)?$",
2155 stl_deref_flags, true);
2156
2158 "std::initializer_list summary provider",
2159 "^std::initializer_list<.+>$", stl_summary_flags, true);
2161 "std::atomic summary provider", "^std::atomic<.+>$",
2162 stl_summary_flags, true);
2164 "MSVC STL/libstdc++ std::shared_ptr summary provider",
2165 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2167 "MSVC STL/libstdc++ std::weak_ptr summary provider",
2168 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2170 "MSVC STL/libstdc++ std::unique_ptr summary provider",
2171 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2173 "MSVC STL/libstdc++ std::tuple summary provider",
2174 "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true);
2176 "MSVC/libstdc++ std::vector summary provider",
2177 "^std::vector<.+>(( )?&)?$", stl_summary_flags, true);
2179 "MSVC/libstdc++ std::vector synthetic provider",
2180 "^std::vector<.+>(( )?&)?$", stl_synth_flags, true);
2182 "MSVC STL/libstdc++ std::list summary provider",
2183 "^std::list<.+>(( )?&)?$", stl_summary_flags, true);
2184 cpp_category_sp->AddTypeSummary(
2185 "^std::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
2187 stl_summary_flags,
2188 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
2190 "MSVC STL/libstd++ std::optional summary provider",
2191 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
2193 "MSVC STL/libstdc++ std::variant summary provider",
2194 "^std::variant<.*>$", stl_summary_flags, true);
2196 "MSVC STL/libstdc++ std unordered container summary provider",
2197 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
2198 true);
2200 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
2201 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
2202 true);
2204 "MSVC STL/libstd++ std::deque summary provider",
2205 "^std::deque<.+>(( )?&)?$", stl_summary_flags, true);
2207 "MSVC STL/libstd++ std::span summary provider",
2208 "^std::span<.+>$", stl_summary_flags, true);
2210 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2211 "std::partial_ordering",
2212 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2214 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2215 "std::weak_ordering",
2216 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2218 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2219 "std::strong_ordering",
2220 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2221
2222 // Container adaptors expose the underlying container as the standard
2223 // protected member `c` ([queue.defn], [stack.defn], [priqueue.overview]).
2225 "std::queue synthetic children", "^std::queue<.+>(( )?&)?$",
2226 stl_synth_flags, true);
2228 "std::stack synthetic children", "^std::stack<.+>(( )?&)?$",
2229 stl_synth_flags, true);
2231 "std::priority_queue synthetic children",
2232 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags, true);
2234 "std::queue summary provider", "^std::queue<.+>(( )?&)?$",
2235 stl_summary_flags, true);
2237 "std::stack summary provider", "^std::stack<.+>(( )?&)?$",
2238 stl_summary_flags, true);
2240 "std::priority_queue summary provider",
2241 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags, true);
2242
2244 "MSVC STL/libstdc++ std::error_code summary provider",
2245 "std::error_code", stl_summary_flags);
2247 "MSVC STL/libstdc++ std::error_condition summary provider",
2248 "std::error_condition", stl_summary_flags);
2250 "MSVC STL/libstdc++ std::error_code/error_condition "
2251 "synthetic children",
2252 "^std::error_(code|condition)$", stl_synth_flags, true);
2254 "MSVC STL/libstdc++ std::bitset summary provider",
2255 "^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
2256
2258 "MSVC STL std::expected synthetic children",
2259 "^std::expected<.+>(( )?&)?$", stl_deref_flags, true);
2261 "MSVC STL std::expected summary provider",
2262 "^std::expected<.+>(( )?&)?$", stl_summary_flags, true);
2263
2265 "MSVC STL std::valarray synthetic children",
2266 "^std::valarray<.+>(( )?&)?$", stl_deref_flags, true);
2268 "MSVC STL std::valarray summary provider",
2269 "^std::valarray<.+>(( )?&)?$", stl_summary_flags, true);
2270}
2271
2273 if (!cpp_category_sp)
2274 return;
2275
2276 TypeSummaryImpl::Flags stl_summary_flags;
2277 stl_summary_flags.SetCascades(true)
2278 .SetSkipPointers(false)
2279 .SetSkipReferences(false)
2280 .SetDontShowChildren(true)
2281 .SetDontShowValue(false)
2283 .SetHideItemNames(false);
2284 SyntheticChildren::Flags stl_synth_flags;
2285 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
2286 false);
2287
2289
2291 cpp_category_sp, "std::u8string", "char8_t",
2292 std::make_shared<CXXFunctionSummaryFormat>(
2293 stl_summary_flags,
2295 "MSVC STL std::u8string summary provider"));
2297 cpp_category_sp, "std::u16string", "char16_t",
2298 std::make_shared<CXXFunctionSummaryFormat>(
2299 stl_summary_flags,
2301 "MSVC STL std::u16string summary provider"));
2303 cpp_category_sp, "std::u32string", "char32_t",
2304 std::make_shared<CXXFunctionSummaryFormat>(
2305 stl_summary_flags,
2307 "MSVC STL std::u32string summary provider"));
2308
2309 stl_summary_flags.SetDontShowChildren(false);
2310
2312 "MSVC STL tree iterator synthetic children",
2313 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2314 true);
2316 "MSVC STL tree iterator summary",
2317 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2318 true);
2321 "MSVC STL vector iterator synthetic children",
2322 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags, true);
2323}
2324
2326 if (!cpp_category_sp)
2327 return;
2328
2329 TypeSummaryImpl::Flags string_flags;
2330 string_flags.SetCascades(true)
2331 .SetSkipPointers(true)
2332 .SetSkipReferences(false)
2333 .SetDontShowChildren(true)
2334 .SetDontShowValue(false)
2336 .SetHideItemNames(false);
2337
2338 TypeSummaryImpl::Flags string_array_flags;
2339 string_array_flags.SetCascades(true)
2340 .SetSkipPointers(true)
2341 .SetSkipReferences(false)
2342 .SetDontShowChildren(true)
2343 .SetDontShowValue(true)
2345 .SetHideItemNames(false);
2346
2347 AddCXXSummary(cpp_category_sp,
2349 "char8_t * summary provider", "char8_t *", string_flags);
2350 AddCXXSummary(cpp_category_sp,
2352 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
2353 string_array_flags, true);
2354
2355 AddCXXSummary(cpp_category_sp,
2357 "char16_t * summary provider", "char16_t *", string_flags);
2358 AddCXXSummary(cpp_category_sp,
2360 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
2361 string_array_flags, true);
2362
2363 AddCXXSummary(cpp_category_sp,
2365 "char32_t * summary provider", "char32_t *", string_flags);
2366 AddCXXSummary(cpp_category_sp,
2368 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
2369 string_array_flags, true);
2370
2371 AddCXXSummary(cpp_category_sp,
2373 "wchar_t * summary provider", "wchar_t *", string_flags);
2374 AddCXXSummary(cpp_category_sp,
2376 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
2377 string_array_flags, true);
2378
2379 AddCXXSummary(cpp_category_sp,
2381 "unichar * summary provider", "unichar *", string_flags);
2382
2383 TypeSummaryImpl::Flags widechar_flags;
2384 widechar_flags.SetDontShowValue(true)
2385 .SetSkipPointers(true)
2386 .SetSkipReferences(false)
2387 .SetCascades(true)
2388 .SetDontShowChildren(true)
2389 .SetHideItemNames(true)
2390 .SetShowMembersOneLiner(false);
2391
2393 "char8_t summary provider", "char8_t", widechar_flags);
2394 AddCXXSummary(cpp_category_sp,
2396 "char16_t summary provider", "char16_t", widechar_flags);
2397 AddCXXSummary(cpp_category_sp,
2399 "char32_t summary provider", "char32_t", widechar_flags);
2401 "wchar_t summary provider", "wchar_t", widechar_flags);
2402
2403 AddCXXSummary(cpp_category_sp,
2405 "unichar summary provider", "unichar", widechar_flags);
2406}
2407
2408std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
2409 class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
2410 public:
2411 CompilerType AdjustForInclusion(CompilerType &candidate) override {
2412 LanguageType lang_type(candidate.GetMinimumLanguage());
2413 if (!Language::LanguageIsC(lang_type) &&
2415 return CompilerType();
2416 if (candidate.IsTypedefType())
2417 return candidate.GetTypedefedType();
2418 return candidate;
2419 }
2420 };
2421
2422 return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
2423}
2424
2426 static llvm::once_flag g_initialize;
2427 static TypeCategoryImplSP g_category;
2428
2429 llvm::call_once(g_initialize, [this]() -> void {
2431 g_category);
2432 if (g_category) {
2433 // NOTE: the libstdcpp formatters are loaded after libcxx formatters
2434 // because we don't want to the libcxx formatters to match the potential
2435 // `__debug` inline namespace that libstdcpp may use.
2436 // LLDB prioritizes the last loaded matching formatter.
2437 LoadLibCxxFormatters(g_category);
2438 LoadLibStdcppFormatters(g_category);
2439 LoadMsvcStlFormatters(g_category);
2440 LoadCommonStlFormatters(g_category);
2441 LoadSystemFormatters(g_category);
2442 }
2443 });
2444 return g_category;
2445}
2446
2449 static llvm::once_flag g_initialize;
2450 static ConstString g_vectortypes("VectorTypes");
2452
2453 llvm::call_once(g_initialize, []() -> void {
2454 g_formatters.push_back(
2457 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2461 "Function pointer summary provider"));
2462 if (CompilerType CT = valobj.GetCompilerType();
2463 CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
2465 return formatter_sp;
2466 }
2467 return nullptr;
2468 });
2469 g_formatters.push_back(
2472 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2475 .SetCascades(true)
2476 .SetDontShowChildren(true)
2477 .SetHideItemNames(true)
2478 .SetShowMembersOneLiner(true)
2479 .SetSkipPointers(true)
2480 .SetSkipReferences(false),
2482 "vector_type pointer summary provider"));
2483 if (valobj.GetCompilerType().IsVectorType()) {
2484 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2485 return formatter_sp;
2486 }
2487 return nullptr;
2488 });
2489 g_formatters.push_back(
2492 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2495 .SetCascades(true)
2496 .SetDontShowChildren(true)
2497 .SetHideItemNames(true)
2498 .SetShowMembersOneLiner(true)
2499 .SetSkipPointers(true)
2500 .SetSkipReferences(false),
2502 "block pointer summary provider"));
2503 if (valobj.GetCompilerType().IsBlockPointerType()) {
2504 return formatter_sp;
2505 }
2506 return nullptr;
2507 });
2508 });
2509
2510 return g_formatters;
2511}
2512
2515 static llvm::once_flag g_initialize;
2516 static ConstString g_vectortypes("VectorTypes");
2518
2519 llvm::call_once(g_initialize, []() -> void {
2520 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2523 static CXXSyntheticChildren::SharedPointer formatter_sp(
2526 .SetCascades(true)
2527 .SetSkipPointers(true)
2528 .SetSkipReferences(true)
2529 .SetNonCacheable(true),
2530 "vector_type synthetic children",
2532 if (valobj.GetCompilerType().IsVectorType()) {
2533 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2534 return formatter_sp;
2535 }
2536 return nullptr;
2537 });
2538 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2541 static CXXSyntheticChildren::SharedPointer formatter_sp(
2544 .SetCascades(true)
2545 .SetSkipPointers(true)
2546 .SetSkipReferences(true)
2547 .SetNonCacheable(true),
2548 "block pointer synthetic children",
2550 if (valobj.GetCompilerType().IsBlockPointerType()) {
2551 return formatter_sp;
2552 }
2553 return nullptr;
2554 });
2555 });
2556
2557 return g_formatters;
2558}
2559
2562 !valobj.IsPointerType())
2563 return false;
2564 bool canReadValue = true;
2565 bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
2566 return canReadValue && isZero;
2567}
2568
2569bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
2570 const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",
2571 ".h", ".hh", ".hpp", ".hxx", ".h++"};
2572 for (auto suffix : suffixes) {
2573 if (file_path.ends_with_insensitive(suffix))
2574 return true;
2575 }
2576
2577 // Check if we're in a STL path (where the files usually have no extension
2578 // that we could check for.
2579 return file_path.contains("/usr/include/c++/");
2580}
2581
2583 assert(sc.function);
2584
2585 if (sc.block)
2586 if (Block *inline_block = sc.block->GetContainingInlinedBlock())
2587 return inline_block->GetBlockVariableList(true);
2588
2589 return sc.function->GetBlock(true).GetBlockVariableList(true);
2590}
2591
2593 const ExecutionContext *exe_ctx,
2594 const SymbolContext &sc) {
2595 assert(sc.function);
2596
2597 ExecutionContextScope *exe_scope =
2598 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2599
2600 const char *cstr = sc.GetPossiblyInlinedFunctionName()
2602 .AsCString(nullptr);
2603 if (!cstr)
2604 return false;
2605
2606 VariableList args;
2607 if (auto variable_list_sp = GetFunctionVariableList(sc))
2609 args);
2610
2611 if (args.GetSize() > 0)
2612 return PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args);
2613
2614 // FIXME: can we just unconditionally call PrettyPrintFunctionNameWithArgs?
2615 // It should be able to handle the "no arguments" case.
2616 s.PutCString(cstr);
2617
2618 return true;
2619}
2620
2622 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2623 FunctionNameRepresentation representation, Stream &s) {
2624 switch (representation) {
2626 // Print the function name with arguments in it
2627 if (sc.function)
2628 return PrintFunctionNameWithArgs(s, exe_ctx, sc);
2629
2630 if (!sc.symbol)
2631 return false;
2632
2633 const char *cstr = sc.symbol->GetName().AsCString(nullptr);
2634 if (!cstr)
2635 return false;
2636
2637 s.PutCString(cstr);
2638
2639 return true;
2640 }
2643 return false;
2644 }
2645 llvm_unreachable("Fully covered switch above");
2646}
2647
2649 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2651 switch (type) {
2653 auto scope_or_err = ::GetDemangledScope(sc);
2654 if (!scope_or_err) {
2656 GetLog(LLDBLog::Language), scope_or_err.takeError(),
2657 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2658 return false;
2659 }
2660
2661 s << *scope_or_err;
2662
2663 return true;
2664 }
2665
2667 auto name_or_err = ::GetDemangledBasename(sc);
2668 if (!name_or_err) {
2670 GetLog(LLDBLog::Language), name_or_err.takeError(),
2671 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2672 return false;
2673 }
2674
2675 s << *name_or_err;
2676
2677 return true;
2678 }
2679
2681 auto template_args_or_err = ::GetDemangledTemplateArguments(sc);
2682 if (!template_args_or_err) {
2684 template_args_or_err.takeError(),
2685 "Failed to handle ${{function.template-arguments}} "
2686 "frame-format variable: {0}");
2687 return false;
2688 }
2689
2690 s << *template_args_or_err;
2691
2692 return true;
2693 }
2694
2696 // This ensures we print the arguments even when no debug-info is available.
2697 //
2698 // FIXME: we should have a Entry::Type::FunctionArguments and
2699 // use it in the plugin.cplusplus.display.function-name-format
2700 // once we have a "fallback operator" in the frame-format language.
2701 if (!sc.function && sc.symbol)
2702 return PrintDemangledArgumentList(s, sc);
2703
2704 VariableList args;
2705 if (auto variable_list_sp = GetFunctionVariableList(sc))
2707 args);
2708
2709 ExecutionContextScope *exe_scope =
2710 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2711
2712 s << '(';
2714 s << ')';
2715
2716 return true;
2717 }
2719 auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc);
2720 if (!return_rhs_or_err) {
2721 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(),
2722 "Failed to handle ${{function.return-right}} frame-format "
2723 "variable: {0}");
2724 return false;
2725 }
2726
2727 s << *return_rhs_or_err;
2728
2729 return true;
2730 }
2732 auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc);
2733 if (!return_lhs_or_err) {
2734 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(),
2735 "Failed to handle ${{function.return-left}} frame-format "
2736 "variable: {0}");
2737 return false;
2738 }
2739
2740 s << *return_lhs_or_err;
2741
2742 return true;
2743 }
2745 auto quals_or_err = ::GetDemangledFunctionQualifiers(sc);
2746 if (!quals_or_err) {
2747 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(),
2748 "Failed to handle ${{function.qualifiers}} frame-format "
2749 "variable: {0}");
2750 return false;
2751 }
2752
2753 s << *quals_or_err;
2754
2755 return true;
2756 }
2758 auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
2759 if (!suffix_or_err) {
2761 GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2762 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2763 return false;
2764 }
2765
2766 s << *suffix_or_err;
2767
2768 return true;
2769 }
2770 default:
2771 return false;
2772 }
2773}
2774
2775namespace {
2776class NodeAllocator {
2777 llvm::BumpPtrAllocator Alloc;
2778
2779public:
2780 void reset() { Alloc.Reset(); }
2781
2782 template <typename T, typename... Args> T *makeNode(Args &&...args) {
2783 return new (Alloc.Allocate(sizeof(T), alignof(T)))
2784 T(std::forward<Args>(args)...);
2785 }
2786
2787 void *allocateNodeArray(size_t sz) {
2788 return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
2789 alignof(llvm::itanium_demangle::Node *));
2790 }
2791};
2792
2793template <typename Derived>
2794class ManglingSubstitutor
2795 : public llvm::itanium_demangle::AbstractManglingParser<Derived,
2796 NodeAllocator> {
2797 using Base =
2798 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2799
2800public:
2801 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2802
2803 template <typename... Ts>
2804 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2805 Ts &&...Vals) {
2806 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2807 return substituteImpl(Mangled);
2808 }
2809
2810protected:
2811 void reset(llvm::StringRef Mangled) {
2812 Base::reset(Mangled.begin(), Mangled.end());
2813 Written = Mangled.begin();
2814 Result.clear();
2815 Substituted = false;
2816 }
2817
2818 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2819 if (this->parse() == nullptr)
2820 return llvm::createStringErrorV("failed to substitute mangling in '{0}'",
2821 Mangled);
2822
2823 if (!Substituted)
2824 return ConstString();
2825
2826 // Append any trailing unmodified input.
2827 appendUnchangedInput();
2828 return ConstString(Result);
2829 }
2830
2831 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2832 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2833 return;
2834
2835 // We found a match. Append unmodified input up to this point.
2836 appendUnchangedInput();
2837
2838 // And then perform the replacement.
2839 Result += To;
2840 Written += From.size();
2841 Substituted = true;
2842 }
2843
2844private:
2845 /// Input character until which we have constructed the respective output
2846 /// already.
2847 const char *Written = "";
2848
2849 llvm::SmallString<128> Result;
2850
2851 /// Whether we have performed any substitutions.
2852 bool Substituted = false;
2853
2854 const char *currentParserPos() const { return this->First; }
2855
2856 void appendUnchangedInput() {
2857 Result +=
2858 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2859 Written = currentParserPos();
2860 }
2861};
2862
2863/// Given a mangled function `Mangled`, replace all the primitive function type
2864/// arguments of `Search` with type `Replace`.
2865class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
2866 llvm::StringRef Search;
2867 llvm::StringRef Replace;
2868
2869public:
2870 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2871 llvm::StringRef Replace) {
2872 ManglingSubstitutor::reset(Mangled);
2873 this->Search = Search;
2874 this->Replace = Replace;
2875 }
2876
2877 llvm::itanium_demangle::Node *parseType() {
2878 trySubstitute(Search, Replace);
2879 return ManglingSubstitutor::parseType();
2880 }
2881};
2882
2883class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
2884 llvm::StringRef Search;
2885 llvm::StringRef Replace;
2886
2887public:
2888 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2889 llvm::StringRef Replace) {
2890 ManglingSubstitutor::reset(Mangled);
2891 this->Search = Search;
2892 this->Replace = Replace;
2893 }
2894
2895 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2896
2897 llvm::itanium_demangle::Node *
2898 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
2899 if (!Search.empty() && !Replace.empty()) {
2900 trySubstitute(Search, Replace);
2901 } else {
2902 trySubstitute("D1", "D2");
2903 trySubstitute("C1", "C2");
2904 }
2905 return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
2906 }
2907};
2908} // namespace
2909
2910llvm::Expected<ConstString>
2912 llvm::StringRef subst_from,
2913 llvm::StringRef subst_to) {
2914 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2915}
2916
2918 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2919 llvm::StringRef subst_to) {
2920 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2921}
2922
2923llvm::Expected<ConstString>
2925 llvm::StringRef mangled_name) {
2926 return CtorDtorSubstitutor().substitute(mangled_name);
2927}
2928
2929#define LLDB_PROPERTIES_language_cplusplus
2930#include "LanguageCPlusPlusProperties.inc"
2931
2932enum {
2933#define LLDB_PROPERTIES_language_cplusplus
2934#include "LanguageCPlusPlusPropertiesEnum.inc"
2935};
2936
2937namespace {
2938class PluginProperties : public Properties {
2939public:
2940 static llvm::StringRef GetSettingName() { return "display"; }
2941
2942 PluginProperties() {
2943 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2944 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2945 }
2946
2947 FormatEntity::Entry GetFunctionNameFormat() const {
2948 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2949 ePropertyFunctionNameFormat, {});
2950 }
2951};
2952} // namespace
2953
2954static PluginProperties &GetGlobalPluginProperties() {
2955 static PluginProperties g_settings;
2956 return g_settings;
2957}
2958
2962
2965 debugger, PluginProperties::GetSettingName())) {
2967 debugger, GetGlobalPluginProperties().GetValueProperties(),
2968 "Properties for the CPlusPlus language plug-in.",
2969 /*is_global_property=*/true);
2970 }
2971}
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 GenericAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
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 IsCPlusPlusManglingScheme(Mangled::ManglingScheme scheme)
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 Mangled::ManglingScheme g_itanium_scheme
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static std::pair< char *, DemangledNameInfo > GetItaniumDemangledStr(const char *M)
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericValarraySyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static lldb_private::SyntheticChildrenFrontEnd * GenericAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *children, const 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 bool SkipItaniumName(llvm::StringRef mangled)
Returns true for the Itanium names that aren't worth indexing as functions.
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 Mangled::ManglingScheme g_msvc_scheme
static DemangledNameInfoCache & GetDemangledInfoCache()
static lldb_private::SyntheticChildrenFrontEnd * GenericUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static char * GetMSVCDemangledStr(llvm::StringRef M)
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_LOGF(log,...)
Definition Log.h:389
#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
std::unique_ptr< MangledNameParser > CreateMangledNameParser(Mangled::ManglingScheme scheme) const override
Returns a parser for the names mangled with scheme, a scheme that this language registered,...
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
DemangledName DemangleSymbol(ConstString mangled, Mangled::ManglingScheme scheme, const DemangleOptions &options) const override
Demangle mangled, a name mangled with scheme, a scheme that this language registered with Mangled::Re...
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
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
static bool GetCategory(llvm::StringRef category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
A class to manage flag bits.
Definition Debugger.h:103
A cache from mangled names to DemangledNameInfo.
void SetMaxEntries(size_t max_entries)
Changes the maximum number of entries. A limit of 0 disables the cache.
std::optional< DemangledNameInfo > Get(const Mangled &mangled)
Calculates the DemangledNameInfo and caches the result.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
ExecutionContextScope * GetBestExecutionContextScope() const
lldb::TypeCategoryImplSP GetCategory(llvm::StringRef category_name, bool can_create=true)
Block & GetBlock(bool can_create)
Get accessor for the block list.
Definition Function.cpp:401
HardcodedFormatterFinders< SyntheticChildren > HardcodedSyntheticFinder
HardcodedFormatterFinders< TypeSummaryImpl > HardcodedSummaryFinder
Parses mangled function names.
Definition Language.h:356
llvm::StringRef GetQualifiers()
Definition Language.h:277
llvm::StringRef GetReturnType()
Definition Language.h:283
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:391
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:366
A class that handles mangled names.
Definition Mangled.h:36
static ManglingScheme RegisterManglingScheme(llvm::ArrayRef< llvm::StringRef > prefixes, lldb::LanguageType language, ManglingSchemeMatcher matches=nullptr)
Register a mangling scheme for language.
Definition Mangled.cpp:163
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:178
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:169
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:238
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:297
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:182
static void UnregisterManglingScheme(ManglingScheme scheme)
Stop recognizing the names of scheme, a scheme returned by RegisterManglingScheme().
Definition Mangled.cpp:169
static ModuleListProperties & GetGlobalModuleListProperties()
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static lldb::OptionValuePropertiesSP GetSettingForCPlusPlusLanguagePlugin(Debugger &debugger, llvm::StringRef setting_name)
static bool CreateSettingForCPlusPlusLanguagePlugin(Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, llvm::StringRef description, bool is_global_property)
static bool UnregisterPlugin(ABICreateInstance create_callback)
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition Stream.cpp:63
size_t PutChar(char ch)
Definition Stream.cpp:131
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
Symbol * symbol
The Symbol for a given query.
Mangled GetPossiblyInlinedFunctionName() const
If available, will return the function name according to the specified mangling preference.
Provides public interface for all SymbolFiles.
Definition SymbolFile.h:51
virtual void GetMangledNamesForFunction(const std::string &scope_qualified_name, std::vector< ConstString > &mangled_names)
ConstString GetName() const
Definition Symbol.cpp:615
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)
Status Parse(const llvm::StringRef &format, Entry &entry)
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 * LibStdcppAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, const 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 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 LibStdcppSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options, bool is_atomic_child=false)
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)
bool LibStdcppAtomicSummaryProvider(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)
bool IsMsvcStlAtomic(ValueObject &valobj, bool *is_smart_ptr=nullptr)
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++.
@ eLanguageTypeC_plus_plus
ISO C++:1998.
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.
How to demangle a name in DemangleSymbol().
Definition Language.h:334
bool want_info
Whether to compute the DemangledNameInfo too.
Definition Language.h:336
A demangled name and, if requested, where its parts begin and end.
Definition Language.h:340
std::optional< DemangledNameInfo > info
Only computed if DemangleOptions::want_info is true.
Definition Language.h:344
std::string name
Empty if the name couldn't be demangled.
Definition Language.h:342
ConstString basename
If empty, the symbol is only indexed by its mangled name.
Definition Mangled.h:65
ConstString decl_context
The enclosing context.
Definition Mangled.h:70
An OutputBuffer which keeps a record of where certain parts of a demangled name begin/end (e....
DemangledNameInfo NameInfo
Holds information about the demangled name that is being printed into this buffer.