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
68
72
73std::unique_ptr<Language::MethodName>
74CPlusPlusLanguage::GetMethodName(llvm::StringRef full_name) const {
75 std::unique_ptr<CxxMethodName> cpp_method =
76 std::make_unique<CxxMethodName>(full_name.str());
77 cpp_method->IsValid();
78 return cpp_method;
79}
80
81std::pair<FunctionNameType, std::optional<ConstString>>
84 return {eFunctionNameTypeFull, std::nullopt};
85
86 FunctionNameType func_name_type = eFunctionNameTypeNone;
87 CxxMethodName method(name.GetStringRef().str());
88 llvm::StringRef basename = method.GetBasename();
89 if (basename.empty()) {
90 llvm::StringRef context;
91 func_name_type |=
92 (ExtractContextAndIdentifier(name.GetStringRef(), context, basename)
93 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
94 : eFunctionNameTypeFull);
95 } else {
96 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
97 }
98
99 if (!method.GetQualifiers().empty()) {
100 // There is a 'const' or other qualifier following the end of the function
101 // parens, this can't be a eFunctionNameTypeBase.
102 func_name_type &= ~(eFunctionNameTypeBase);
103 }
104
105 if (basename.empty())
106 return {func_name_type, std::nullopt};
107 else
108 return {func_name_type, ConstString(basename)};
109}
110
112 auto mangling_scheme =
114 return HandlesManglingScheme(mangling_scheme);
115}
116
122
123static char *GetMSVCDemangledStr(llvm::StringRef M) {
124 char *demangled_cstr = llvm::microsoftDemangle(
125 M, nullptr, nullptr,
126 llvm::MSDemangleFlags(
127 llvm::MSDF_NoAccessSpecifier | llvm::MSDF_NoCallingConvention |
128 llvm::MSDF_NoMemberType | llvm::MSDF_NoVariableType));
129
130 if (Log *log = GetLog(LLDBLog::Demangle)) {
131 if (demangled_cstr && demangled_cstr[0])
132 LLDB_LOGF(log, "demangled msvc: %s -> \"%s\"", M.data(), demangled_cstr);
133 else
134 LLDB_LOGF(log, "demangled msvc: %s -> error", M.data());
135 }
136
137 return demangled_cstr;
138}
139
140static std::pair<char *, DemangledNameInfo>
142 char *demangled_cstr = nullptr;
143
145 llvm::ItaniumPartialDemangler ipd;
146 bool err = ipd.partialDemangle(M);
147 if (!err) {
148 // Default buffer and size (OutputBuffer will realloc in case it's too
149 // small).
150 size_t demangled_size = 80;
151 demangled_cstr = static_cast<char *>(std::malloc(80));
152
153 TrackingOutputBuffer OB(demangled_cstr, demangled_size);
154 demangled_cstr = ipd.finishDemangle(&OB);
155 info = std::move(OB.NameInfo);
156
157 assert(demangled_cstr &&
158 "finishDemangle must always succeed if partialDemangle did");
159 assert(demangled_cstr[OB.getCurrentPosition() - 1] == '\0' &&
160 "Expected demangled_size to return length including trailing null");
161 }
162
163 if (Log *log = GetLog(LLDBLog::Demangle)) {
164 if (demangled_cstr)
165 LLDB_LOGF(log, "demangled itanium: %s -> \"%s\"", M, demangled_cstr);
166 else
167 LLDB_LOGF(log, "demangled itanium: %s -> error: failed to demangle", M);
168
169 if (!info.hasBasename())
170 LLDB_LOGF(log,
171 "demangled itanium: %s -> error: failed to retrieve name info",
172 M);
173 }
174
175 return {demangled_cstr, std::move(info)};
176}
177
181 const DemangleOptions &options) const {
182 DemangledName demangled;
183 switch (scheme) {
185 auto [demangled_cstr, info] = GetItaniumDemangledStr(mangled.GetCString());
186 if (demangled_cstr) {
187 demangled.name = demangled_cstr;
188 std::free(demangled_cstr);
189 }
190 if (options.want_info)
191 demangled.info = std::move(info);
192 break;
193 }
195 if (char *demangled_cstr = GetMSVCDemangledStr(mangled.GetStringRef())) {
196 demangled.name = demangled_cstr;
197 std::free(demangled_cstr);
198 }
199 break;
200 default:
201 break;
202 }
203 return demangled;
204}
205
206/// Returns true for the Itanium names that aren't worth indexing as functions.
207static bool SkipItaniumName(llvm::StringRef mangled) {
208 if (mangled.size() < 3 || !mangled.starts_with("_Z"))
209 return true;
210
211 // Avoid the following types of symbols in the index.
212 switch (mangled[2]) {
213 case 'G': // guard variables
214 case 'T': // virtual tables, VTT structures, typeinfo structures + names
215 case 'Z': // named local entities (if we eventually handle
216 // eSymbolTypeData, we will want this back)
217 return true;
218
219 default:
220 return false;
221 }
222}
223
224namespace {
225/// Parses Itanium or MSVC mangled function names. Their mangling doesn't tell
226/// whether a declaration context is a class or a namespace.
227class CPlusPlusMangledNameParser : public Language::MangledNameParser {
228public:
229 explicit CPlusPlusMangledNameParser(Mangled::ManglingScheme scheme)
230 : m_scheme(scheme) {}
231
232 std::optional<Mangled::FunctionNameParts>
233 Parse(const Mangled &mangled) override {
234 if (!ParseRichManglingInfo(mangled))
235 return std::nullopt;
236
237 Mangled::FunctionNameParts parts;
238 llvm::StringRef base_name = m_rmc.ParseFunctionBaseName();
239 if (base_name.empty())
240 return parts;
241
242 // Parsing the context reuses the buffer that base_name points into.
243 parts.basename = ConstString(base_name);
244 llvm::StringRef decl_context = m_rmc.ParseFunctionDeclContextName();
245 if (decl_context.empty()) {
246 parts.kind = Mangled::FunctionNameKind::TopLevel;
247 return parts;
248 }
249
250 parts.decl_context = ConstString(decl_context);
251 parts.kind = m_rmc.IsCtorOrDtor()
252 ? Mangled::FunctionNameKind::ConstructorOrDestructor
253 : Mangled::FunctionNameKind::Unknown;
254 return parts;
255 }
256
257private:
258 bool ParseRichManglingInfo(const Mangled &mangled) {
259 ConstString mangled_name = mangled.GetMangledName();
260 if (m_scheme == Mangled::eManglingSchemeItanium)
261 return !SkipItaniumName(mangled_name) &&
262 m_rmc.FromItaniumName(mangled_name);
263
264 // There is no rich mangling info for MSVC names, so parse the demangled
265 // name with CPlusPlusLanguage::CxxMethodName instead.
266 ConstString demangled = mangled.GetDemangledName();
267 return !demangled.IsEmpty() && m_rmc.FromCxxMethodName(demangled);
268 }
269
271 /// Instantiation of the demangler is expensive, so better use a single one
272 /// for all entries during batch processing.
273 RichManglingContext m_rmc;
274};
275} // namespace
276
277std::unique_ptr<Language::MangledNameParser>
279 Mangled::ManglingScheme scheme) const {
280 if (!HandlesManglingScheme(scheme))
281 return nullptr;
282 return std::make_unique<CPlusPlusMangledNameParser>(scheme);
283}
284
286 Mangled mangled) const {
287 const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
288 ConstString demangled_name = mangled.GetDemangledName();
289 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
290 if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
291 (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
292 // typeinfo structure, and typeinfo
293 // mangled_name
294 mangled_name_cstr[2] != 'G' && // avoid guard variables
295 mangled_name_cstr[2] != 'Z')) // named local entities (if we
296 // eventually handle eSymbolTypeData,
297 // we will want this back)
298 {
299 CxxMethodName cxx_method(demangled_name.GetStringRef().str());
300 if (!cxx_method.GetBasename().empty()) {
301 std::string shortname;
302 if (!cxx_method.GetContext().empty())
303 shortname = cxx_method.GetContext().str() + "::";
304 shortname += cxx_method.GetBasename().str();
305 return ConstString(shortname);
306 }
307 }
308 }
309 if (demangled_name)
310 return demangled_name;
311 return mangled.GetMangledName();
312}
313
314// Static Functions
315
317 // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
318 if (Language::LanguageIsCPlusPlus(language) &&
319 language != eLanguageTypeObjC_plus_plus)
320 return new CPlusPlusLanguage();
321 return nullptr;
322}
323
324static bool ReverseFindMatchingChars(const llvm::StringRef &s,
325 const llvm::StringRef &left_right_chars,
326 size_t &left_pos, size_t &right_pos,
327 size_t pos = llvm::StringRef::npos) {
328 assert(left_right_chars.size() == 2);
329 left_pos = llvm::StringRef::npos;
330 const char left_char = left_right_chars[0];
331 const char right_char = left_right_chars[1];
332 pos = s.find_last_of(left_right_chars, pos);
333 if (pos == llvm::StringRef::npos || s[pos] == left_char)
334 return false;
335 right_pos = pos;
336 uint32_t depth = 1;
337 while (pos > 0 && depth > 0) {
338 pos = s.find_last_of(left_right_chars, pos);
339 if (pos == llvm::StringRef::npos)
340 return false;
341 if (s[pos] == left_char) {
342 if (--depth == 0) {
343 left_pos = pos;
344 return left_pos < right_pos;
345 }
346 } else if (s[pos] == right_char) {
347 ++depth;
348 }
349 }
350 return false;
351}
352
353static bool IsTrivialBasename(const llvm::StringRef &basename) {
354 // Check that the basename matches with the following regular expression
355 // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
356 // because it is significantly more efficient then using the general purpose
357 // regular expression library.
358 size_t idx = 0;
359 if (basename.starts_with('~'))
360 idx = 1;
361
362 if (basename.size() <= idx)
363 return false; // Empty string or "~"
364
365 if (!std::isalpha(static_cast<unsigned char>(basename[idx])) &&
366 basename[idx] != '_')
367 return false; // First character (after removing the possible '~'') isn't in
368 // [A-Za-z_]
369
370 // Read all characters matching [A-Za-z_0-9]
371 ++idx;
372 while (idx < basename.size()) {
373 if (!std::isalnum(static_cast<unsigned char>(basename[idx])) &&
374 basename[idx] != '_')
375 break;
376 ++idx;
377 }
378
379 // We processed all characters. It is a vaild basename.
380 return idx == basename.size();
381}
382
383/// A context is trivial if an only if it matches this pattern.
384/// "^\s*([A-Za-z_:]*)\s*$". for example function `foo::bar::func()`
385/// has a trivial context but. but `foo<int>::bar::func()` doesn't.
386static bool IsTrivialContext(llvm::StringRef context) {
387 // remove trailing or leading whitespace.
388 context = context.trim();
389
390 const auto iter = context.find_if_not([](char current) {
391 return std::isalnum(static_cast<unsigned char>(current)) ||
392 current == '_' || current == ':';
393 });
394 return iter == llvm::StringRef::npos;
395}
396
397/// Writes out the function name in 'full_name' to 'out_stream'
398/// but replaces each argument type with the variable name
399/// and the corresponding pretty-printed value
401 llvm::StringRef full_name,
402 ExecutionContextScope *exe_scope,
403 VariableList const &args) {
404 CPlusPlusLanguage::CxxMethodName cpp_method{full_name.str()};
405
406 if (!cpp_method.IsValid())
407 return false;
408
409 llvm::StringRef return_type = cpp_method.GetReturnType();
410 if (!return_type.empty()) {
411 out_stream.PutCString(return_type);
412 out_stream.PutChar(' ');
413 }
414
415 out_stream.PutCString(cpp_method.GetScopeQualifiedName());
416 out_stream.PutChar('(');
417
418 FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
419
420 out_stream.PutChar(')');
421
422 llvm::StringRef qualifiers = cpp_method.GetQualifiers();
423 if (!qualifiers.empty()) {
424 out_stream.PutChar(' ');
425 out_stream.PutCString(qualifiers);
426 }
427
428 return true;
429}
430
432 static DemangledNameInfoCache g_cache;
433 // Pick up any changes to the size the user made since the last call.
435 .GetDemangledNameInfoCacheSize());
436 return g_cache;
437}
438
439static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
442 if (!mangled)
443 return llvm::createStringError("function does not have a mangled name");
444
445 auto demangled_name = mangled.GetDemangledName().GetStringRef();
446 if (demangled_name.empty())
447 return llvm::createStringErrorV(
448 "function '{0}' does not have a demangled name",
449 mangled.GetMangledName());
450
451 std::optional<DemangledNameInfo> info = GetDemangledInfoCache().Get(mangled);
452 if (!info)
453 return llvm::createStringErrorV(
454 "function '{0}' does not have demangled info", demangled_name);
455
456 // Function without a basename is nonsense.
457 if (!info->hasBasename())
458 return llvm::createStringErrorV(
459 "demangled info for '{0}' does not have a basename range",
460 demangled_name);
461
462 return std::make_pair(demangled_name, *info);
463}
464
465static llvm::Expected<llvm::StringRef>
467 auto info_or_err = GetAndValidateInfo(sc);
468 if (!info_or_err)
469 return info_or_err.takeError();
470
471 auto [demangled_name, info] = *info_or_err;
472
473 return CPlusPlusLanguage::GetDemangledBasename(demangled_name, info);
474}
475
476llvm::StringRef
478 const DemangledNameInfo &info) {
479 assert(info.hasBasename());
480 return demangled.slice(info.BasenameRange.first, info.BasenameRange.second);
481}
482
483llvm::Expected<llvm::StringRef>
485 llvm::StringRef demangled, const DemangledNameInfo &info) {
486 if (!info.hasTemplateArguments())
487 return llvm::createStringErrorV(
488 "template arguments range for '{0}' is invalid", demangled);
489
490 return demangled.slice(info.TemplateArgumentsRange.first,
491 info.TemplateArgumentsRange.second);
492}
493
494static llvm::Expected<llvm::StringRef>
496 auto info_or_err = GetAndValidateInfo(sc);
497 if (!info_or_err)
498 return info_or_err.takeError();
499
500 auto [demangled_name, info] = *info_or_err;
501
502 return CPlusPlusLanguage::GetDemangledTemplateArguments(demangled_name, info);
503}
504
505llvm::Expected<llvm::StringRef>
507 const DemangledNameInfo &info) {
508 if (info.ScopeRange.first >= demangled.size())
509 return llvm::createStringErrorV(
510 "scope range for '{0}' LHS return type is invalid", demangled);
511
512 return demangled.substr(0, info.ScopeRange.first);
513}
514
515static llvm::Expected<llvm::StringRef>
517 auto info_or_err = GetAndValidateInfo(sc);
518 if (!info_or_err)
519 return info_or_err.takeError();
520
521 auto [demangled_name, info] = *info_or_err;
522
523 return CPlusPlusLanguage::GetDemangledReturnTypeLHS(demangled_name, info);
524}
525
526llvm::Expected<llvm::StringRef>
528 llvm::StringRef demangled, const DemangledNameInfo &info) {
529 if (!info.hasQualifiers())
530 return llvm::createStringErrorV("qualifiers range for '{0}' is invalid",
531 demangled);
532
533 return demangled.slice(info.QualifiersRange.first,
534 info.QualifiersRange.second);
535}
536
537static llvm::Expected<llvm::StringRef>
539 auto info_or_err = GetAndValidateInfo(sc);
540 if (!info_or_err)
541 return info_or_err.takeError();
542
543 auto [demangled_name, info] = *info_or_err;
544
546 info);
547}
548
549llvm::Expected<llvm::StringRef>
551 const DemangledNameInfo &info) {
552 if (info.QualifiersRange.first < info.ArgumentsRange.second)
553 return llvm::createStringErrorV(
554 "qualifiers range for '{0}' RHS return type is invalid", demangled);
555
556 return demangled.slice(info.ArgumentsRange.second,
557 info.QualifiersRange.first);
558}
559
560static llvm::Expected<llvm::StringRef>
562 auto info_or_err = GetAndValidateInfo(sc);
563 if (!info_or_err)
564 return info_or_err.takeError();
565
566 auto [demangled_name, info] = *info_or_err;
567
568 return CPlusPlusLanguage::GetDemangledReturnTypeRHS(demangled_name, info);
569}
570
571llvm::Expected<llvm::StringRef>
572CPlusPlusLanguage::GetDemangledScope(llvm::StringRef demangled,
573 const DemangledNameInfo &info) {
574 if (!info.hasScope())
575 return llvm::createStringErrorV("scope range for '{0}' is invalid",
576 demangled);
577
578 return demangled.slice(info.ScopeRange.first, info.ScopeRange.second);
579}
580
581static llvm::Expected<llvm::StringRef>
583 auto info_or_err = GetAndValidateInfo(sc);
584 if (!info_or_err)
585 return info_or_err.takeError();
586
587 auto [demangled_name, info] = *info_or_err;
588
589 return CPlusPlusLanguage::GetDemangledScope(demangled_name, info);
590}
591
592llvm::Expected<llvm::StringRef>
594 const DemangledNameInfo &info) {
595 if (!info.hasSuffix())
596 return llvm::createStringErrorV("suffix range for '{0}' is invalid",
597 demangled);
598
599 return demangled.slice(info.SuffixRange.first, info.SuffixRange.second);
600}
601
602static llvm::Expected<llvm::StringRef>
604 auto info_or_err = GetAndValidateInfo(sc);
605 if (!info_or_err)
606 return info_or_err.takeError();
607
608 auto [demangled_name, info] = *info_or_err;
609
610 return CPlusPlusLanguage::GetDemangledFunctionSuffix(demangled_name, info);
611}
612
613llvm::Expected<llvm::StringRef>
615 llvm::StringRef demangled, const DemangledNameInfo &info) {
616 if (!info.hasArguments())
617 return llvm::createStringErrorV(
618 "function arguments range for '{0}' is invalid", demangled);
619
620 return demangled.slice(info.ArgumentsRange.first, info.ArgumentsRange.second);
621}
622
624 assert(sc.symbol);
625
626 auto info_or_err = GetAndValidateInfo(sc);
627 if (!info_or_err) {
628 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), info_or_err.takeError(),
629 "Failed to handle ${{function.formatted-arguments}} "
630 "frame-format variable: {0}");
631 return false;
632 }
633
634 auto [demangled_name, info] = *info_or_err;
635
636 auto args_or_err =
638 if (!args_or_err) {
639 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), args_or_err.takeError(),
640 "Failed to handle ${{function.formatted-arguments}} "
641 "frame-format variable: {0}");
642 return false;
643 }
644
645 s << *args_or_err;
646
647 return true;
648}
649
651 // This method tries to parse simple method definitions which are presumably
652 // most comman in user programs. Definitions that can be parsed by this
653 // function don't have return types and templates in the name.
654 // A::B::C::fun(std::vector<T> &) const
655 size_t arg_start, arg_end;
656 llvm::StringRef full(m_full);
657 llvm::StringRef parens("()", 2);
658 if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
659 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
660 if (arg_end + 1 < full.size())
661 m_qualifiers = full.substr(arg_end + 1).ltrim();
662
663 if (arg_start == 0)
664 return false;
665 size_t basename_end = arg_start;
666 size_t context_start = 0;
667 size_t context_end = full.rfind(':', basename_end);
668 if (context_end == llvm::StringRef::npos)
669 m_basename = full.substr(0, basename_end);
670 else {
671 if (context_start < context_end)
672 m_context = full.substr(context_start, context_end - 1 - context_start);
673 const size_t basename_begin = context_end + 1;
674 m_basename = full.substr(basename_begin, basename_end - basename_begin);
675 }
676
678 return true;
679 }
680 // The C++ basename doesn't match our regular expressions so this can't
681 // be a valid C++ method, clear everything out and indicate an error
682 m_context = llvm::StringRef();
683 m_basename = llvm::StringRef();
684 m_arguments = llvm::StringRef();
685 m_qualifiers = llvm::StringRef();
686 m_return_type = llvm::StringRef();
687 return false;
688 }
689 return false;
690}
691
693 if (!m_parsed && !m_full.empty()) {
694 if (TrySimplifiedParse()) {
695 m_parse_error = false;
696 } else {
698 if (auto function = parser.ParseAsFunctionDefinition()) {
699 m_basename = function->name.basename;
700 m_context = function->name.context;
701 m_arguments = function->arguments;
702 m_qualifiers = function->qualifiers;
703 m_return_type = function->return_type;
704 m_parse_error = false;
705 } else {
706 m_parse_error = true;
707 }
708 }
709 if (m_context.empty()) {
710 m_scope_qualified = std::string(m_basename);
711 } else {
713 m_scope_qualified += "::";
715 }
716 m_parsed = true;
717 }
718}
719
720llvm::StringRef
722 llvm::StringRef basename = GetBasename();
723 size_t arg_start, arg_end;
724 llvm::StringRef parens("<>", 2);
725 if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
726 return basename.substr(0, arg_start);
727
728 return basename;
729}
730
732 if (!m_parsed)
733 Parse();
734
735 // If we can't parse the incoming name, then just check that it contains path.
736 if (m_parse_error)
737 return llvm::StringRef(m_full).contains(path);
738
739 llvm::StringRef identifier;
740 llvm::StringRef context;
741 const bool success =
742 CPlusPlusLanguage::ExtractContextAndIdentifier(path, context, identifier);
743 if (!success)
744 return llvm::StringRef(m_full).contains(path);
745
746 // Basename may include template arguments.
747 // E.g.,
748 // GetBaseName(): func<int>
749 // identifier : func
750 //
751 // ...but we still want to account for identifiers with template parameter
752 // lists, e.g., when users set breakpoints on template specializations.
753 //
754 // E.g.,
755 // GetBaseName(): func<uint32_t>
756 // identifier : func<int32_t*>
757 //
758 // Try to match the basename with or without template parameters.
759 if (GetBasename() != identifier &&
760 GetBasenameNoTemplateParameters() != identifier)
761 return false;
762
763 // Incoming path only had an identifier, so we match.
764 if (context.empty())
765 return true;
766 // Incoming path has context but this method does not, no match.
767 if (m_context.empty())
768 return false;
769
770 llvm::StringRef haystack = m_context;
771 if (!haystack.consume_back(context))
772 return false;
773 if (haystack.empty() || !isalnum(haystack.back()))
774 return true;
775
776 return false;
777}
778
780 ConstString demangled) const {
781 CxxMethodName demangled_name(demangled.GetStringRef().str());
782 return demangled_name.ContainsPath(path);
783}
784
786 llvm::StringRef name, llvm::StringRef &context,
787 llvm::StringRef &identifier) {
790 identifier);
791
792 CPlusPlusNameParser parser(name);
793 if (auto full_name = parser.ParseAsFullName()) {
794 identifier = full_name->basename;
795 context = full_name->context;
796 return true;
797 }
798 return false;
799}
800
802 const ConstString mangled_name) const {
803 std::vector<ConstString> alternates;
804
805 /// Get a basic set of alternative manglings for the given symbol `name`, by
806 /// making a few basic possible substitutions on basic types, storage duration
807 /// and `const`ness for the given symbol. The output parameter `alternates`
808 /// is filled with a best-guess, non-exhaustive set of different manglings
809 /// for the given name.
810
811 // Maybe we're looking for a const symbol but the debug info told us it was
812 // non-const...
813 if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
814 strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
815 std::string fixed_scratch("_ZNK");
816 fixed_scratch.append(mangled_name.GetCString() + 3);
817 alternates.push_back(ConstString(fixed_scratch));
818 }
819
820 // Maybe we're looking for a static symbol but we thought it was global...
821 if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
822 strncmp(mangled_name.GetCString(), "_ZL", 3)) {
823 std::string fixed_scratch("_ZL");
824 fixed_scratch.append(mangled_name.GetCString() + 2);
825 alternates.push_back(ConstString(fixed_scratch));
826 }
827
828 auto *log = GetLog(LLDBLog::Language);
829
830 // `char` is implementation defined as either `signed` or `unsigned`. As a
831 // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
832 // char, 'h'-unsigned char. If we're looking for symbols with a signed char
833 // parameter, try finding matches which have the general case 'c'.
834 if (auto char_fixup_or_err =
835 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "a", "c")) {
836 // LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
837 if (*char_fixup_or_err)
838 alternates.push_back(*char_fixup_or_err);
839 } else
840 LLDB_LOG_ERROR(log, char_fixup_or_err.takeError(),
841 "Failed to substitute 'char' type mangling: {0}");
842
843 // long long parameter mangling 'x', may actually just be a long 'l' argument
844 if (auto long_fixup_or_err =
845 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "x", "l")) {
846 if (*long_fixup_or_err)
847 alternates.push_back(*long_fixup_or_err);
848 } else
849 LLDB_LOG_ERROR(log, long_fixup_or_err.takeError(),
850 "Failed to substitute 'long long' type mangling: {0}");
851
852 // unsigned long long parameter mangling 'y', may actually just be unsigned
853 // long 'm' argument
854 if (auto ulong_fixup_or_err =
855 SubstituteType_ItaniumMangle(mangled_name.GetStringRef(), "y", "m")) {
856 if (*ulong_fixup_or_err)
857 alternates.push_back(*ulong_fixup_or_err);
858 } else
860 log, ulong_fixup_or_err.takeError(),
861 "Failed to substitute 'unsigned long long' type mangling: {0}");
862
863 if (auto ctor_fixup_or_err = SubstituteStructorAliases_ItaniumMangle(
864 mangled_name.GetStringRef())) {
865 if (*ctor_fixup_or_err) {
866 alternates.push_back(*ctor_fixup_or_err);
867 }
868 } else
869 LLDB_LOG_ERROR(log, ctor_fixup_or_err.takeError(),
870 "Failed to substitute structor alias manglings: {0}");
871
872 return alternates;
873}
874
876 const Mangled mangled, const SymbolContext &sym_ctx) const {
877 ConstString demangled = mangled.GetDemangledName();
878 if (!demangled)
879 return ConstString();
880
881 CxxMethodName cpp_name(demangled.GetStringRef().str());
882 std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
883
884 if (!scope_qualified_name.size())
885 return ConstString();
886
887 if (!sym_ctx.module_sp)
888 return ConstString();
889
890 lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
891 if (!sym_file)
892 return ConstString();
893
894 std::vector<ConstString> alternates;
895 sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
896
897 std::vector<ConstString> param_and_qual_matches;
898 std::vector<ConstString> param_matches;
899 for (size_t i = 0; i < alternates.size(); i++) {
900 ConstString alternate_mangled_name = alternates[i];
901 Mangled mangled(alternate_mangled_name);
902 ConstString demangled = mangled.GetDemangledName();
903
904 CxxMethodName alternate_cpp_name(demangled.GetStringRef().str());
905 if (!cpp_name.IsValid())
906 continue;
907
908 if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
909 if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
910 param_and_qual_matches.push_back(alternate_mangled_name);
911 else
912 param_matches.push_back(alternate_mangled_name);
913 }
914 }
915
916 if (param_and_qual_matches.size())
917 return param_and_qual_matches[0]; // It is assumed that there will be only
918 // one!
919 else if (param_matches.size())
920 return param_matches[0]; // Return one of them as a best match
921 else
922 return ConstString();
923}
924
925static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
926 if (!cpp_category_sp)
927 return;
928
929 TypeSummaryImpl::Flags stl_summary_flags;
930 stl_summary_flags.SetCascades(true)
931 .SetSkipPointers(false)
932 .SetSkipReferences(false)
934 .SetDontShowValue(false)
936 .SetHideItemNames(false);
937
938 AddCXXSummary(cpp_category_sp,
940 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
941 stl_summary_flags, true);
942 AddCXXSummary(cpp_category_sp,
944 "std::string summary provider",
945 "^std::__[[:alnum:]]+::basic_string<char, "
946 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
947 stl_summary_flags, true);
948 AddCXXSummary(cpp_category_sp,
950 "std::string summary provider",
951 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
952 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
953 stl_summary_flags, true);
954
955 AddCXXSummary(cpp_category_sp,
957 "std::u16string summary provider",
958 "^std::__[[:alnum:]]+::basic_string<char16_t, "
959 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
960 stl_summary_flags, true);
961
962 AddCXXSummary(cpp_category_sp,
964 "std::u32string summary provider",
965 "^std::__[[:alnum:]]+::basic_string<char32_t, "
966 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
967 stl_summary_flags, true);
968
969 AddCXXSummary(cpp_category_sp,
971 "std::wstring summary provider",
972 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
973 AddCXXSummary(cpp_category_sp,
975 "std::wstring summary provider",
976 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
977 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
978 stl_summary_flags, true);
979
980 AddCXXSummary(cpp_category_sp,
982 "std::string_view summary provider",
983 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
984 AddCXXSummary(cpp_category_sp,
986 "std::string_view summary provider",
987 "^std::__[[:alnum:]]+::basic_string_view<char, "
988 "std::__[[:alnum:]]+::char_traits<char> >$",
989 stl_summary_flags, true);
990 AddCXXSummary(cpp_category_sp,
992 "std::string_view summary provider",
993 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
994 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
995 stl_summary_flags, true);
996
997 AddCXXSummary(cpp_category_sp,
999 "std::u16string_view summary provider",
1000 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
1001 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
1002 stl_summary_flags, true);
1003
1004 AddCXXSummary(cpp_category_sp,
1006 "std::u32string_view summary provider",
1007 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
1008 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
1009 stl_summary_flags, true);
1010
1011 AddCXXSummary(cpp_category_sp,
1013 "std::wstring_view summary provider",
1014 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
1015 AddCXXSummary(cpp_category_sp,
1017 "std::wstring_view summary provider",
1018 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
1019 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
1020 stl_summary_flags, true);
1021
1022 SyntheticChildren::Flags stl_synth_flags;
1023 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1024 false);
1025 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1026 stl_deref_flags.SetFrontEndWantsDereference();
1027
1029 cpp_category_sp,
1031 "libc++ std::bitset synthetic children",
1032 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
1034 cpp_category_sp,
1036 "libc++ std::vector synthetic children",
1037 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
1039 cpp_category_sp,
1041 "libc++ std::valarray synthetic children",
1042 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
1044 cpp_category_sp,
1046 "libc++ std::slice_array synthetic children",
1047 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
1049 cpp_category_sp,
1051 "libc++ synthetic children for the valarray proxy arrays",
1052 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1053 stl_deref_flags, true);
1055 cpp_category_sp,
1057 "libc++ std::forward_list synthetic children",
1058 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
1060 cpp_category_sp,
1062 "libc++ std::list synthetic children", "^std::__[[:alnum:]]+::list<.+>$",
1063 stl_deref_flags, true);
1065 cpp_category_sp,
1067 "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
1068 stl_synth_flags, true);
1070 cpp_category_sp,
1072 "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
1073 stl_deref_flags, true);
1075 cpp_category_sp,
1077 "libc++ std::multiset synthetic children",
1078 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
1080 cpp_category_sp,
1082 "libc++ std::multimap synthetic children",
1083 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
1085 cpp_category_sp,
1087 "libc++ std::unordered containers synthetic children",
1088 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1089 stl_synth_flags, true);
1091 "libc++ std::queue synthetic children",
1092 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
1094 "libc++ std::tuple synthetic children",
1095 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
1097 "libc++ std::optional synthetic children",
1098 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
1100 "libc++ std::variant synthetic children",
1101 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
1103 cpp_category_sp,
1105 "libc++ std::atomic synthetic children",
1106 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
1108 cpp_category_sp,
1110 "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
1111 stl_deref_flags, true);
1113 cpp_category_sp,
1115 "libc++ std::ranges::ref_view synthetic children",
1116 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
1117
1118 cpp_category_sp->AddTypeSynthetic(
1119 "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
1121 stl_synth_flags,
1122 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
1123
1125 cpp_category_sp,
1127 "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
1128 stl_synth_flags, true);
1129
1130 static constexpr const char *const libcxx_std_unique_ptr_regex =
1131 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
1133 cpp_category_sp,
1135 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
1136 stl_synth_flags, true);
1137
1139 cpp_category_sp,
1141 "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
1142 stl_synth_flags, true);
1143 AddCXXSummary(cpp_category_sp,
1145 "libc++ std::function summary provider",
1146 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
1147
1148 static constexpr const char *const libcxx_std_coroutine_handle_regex =
1149 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
1151 cpp_category_sp,
1153 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
1154 stl_deref_flags, true);
1155
1156 stl_summary_flags.SetDontShowChildren(false);
1157 stl_summary_flags.SetSkipPointers(false);
1158 AddCXXSummary(cpp_category_sp,
1160 "libc++ std::bitset summary provider",
1161 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
1162 AddCXXSummary(cpp_category_sp,
1164 "libc++ std::vector summary provider",
1165 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
1166 AddCXXSummary(cpp_category_sp,
1168 "libc++ std::valarray summary provider",
1169 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
1170 AddCXXSummary(cpp_category_sp,
1172 "libc++ std::slice_array summary provider",
1173 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
1174 true);
1175 AddCXXSummary(cpp_category_sp,
1177 "libc++ summary provider for the valarray proxy arrays",
1178 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1179 stl_summary_flags, true);
1182 "libc++ std::list summary provider",
1183 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
1184 AddCXXSummary(cpp_category_sp,
1186 "libc++ std::list summary provider",
1187 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags, true);
1188 AddCXXSummary(cpp_category_sp,
1190 "libc++ std::map summary provider",
1191 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
1192 AddCXXSummary(cpp_category_sp,
1194 "libc++ std::deque summary provider",
1195 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
1196 AddCXXSummary(cpp_category_sp,
1198 "libc++ std::queue summary provider",
1199 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
1200 AddCXXSummary(cpp_category_sp,
1202 "libc++ std::set summary provider",
1203 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
1204 AddCXXSummary(cpp_category_sp,
1206 "libc++ std::multiset summary provider",
1207 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
1208 AddCXXSummary(cpp_category_sp,
1210 "libc++ std::multimap summary provider",
1211 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
1212 AddCXXSummary(cpp_category_sp,
1214 "libc++ std::unordered containers summary provider",
1215 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1216 stl_summary_flags, true);
1218 "libc++ std::tuple summary provider",
1219 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
1220 AddCXXSummary(cpp_category_sp,
1222 "libc++ std::atomic summary provider",
1223 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
1224 AddCXXSummary(cpp_category_sp,
1226 "libc++ std::optional summary provider",
1227 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
1228 AddCXXSummary(cpp_category_sp,
1230 "libc++ std::variant summary provider",
1231 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
1232 AddCXXSummary(cpp_category_sp,
1234 "libc++ std::span summary provider",
1235 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
1236
1237 stl_summary_flags.SetSkipPointers(true);
1238
1239 AddCXXSummary(cpp_category_sp,
1241 "libc++ std::shared_ptr summary provider",
1242 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1243 true);
1244 AddCXXSummary(cpp_category_sp,
1246 "libc++ std::weak_ptr summary provider",
1247 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
1248 AddCXXSummary(cpp_category_sp,
1250 "libc++ std::unique_ptr summary provider",
1251 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
1252
1253 AddCXXSummary(cpp_category_sp,
1255 "libc++ std::coroutine_handle summary provider",
1256 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
1257
1259 cpp_category_sp,
1261 "std::vector iterator synthetic children",
1262 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
1263
1265 cpp_category_sp,
1267 "std::map iterator synthetic children",
1268 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1269 true);
1270
1271 AddCXXSynthetic(cpp_category_sp,
1274 "std::unordered_map iterator synthetic children",
1275 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1276 stl_synth_flags, true);
1277 // Chrono duration typedefs
1278 cpp_category_sp->AddTypeSummary(
1279 "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
1281 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
1282 cpp_category_sp->AddTypeSummary(
1283 "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
1285 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
1286 cpp_category_sp->AddTypeSummary(
1287 "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
1289 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
1290 cpp_category_sp->AddTypeSummary(
1291 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1293 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1294 cpp_category_sp->AddTypeSummary(
1295 "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
1296 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1297 eTypeOptionHideValue,
1298 "${var.__rep_} min")));
1299 cpp_category_sp->AddTypeSummary(
1300 "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
1302 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
1303
1304 cpp_category_sp->AddTypeSummary(
1305 "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
1306 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1307 eTypeOptionHideValue,
1308 "${var.__rep_} days")));
1309 cpp_category_sp->AddTypeSummary(
1310 "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
1311 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1312 eTypeOptionHideValue,
1313 "${var.__rep_} weeks")));
1314 cpp_category_sp->AddTypeSummary(
1315 "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
1316 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1317 eTypeOptionHideValue,
1318 "${var.__rep_} months")));
1319 cpp_category_sp->AddTypeSummary(
1320 "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
1321 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1322 eTypeOptionHideValue,
1323 "${var.__rep_} years")));
1324 cpp_category_sp->AddTypeSummary(
1325 "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
1327 eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1328
1329 // Chrono time point types
1330
1331 AddCXXSummary(cpp_category_sp,
1333 "libc++ std::chrono::sys_seconds summary provider",
1334 "^std::__[[:alnum:]]+::chrono::time_point<"
1335 "std::__[[:alnum:]]+::chrono::system_clock, "
1336 "std::__[[:alnum:]]+::chrono::duration<.*, "
1337 "std::__[[:alnum:]]+::ratio<1, 1> "
1338 "> >$",
1339 eTypeOptionHideChildren | eTypeOptionHideValue |
1340 eTypeOptionCascade,
1341 true);
1342 AddCXXSummary(cpp_category_sp,
1344 "libc++ std::chrono::sys_seconds summary provider",
1345 "^std::__[[:alnum:]]+::chrono::time_point<"
1346 "std::__[[:alnum:]]+::chrono::system_clock, "
1347 "std::__[[:alnum:]]+::chrono::duration<int, "
1348 "std::__[[:alnum:]]+::ratio<86400, 1> "
1349 "> >$",
1350 eTypeOptionHideChildren | eTypeOptionHideValue |
1351 eTypeOptionCascade,
1352 true);
1353
1355 cpp_category_sp,
1357 "libc++ std::chrono::local_seconds summary provider",
1358 "^std::__[[:alnum:]]+::chrono::time_point<"
1359 "std::__[[:alnum:]]+::chrono::local_t, "
1360 "std::__[[:alnum:]]+::chrono::duration<.*, "
1361 "std::__[[:alnum:]]+::ratio<1, 1> "
1362 "> >$",
1363 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1364 true);
1365 AddCXXSummary(cpp_category_sp,
1367 "libc++ std::chrono::local_seconds summary provider",
1368 "^std::__[[:alnum:]]+::chrono::time_point<"
1369 "std::__[[:alnum:]]+::chrono::local_t, "
1370 "std::__[[:alnum:]]+::chrono::duration<int, "
1371 "std::__[[:alnum:]]+::ratio<86400, 1> "
1372 "> >$",
1373 eTypeOptionHideChildren | eTypeOptionHideValue |
1374 eTypeOptionCascade,
1375 true);
1376
1377 // Chrono calendar types
1378
1379 cpp_category_sp->AddTypeSummary(
1380 "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1381 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1382 eTypeOptionHideValue,
1383 "day=${var.__d_%u}")));
1384
1385 AddCXXSummary(cpp_category_sp,
1387 "libc++ std::chrono::month summary provider",
1388 "^std::__[[:alnum:]]+::chrono::month$",
1389 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1390
1391 cpp_category_sp->AddTypeSummary(
1392 "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1394 eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1395
1396 AddCXXSummary(cpp_category_sp,
1398 "libc++ std::chrono::weekday summary provider",
1399 "^std::__[[:alnum:]]+::chrono::weekday$",
1400 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1401
1402 cpp_category_sp->AddTypeSummary(
1403 "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
1405 eTypeOptionHideChildren | eTypeOptionHideValue,
1406 "${var.__wd_} index=${var.__idx_%u}")));
1407
1408 cpp_category_sp->AddTypeSummary(
1409 "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
1410 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1411 eTypeOptionHideValue,
1412 "${var.__wd_} index=last")));
1413 cpp_category_sp->AddTypeSummary(
1414 "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1415 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1416 eTypeOptionHideValue,
1417 "${var.__m_} ${var.__d_}")));
1418 cpp_category_sp->AddTypeSummary(
1419 "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1420 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1421 eTypeOptionHideValue,
1422 "${var.__m_} day=last")));
1423
1424 cpp_category_sp->AddTypeSummary(
1425 "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
1426 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1427 eTypeOptionHideValue,
1428 "${var.__m_} ${var.__wdi_}")));
1429
1430 cpp_category_sp->AddTypeSummary(
1431 "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
1432 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1433 eTypeOptionHideValue,
1434 "${var.__m_} ${var.__wdl_}")));
1435
1436 cpp_category_sp->AddTypeSummary(
1437 "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
1438 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1439 eTypeOptionHideValue,
1440 "${var.__y_} ${var.__m_}")));
1441
1443 cpp_category_sp,
1445 "libc++ std::chrono::year_month_day summary provider",
1446 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1447 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1448
1449 cpp_category_sp->AddTypeSummary(
1450 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1452 TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1453 eTypeOptionHideValue,
1454 "${var.__y_} ${var.__mdl_}")));
1455
1456 cpp_category_sp->AddTypeSummary(
1457 "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
1459 eTypeOptionHideChildren | eTypeOptionHideValue,
1460 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1461
1462 cpp_category_sp->AddTypeSummary(
1463 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1466 eTypeOptionHideChildren | eTypeOptionHideValue,
1467 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1468
1469 AddCXXSummary(cpp_category_sp,
1471 "libc++ std::partial_ordering summary provider",
1472 "^std::__[[:alnum:]]+::partial_ordering$",
1473 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1474 AddCXXSummary(cpp_category_sp,
1476 "libc++ std::weak_ordering summary provider",
1477 "^std::__[[:alnum:]]+::weak_ordering$",
1478 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1479 AddCXXSummary(cpp_category_sp,
1481 "libc++ std::strong_ordering summary provider",
1482 "^std::__[[:alnum:]]+::strong_ordering$",
1483 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1484
1485 AddCXXSummary(cpp_category_sp,
1487 "libc++ std::source_location summary provider",
1488 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1489 true);
1490}
1491
1493 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1494 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1495 auto makeSpecifier = [](llvm::StringRef name) {
1496 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1497 name, eFormatterMatchExact);
1498 };
1499
1500 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1501
1502 category_sp->AddTypeSummary(
1503 makeSpecifier(llvm::formatv("std::basic_string<{}>", char_ty).str()),
1504 summary_sp);
1505
1506 category_sp->AddTypeSummary(
1507 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1508 llvm::formatv("^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1509 char_ty)
1510 .str(),
1512 summary_sp);
1513}
1514
1516 const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty,
1517 llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp) {
1518 // std::string_view
1519 category_sp->AddTypeSummary(
1520 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1521 string_ty, eFormatterMatchExact),
1522 summary_sp);
1523
1524 // std::basic_string_view<char, std::char_traits<char>>
1525 // NativePDB has spaces at different positions compared to PDB and DWARF, so
1526 // use a regex and make them optional.
1527 category_sp->AddTypeSummary(
1528 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1529 llvm::formatv(
1530 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1531 char_ty)
1532 .str(),
1534 summary_sp);
1535}
1536
1538 if (!cpp_category_sp)
1539 return;
1540
1541 TypeSummaryImpl::Flags stl_summary_flags;
1542 stl_summary_flags.SetCascades(true)
1543 .SetSkipPointers(false)
1544 .SetSkipReferences(false)
1545 .SetDontShowChildren(true)
1546 .SetDontShowValue(false)
1548 .SetHideItemNames(false);
1549
1551 stl_summary_flags, LibStdcppStringSummaryProvider,
1552 "libstdc++ std::(w)string summary provider"));
1553 cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1554 string_summary_sp);
1555 cpp_category_sp->AddTypeSummary(
1556 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1557 eFormatterMatchRegex, string_summary_sp);
1558 cpp_category_sp->AddTypeSummary("^std::__cxx11::basic_string<unsigned char, "
1559 "std::char_traits<unsigned char>,.*>$",
1560 eFormatterMatchRegex, string_summary_sp);
1561
1562 cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1563 string_summary_sp);
1564 cpp_category_sp->AddTypeSummary(
1565 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1566 eFormatterMatchRegex, string_summary_sp);
1567
1568 SyntheticChildren::Flags stl_synth_flags;
1569 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1570 false);
1571 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1572 stl_deref_flags.SetFrontEndWantsDereference();
1573
1574 cpp_category_sp->AddTypeSynthetic(
1575 "^std::__debug::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1577 stl_synth_flags,
1578 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1579 cpp_category_sp->AddTypeSynthetic(
1580 "^std::__debug::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1582 stl_synth_flags,
1583 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1584 cpp_category_sp->AddTypeSynthetic(
1585 "^std::__debug::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1587 stl_deref_flags,
1588 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1589 cpp_category_sp->AddTypeSynthetic(
1590 "^std::__debug::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1592 stl_deref_flags,
1593 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1594 cpp_category_sp->AddTypeSynthetic(
1595 "^std::__debug::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1597 stl_deref_flags,
1598 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1599 cpp_category_sp->AddTypeSynthetic(
1600 "^std::__debug::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1602 stl_deref_flags,
1603 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1604 cpp_category_sp->AddTypeSynthetic(
1605 "^std::__debug::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1607 stl_deref_flags,
1608 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1609 cpp_category_sp->AddTypeSynthetic(
1610 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", eFormatterMatchRegex,
1612 stl_deref_flags,
1613 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1614 cpp_category_sp->AddTypeSynthetic(
1615 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1617 stl_synth_flags,
1618 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1619
1620 stl_summary_flags.SetDontShowChildren(false);
1621 stl_summary_flags.SetSkipPointers(false);
1622
1623 AddCXXSummary(cpp_category_sp,
1625 "libstdc++ std::bitset summary provider",
1626 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags, true);
1627
1628 AddCXXSummary(cpp_category_sp,
1630 "libstdc++ std::__debug::vector summary provider",
1631 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags, true);
1632
1633 AddCXXSummary(cpp_category_sp,
1635 "libstdc++ debug std::map summary provider",
1636 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags, true);
1637
1638 AddCXXSummary(cpp_category_sp,
1640 "libstdc++ debug std::set summary provider",
1641 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags, true);
1642
1644 "libstdc++ debug std::deque summary provider",
1645 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags, true);
1646
1649 "libstdc++ debug std::multimap summary provider",
1650 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags, true);
1651
1654 "libstdc++ debug std::multiset summary provider",
1655 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags, true);
1656
1657 AddCXXSummary(cpp_category_sp,
1659 "libstdc++ debug std unordered container summary provider",
1660 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1661 stl_summary_flags, true);
1662
1665 "libstdc++ debug std::list summary provider",
1666 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags, true);
1667
1668 cpp_category_sp->AddTypeSummary(
1669 "^std::__(debug|cxx11)::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1671 stl_summary_flags,
1672 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1673
1675 cpp_category_sp,
1677 "std::vector iterator synthetic children",
1678 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1679
1681 cpp_category_sp,
1683 "std::map iterator synthetic children",
1684 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags, true);
1685
1687 cpp_category_sp,
1689 "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1690 stl_synth_flags, true);
1691
1692 static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1693 "^std::coroutine_handle<.+>(( )?&)?$";
1695 cpp_category_sp,
1697 "std::coroutine_handle synthetic children",
1698 libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1699
1701 cpp_category_sp,
1703 "std::bitset synthetic child", "^std::__debug::bitset<.+>(( )?&)?$",
1704 stl_deref_flags, true);
1705
1706 AddCXXSummary(cpp_category_sp,
1708 "libstdc++ std::coroutine_handle summary provider",
1709 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1710
1712 cpp_category_sp,
1714 "libstdc++ std::source_location summary provider", "std::source_location",
1715 stl_summary_flags);
1716}
1717
1718static lldb_private::SyntheticChildrenFrontEnd *
1720 lldb::ValueObjectSP valobj_sp) {
1721 if (!valobj_sp)
1722 return nullptr;
1723
1724 if (IsMsvcStlSmartPointer(*valobj_sp))
1726 return LibStdcppSharedPtrSyntheticFrontEndCreator(children, valobj_sp);
1727}
1728
1729static bool
1731 const TypeSummaryOptions &options) {
1732 if (IsMsvcStlSmartPointer(valobj))
1733 return MsvcStlSmartPointerSummaryProvider(valobj, stream, options);
1734 return LibStdcppSmartPointerSummaryProvider(valobj, stream, options);
1735}
1736
1737static lldb_private::SyntheticChildrenFrontEnd *
1739 lldb::ValueObjectSP valobj_sp) {
1740 if (!valobj_sp)
1741 return nullptr;
1742
1743 if (IsMsvcStlUniquePtr(*valobj_sp))
1745 return LibStdcppUniquePtrSyntheticFrontEndCreator(children, valobj_sp);
1746}
1747
1749 const TypeSummaryOptions &options) {
1750 if (IsMsvcStlUniquePtr(valobj))
1751 return MsvcStlUniquePtrSummaryProvider(valobj, stream, options);
1752 return LibStdcppUniquePointerSummaryProvider(valobj, stream, options);
1753}
1754
1755static SyntheticChildrenFrontEnd *
1757 lldb::ValueObjectSP valobj_sp) {
1758 if (!valobj_sp)
1759 return nullptr;
1760
1761 if (IsMsvcStlTuple(*valobj_sp))
1762 return MsvcStlTupleSyntheticFrontEndCreator(children, valobj_sp);
1763 return LibStdcppTupleSyntheticFrontEndCreator(children, valobj_sp);
1764}
1765
1766static SyntheticChildrenFrontEnd *
1768 lldb::ValueObjectSP valobj_sp) {
1769 if (!valobj_sp)
1770 return nullptr;
1771
1772 // checks for vector<T> and vector<bool>
1773 if (auto *msvc = MsvcStlVectorSyntheticFrontEndCreator(valobj_sp))
1774 return msvc;
1775
1777 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1778}
1779
1780static SyntheticChildrenFrontEnd *
1782 lldb::ValueObjectSP valobj_sp) {
1783 if (!valobj_sp)
1784 return nullptr;
1785
1786 if (IsMsvcStlList(*valobj_sp))
1787 return MsvcStlListSyntheticFrontEndCreator(children, valobj_sp);
1789 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1790}
1791
1792static SyntheticChildrenFrontEnd *
1794 lldb::ValueObjectSP valobj_sp) {
1795 if (!valobj_sp)
1796 return nullptr;
1797
1798 if (IsMsvcStlList(*valobj_sp))
1799 return MsvcStlForwardListSyntheticFrontEndCreator(children, valobj_sp);
1801 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1802 *valobj_sp);
1803}
1804
1805static SyntheticChildrenFrontEnd *
1807 lldb::ValueObjectSP valobj_sp) {
1808 if (!valobj_sp)
1809 return nullptr;
1810
1811 if (IsMsvcStlOptional(*valobj_sp))
1812 return MsvcStlOptionalSyntheticFrontEndCreator(children, valobj_sp);
1813 return LibStdcppOptionalSyntheticFrontEndCreator(children, valobj_sp);
1814}
1815
1816static SyntheticChildrenFrontEnd *
1818 lldb::ValueObjectSP valobj_sp) {
1819 if (!valobj_sp)
1820 return nullptr;
1821
1822 if (IsMsvcStlVariant(*valobj_sp))
1823 return MsvcStlVariantSyntheticFrontEndCreator(children, valobj_sp);
1825 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1826}
1827
1829 const TypeSummaryOptions &options) {
1830 if (IsMsvcStlVariant(valobj))
1831 return MsvcStlVariantSummaryProvider(valobj, stream, options);
1832 return LibStdcppVariantSummaryProvider(valobj, stream, options);
1833}
1834
1835static SyntheticChildrenFrontEnd *
1837 ValueObjectSP valobj_sp) {
1838 if (!valobj_sp)
1839 return nullptr;
1840
1841 if (IsMsvcStlUnordered(*valobj_sp))
1842 return MsvcStlUnorderedSyntheticFrontEndCreator(children, valobj_sp);
1844 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1845 *valobj_sp);
1846}
1847
1848static SyntheticChildrenFrontEnd *
1850 ValueObjectSP valobj_sp) {
1851 if (!valobj_sp)
1852 return nullptr;
1853
1854 if (IsMsvcStlMapLike(*valobj_sp))
1857 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1858}
1859
1860static SyntheticChildrenFrontEnd *
1862 ValueObjectSP valobj_sp) {
1863 if (!valobj_sp)
1864 return nullptr;
1865
1866 if (IsMsvcStlDeque(*valobj_sp))
1867 return MsvcStlDequeSyntheticFrontEndCreator(children, valobj_sp);
1869 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1870}
1871
1872static SyntheticChildrenFrontEnd *
1874 ValueObjectSP valobj_sp) {
1875 if (!valobj_sp)
1876 return nullptr;
1877
1878 if (IsMsvcStlSpan(*valobj_sp))
1879 return MsvcStlSpanSyntheticFrontEndCreator(children, valobj_sp);
1880 return LibStdcppSpanSyntheticFrontEndCreator(children, valobj_sp);
1881}
1882
1883static bool
1885 const TypeSummaryOptions &options) {
1886 if (IsMsvcStlOrdering(valobj))
1887 return MsvcStlPartialOrderingSummaryProvider(valobj, stream, options);
1888 return LibStdcppPartialOrderingSummaryProvider(valobj, stream, options);
1889}
1890
1891static bool
1893 const TypeSummaryOptions &options) {
1894 if (IsMsvcStlOrdering(valobj))
1895 return MsvcStlWeakOrderingSummaryProvider(valobj, stream, options);
1896 return LibStdcppWeakOrderingSummaryProvider(valobj, stream, options);
1897}
1898
1899static bool
1901 const TypeSummaryOptions &options) {
1902 if (IsMsvcStlOrdering(valobj))
1903 return MsvcStlStrongOrderingSummaryProvider(valobj, stream, options);
1904 return LibStdcppStrongOrderingSummaryProvider(valobj, stream, options);
1905}
1906
1907static SyntheticChildrenFrontEnd *
1909 ValueObjectSP valobj_sp) {
1910 if (!valobj_sp)
1911 return nullptr;
1912
1913 if (IsMsvcStlBitset(*valobj_sp))
1914 return MsvcStlBitsetSyntheticFrontEndCreator(children, valobj_sp);
1915 return LibStdcppBitsetSyntheticFrontEndCreator(children, valobj_sp);
1916}
1917
1918static SyntheticChildrenFrontEnd *
1920 lldb::ValueObjectSP valobj_sp) {
1921 if (!valobj_sp)
1922 return nullptr;
1923 if (IsMsvcStlExpected(*valobj_sp))
1924 return MsvcStlExpectedSyntheticFrontEndCreator(children, valobj_sp);
1925 return nullptr;
1926}
1927
1929 const TypeSummaryOptions &options) {
1930 if (IsMsvcStlExpected(valobj))
1931 return MsvcStlExpectedSummaryProvider(valobj, stream, options);
1932 return false;
1933}
1934
1935static SyntheticChildrenFrontEnd *
1937 lldb::ValueObjectSP valobj_sp) {
1938 if (!valobj_sp)
1939 return nullptr;
1940 if (IsMsvcStlValarray(*valobj_sp))
1941 return MsvcStlValarraySyntheticFrontEndCreator(children, valobj_sp);
1942 return nullptr;
1943}
1944
1946 const TypeSummaryOptions &options) {
1947 if (!IsMsvcStlValarray(valobj))
1948 return false;
1949 return ContainerSizeSummaryProvider(valobj, stream, options);
1950}
1951
1952static bool
1954 const TypeSummaryOptions &options) {
1955 if (IsMsvcStlSourceLocation(valobj))
1956 return MsvcStlSourceLocationSummaryProvider(valobj, stream, options);
1957 return LibStdcppSourceLocationSummaryProvider(valobj, stream, options);
1958}
1959
1960/// Load formatters that are formatting types from more than one STL
1962 if (!cpp_category_sp)
1963 return;
1964
1965 TypeSummaryImpl::Flags stl_summary_flags;
1966 stl_summary_flags.SetCascades(true)
1967 .SetSkipPointers(false)
1968 .SetSkipReferences(false)
1969 .SetDontShowChildren(true)
1970 .SetDontShowValue(false)
1972 .SetHideItemNames(false);
1973 SyntheticChildren::Flags stl_synth_flags;
1974 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1975 false);
1976
1978
1980 cpp_category_sp, "std::string", "char",
1981 std::make_shared<CXXFunctionSummaryFormat>(
1982 stl_summary_flags,
1983 [](ValueObject &valobj, Stream &stream,
1984 const TypeSummaryOptions &options) {
1985 if (IsMsvcStlStringType(valobj))
1987 valobj, stream, options);
1988 return LibStdcppStringSummaryProvider(valobj, stream, options);
1989 },
1990 "MSVC STL/libstdc++ std::string summary provider"));
1992 cpp_category_sp, "std::wstring", "wchar_t",
1993 std::make_shared<CXXFunctionSummaryFormat>(
1994 stl_summary_flags,
1995 [](ValueObject &valobj, Stream &stream,
1996 const TypeSummaryOptions &options) {
1997 if (IsMsvcStlStringType(valobj))
1998 return MsvcStlWStringSummaryProvider(valobj, stream, options);
1999 return LibStdcppStringSummaryProvider(valobj, stream, options);
2000 },
2001 "MSVC STL/libstdc++ std::wstring summary provider"));
2002
2004 cpp_category_sp, "std::string_view", "char",
2005 std::make_shared<CXXFunctionSummaryFormat>(
2006 stl_summary_flags,
2007 [](ValueObject &valobj, Stream &stream,
2008 const TypeSummaryOptions &options) {
2009 if (IsMsvcStlStringViewType(valobj))
2011 valobj, stream, options);
2013 valobj, stream, options);
2014 },
2015 "MSVC STL/libstdc++ std::string_view summary provider"));
2017 cpp_category_sp, "std::u8string_view", "char8_t",
2018 std::make_shared<CXXFunctionSummaryFormat>(
2019 stl_summary_flags,
2020 [](ValueObject &valobj, Stream &stream,
2021 const TypeSummaryOptions &options) {
2022 if (IsMsvcStlStringViewType(valobj))
2024 valobj, stream, options);
2026 valobj, stream, options);
2027 },
2028 "MSVC STL/libstdc++ std::u8string_view summary provider"));
2030 cpp_category_sp, "std::u16string_view", "char16_t",
2031 std::make_shared<CXXFunctionSummaryFormat>(
2032 stl_summary_flags,
2033 [](ValueObject &valobj, Stream &stream,
2034 const TypeSummaryOptions &options) {
2035 if (IsMsvcStlStringViewType(valobj))
2037 valobj, stream, options);
2039 valobj, stream, options);
2040 },
2041 "MSVC STL/libstdc++ std::u16string_view summary provider"));
2043 cpp_category_sp, "std::u32string_view", "char32_t",
2044 std::make_shared<CXXFunctionSummaryFormat>(
2045 stl_summary_flags,
2046 [](ValueObject &valobj, Stream &stream,
2047 const TypeSummaryOptions &options) {
2048 if (IsMsvcStlStringViewType(valobj))
2050 valobj, stream, options);
2052 valobj, stream, options);
2053 },
2054 "MSVC STL/libstdc++ std::u32string_view summary provider"));
2056 cpp_category_sp, "std::wstring_view", "wchar_t",
2057 std::make_shared<CXXFunctionSummaryFormat>(
2058 stl_summary_flags,
2059 [](ValueObject &valobj, Stream &stream,
2060 const TypeSummaryOptions &options) {
2061 if (IsMsvcStlStringViewType(valobj))
2062 return MsvcStlWStringViewSummaryProvider(valobj, stream, options);
2063 return LibStdcppWStringViewSummaryProvider(valobj, stream, options);
2064 },
2065 "MSVC STL/libstdc++ std::wstring_view summary provider"));
2066
2067 // NOTE: it is loaded as a common formatter because the libc++ version is not
2068 // in the `__1` namespace, hence we need to dispatch based on the class
2069 // layout.
2070 AddCXXSynthetic(cpp_category_sp,
2072 "std::initializer_list synthetic children",
2073 "^std::initializer_list<.+>$", stl_synth_flags, true);
2074
2076 "MSVC STL/libstdc++ std::filesystem::path summary provider",
2077 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags, true);
2078
2080 "MSVC STL/libstdc++ std::source_location summary provider",
2081 "std::source_location", stl_summary_flags);
2082
2083 stl_summary_flags.SetDontShowChildren(false);
2084 stl_summary_flags.SetSkipPointers(false);
2085
2087 "std::shared_ptr synthetic children",
2088 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2090 "std::weak_ptr synthetic children",
2091 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2093 "std::unique_ptr synthetic children",
2094 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags, true);
2096 "std::tuple synthetic children", "^std::tuple<.*>(( )?&)?$",
2097 stl_synth_flags, true);
2099 "std::list synthetic children", "^std::list<.+>(( )?&)?$",
2100 stl_synth_flags, true);
2102 "std::forward_list synthetic children",
2103 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
2105 "std::variant synthetic children", "^std::variant<.*>$",
2106 stl_synth_flags, true);
2108 "std::unordered container synthetic children",
2109 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
2110 true);
2111
2112 SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
2113 stl_deref_flags.SetFrontEndWantsDereference();
2115 "std::optional synthetic children",
2116 "^std::optional<.+>(( )?&)?$", stl_deref_flags, true);
2118 "std::deque container synthetic children",
2119 "^std::deque<.+>(( )?&)?$", stl_deref_flags, true);
2121 "std::span container synthetic children", "^std::span<.+>$",
2122 stl_deref_flags, true);
2123
2125 "std::(multi)?map/set synthetic children",
2126 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
2127 true);
2129 "std::bitset synthetic children", "^std::bitset<.+>(( )?&)?$",
2130 stl_deref_flags, true);
2131
2133 "std::initializer_list summary provider",
2134 "^std::initializer_list<.+>$", stl_summary_flags, true);
2136 "MSVC STL/libstdc++ std::shared_ptr summary provider",
2137 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2139 "MSVC STL/libstdc++ std::weak_ptr summary provider",
2140 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2142 "MSVC STL/libstdc++ std::unique_ptr summary provider",
2143 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
2145 "MSVC STL/libstdc++ std::tuple summary provider",
2146 "^std::tuple<.*>(( )?&)?$", stl_summary_flags, true);
2148 "MSVC/libstdc++ std::vector summary provider",
2149 "^std::vector<.+>(( )?&)?$", stl_summary_flags, true);
2151 "MSVC/libstdc++ std::vector synthetic provider",
2152 "^std::vector<.+>(( )?&)?$", stl_synth_flags, true);
2154 "MSVC STL/libstdc++ std::list summary provider",
2155 "^std::list<.+>(( )?&)?$", stl_summary_flags, true);
2156 cpp_category_sp->AddTypeSummary(
2157 "^std::forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
2159 stl_summary_flags,
2160 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
2162 "MSVC STL/libstd++ std::optional summary provider",
2163 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
2165 "MSVC STL/libstdc++ std::variant summary provider",
2166 "^std::variant<.*>$", stl_summary_flags, true);
2168 "MSVC STL/libstdc++ std unordered container summary provider",
2169 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
2170 true);
2172 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
2173 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
2174 true);
2176 "MSVC STL/libstd++ std::deque summary provider",
2177 "^std::deque<.+>(( )?&)?$", stl_summary_flags, true);
2179 "MSVC STL/libstd++ std::span summary provider",
2180 "^std::span<.+>$", stl_summary_flags, true);
2182 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2183 "std::partial_ordering",
2184 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2186 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2187 "std::weak_ordering",
2188 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2190 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2191 "std::strong_ordering",
2192 eTypeOptionHideChildren | eTypeOptionHideValue, false);
2193
2194 // Container adaptors expose the underlying container as the standard
2195 // protected member `c` ([queue.defn], [stack.defn], [priqueue.overview]).
2197 "std::queue synthetic children", "^std::queue<.+>(( )?&)?$",
2198 stl_synth_flags, true);
2200 "std::stack synthetic children", "^std::stack<.+>(( )?&)?$",
2201 stl_synth_flags, true);
2203 "std::priority_queue synthetic children",
2204 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags, true);
2206 "std::queue summary provider", "^std::queue<.+>(( )?&)?$",
2207 stl_summary_flags, true);
2209 "std::stack summary provider", "^std::stack<.+>(( )?&)?$",
2210 stl_summary_flags, true);
2212 "std::priority_queue summary provider",
2213 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags, true);
2214
2216 "MSVC STL/libstdc++ std::error_code summary provider",
2217 "std::error_code", stl_summary_flags);
2219 "MSVC STL/libstdc++ std::error_condition summary provider",
2220 "std::error_condition", stl_summary_flags);
2222 "MSVC STL/libstdc++ std::error_code/error_condition "
2223 "synthetic children",
2224 "^std::error_(code|condition)$", stl_synth_flags, true);
2226 "MSVC STL/libstdc++ std::bitset summary provider",
2227 "^std::bitset<.+>(( )?&)?$", stl_summary_flags, true);
2228
2230 "MSVC STL std::expected synthetic children",
2231 "^std::expected<.+>(( )?&)?$", stl_deref_flags, true);
2233 "MSVC STL std::expected summary provider",
2234 "^std::expected<.+>(( )?&)?$", stl_summary_flags, true);
2235
2237 "MSVC STL std::valarray synthetic children",
2238 "^std::valarray<.+>(( )?&)?$", stl_deref_flags, true);
2240 "MSVC STL std::valarray summary provider",
2241 "^std::valarray<.+>(( )?&)?$", stl_summary_flags, true);
2242}
2243
2245 if (!cpp_category_sp)
2246 return;
2247
2248 TypeSummaryImpl::Flags stl_summary_flags;
2249 stl_summary_flags.SetCascades(true)
2250 .SetSkipPointers(false)
2251 .SetSkipReferences(false)
2252 .SetDontShowChildren(true)
2253 .SetDontShowValue(false)
2255 .SetHideItemNames(false);
2256 SyntheticChildren::Flags stl_synth_flags;
2257 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
2258 false);
2259
2261
2263 cpp_category_sp, "std::u8string", "char8_t",
2264 std::make_shared<CXXFunctionSummaryFormat>(
2265 stl_summary_flags,
2267 "MSVC STL std::u8string summary provider"));
2269 cpp_category_sp, "std::u16string", "char16_t",
2270 std::make_shared<CXXFunctionSummaryFormat>(
2271 stl_summary_flags,
2273 "MSVC STL std::u16string summary provider"));
2275 cpp_category_sp, "std::u32string", "char32_t",
2276 std::make_shared<CXXFunctionSummaryFormat>(
2277 stl_summary_flags,
2279 "MSVC STL std::u32string summary provider"));
2280
2281 stl_summary_flags.SetDontShowChildren(false);
2282
2284 "MSVC STL std::atomic synthetic children",
2285 "^std::atomic<.+>$", stl_synth_flags, true);
2286
2288 "MSVC STL std::atomic summary provider", "^std::atomic<.+>$",
2289 stl_summary_flags, true);
2291 "MSVC STL tree iterator synthetic children",
2292 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2293 true);
2295 "MSVC STL tree iterator summary",
2296 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2297 true);
2300 "MSVC STL vector iterator synthetic children",
2301 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags, true);
2302}
2303
2305 if (!cpp_category_sp)
2306 return;
2307
2308 TypeSummaryImpl::Flags string_flags;
2309 string_flags.SetCascades(true)
2310 .SetSkipPointers(true)
2311 .SetSkipReferences(false)
2312 .SetDontShowChildren(true)
2313 .SetDontShowValue(false)
2315 .SetHideItemNames(false);
2316
2317 TypeSummaryImpl::Flags string_array_flags;
2318 string_array_flags.SetCascades(true)
2319 .SetSkipPointers(true)
2320 .SetSkipReferences(false)
2321 .SetDontShowChildren(true)
2322 .SetDontShowValue(true)
2324 .SetHideItemNames(false);
2325
2326 AddCXXSummary(cpp_category_sp,
2328 "char8_t * summary provider", "char8_t *", string_flags);
2329 AddCXXSummary(cpp_category_sp,
2331 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
2332 string_array_flags, true);
2333
2334 AddCXXSummary(cpp_category_sp,
2336 "char16_t * summary provider", "char16_t *", string_flags);
2337 AddCXXSummary(cpp_category_sp,
2339 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
2340 string_array_flags, true);
2341
2342 AddCXXSummary(cpp_category_sp,
2344 "char32_t * summary provider", "char32_t *", string_flags);
2345 AddCXXSummary(cpp_category_sp,
2347 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
2348 string_array_flags, true);
2349
2350 AddCXXSummary(cpp_category_sp,
2352 "wchar_t * summary provider", "wchar_t *", string_flags);
2353 AddCXXSummary(cpp_category_sp,
2355 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
2356 string_array_flags, true);
2357
2358 AddCXXSummary(cpp_category_sp,
2360 "unichar * summary provider", "unichar *", string_flags);
2361
2362 TypeSummaryImpl::Flags widechar_flags;
2363 widechar_flags.SetDontShowValue(true)
2364 .SetSkipPointers(true)
2365 .SetSkipReferences(false)
2366 .SetCascades(true)
2367 .SetDontShowChildren(true)
2368 .SetHideItemNames(true)
2369 .SetShowMembersOneLiner(false);
2370
2372 "char8_t summary provider", "char8_t", widechar_flags);
2373 AddCXXSummary(cpp_category_sp,
2375 "char16_t summary provider", "char16_t", widechar_flags);
2376 AddCXXSummary(cpp_category_sp,
2378 "char32_t summary provider", "char32_t", widechar_flags);
2380 "wchar_t summary provider", "wchar_t", widechar_flags);
2381
2382 AddCXXSummary(cpp_category_sp,
2384 "unichar summary provider", "unichar", widechar_flags);
2385}
2386
2387std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
2388 class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
2389 public:
2390 CompilerType AdjustForInclusion(CompilerType &candidate) override {
2391 LanguageType lang_type(candidate.GetMinimumLanguage());
2392 if (!Language::LanguageIsC(lang_type) &&
2394 return CompilerType();
2395 if (candidate.IsTypedefType())
2396 return candidate.GetTypedefedType();
2397 return candidate;
2398 }
2399 };
2400
2401 return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
2402}
2403
2405 static llvm::once_flag g_initialize;
2406 static TypeCategoryImplSP g_category;
2407
2408 llvm::call_once(g_initialize, [this]() -> void {
2410 g_category);
2411 if (g_category) {
2412 // NOTE: the libstdcpp formatters are loaded after libcxx formatters
2413 // because we don't want to the libcxx formatters to match the potential
2414 // `__debug` inline namespace that libstdcpp may use.
2415 // LLDB prioritizes the last loaded matching formatter.
2416 LoadLibCxxFormatters(g_category);
2417 LoadLibStdcppFormatters(g_category);
2418 LoadMsvcStlFormatters(g_category);
2419 LoadCommonStlFormatters(g_category);
2420 LoadSystemFormatters(g_category);
2421 }
2422 });
2423 return g_category;
2424}
2425
2428 static llvm::once_flag g_initialize;
2429 static ConstString g_vectortypes("VectorTypes");
2431
2432 llvm::call_once(g_initialize, []() -> void {
2433 g_formatters.push_back(
2436 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2440 "Function pointer summary provider"));
2441 if (CompilerType CT = valobj.GetCompilerType();
2442 CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
2444 return formatter_sp;
2445 }
2446 return nullptr;
2447 });
2448 g_formatters.push_back(
2451 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2454 .SetCascades(true)
2455 .SetDontShowChildren(true)
2456 .SetHideItemNames(true)
2457 .SetShowMembersOneLiner(true)
2458 .SetSkipPointers(true)
2459 .SetSkipReferences(false),
2461 "vector_type pointer summary provider"));
2462 if (valobj.GetCompilerType().IsVectorType()) {
2463 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2464 return formatter_sp;
2465 }
2466 return nullptr;
2467 });
2468 g_formatters.push_back(
2471 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
2474 .SetCascades(true)
2475 .SetDontShowChildren(true)
2476 .SetHideItemNames(true)
2477 .SetShowMembersOneLiner(true)
2478 .SetSkipPointers(true)
2479 .SetSkipReferences(false),
2481 "block pointer summary provider"));
2482 if (valobj.GetCompilerType().IsBlockPointerType()) {
2483 return formatter_sp;
2484 }
2485 return nullptr;
2486 });
2487 });
2488
2489 return g_formatters;
2490}
2491
2494 static llvm::once_flag g_initialize;
2495 static ConstString g_vectortypes("VectorTypes");
2497
2498 llvm::call_once(g_initialize, []() -> void {
2499 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2502 static CXXSyntheticChildren::SharedPointer formatter_sp(
2505 .SetCascades(true)
2506 .SetSkipPointers(true)
2507 .SetSkipReferences(true)
2508 .SetNonCacheable(true),
2509 "vector_type synthetic children",
2511 if (valobj.GetCompilerType().IsVectorType()) {
2512 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
2513 return formatter_sp;
2514 }
2515 return nullptr;
2516 });
2517 g_formatters.push_back([](lldb_private::ValueObject &valobj,
2520 static CXXSyntheticChildren::SharedPointer formatter_sp(
2523 .SetCascades(true)
2524 .SetSkipPointers(true)
2525 .SetSkipReferences(true)
2526 .SetNonCacheable(true),
2527 "block pointer synthetic children",
2529 if (valobj.GetCompilerType().IsBlockPointerType()) {
2530 return formatter_sp;
2531 }
2532 return nullptr;
2533 });
2534 });
2535
2536 return g_formatters;
2537}
2538
2541 !valobj.IsPointerType())
2542 return false;
2543 bool canReadValue = true;
2544 bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
2545 return canReadValue && isZero;
2546}
2547
2548bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
2549 const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",
2550 ".h", ".hh", ".hpp", ".hxx", ".h++"};
2551 for (auto suffix : suffixes) {
2552 if (file_path.ends_with_insensitive(suffix))
2553 return true;
2554 }
2555
2556 // Check if we're in a STL path (where the files usually have no extension
2557 // that we could check for.
2558 return file_path.contains("/usr/include/c++/");
2559}
2560
2562 assert(sc.function);
2563
2564 if (sc.block)
2565 if (Block *inline_block = sc.block->GetContainingInlinedBlock())
2566 return inline_block->GetBlockVariableList(true);
2567
2568 return sc.function->GetBlock(true).GetBlockVariableList(true);
2569}
2570
2572 const ExecutionContext *exe_ctx,
2573 const SymbolContext &sc) {
2574 assert(sc.function);
2575
2576 ExecutionContextScope *exe_scope =
2577 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2578
2579 const char *cstr = sc.GetPossiblyInlinedFunctionName()
2581 .AsCString(nullptr);
2582 if (!cstr)
2583 return false;
2584
2585 VariableList args;
2586 if (auto variable_list_sp = GetFunctionVariableList(sc))
2588 args);
2589
2590 if (args.GetSize() > 0)
2591 return PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args);
2592
2593 // FIXME: can we just unconditionally call PrettyPrintFunctionNameWithArgs?
2594 // It should be able to handle the "no arguments" case.
2595 s.PutCString(cstr);
2596
2597 return true;
2598}
2599
2601 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2602 FunctionNameRepresentation representation, Stream &s) {
2603 switch (representation) {
2605 // Print the function name with arguments in it
2606 if (sc.function)
2607 return PrintFunctionNameWithArgs(s, exe_ctx, sc);
2608
2609 if (!sc.symbol)
2610 return false;
2611
2612 const char *cstr = sc.symbol->GetName().AsCString(nullptr);
2613 if (!cstr)
2614 return false;
2615
2616 s.PutCString(cstr);
2617
2618 return true;
2619 }
2622 return false;
2623 }
2624 llvm_unreachable("Fully covered switch above");
2625}
2626
2628 const SymbolContext &sc, const ExecutionContext *exe_ctx,
2630 switch (type) {
2632 auto scope_or_err = ::GetDemangledScope(sc);
2633 if (!scope_or_err) {
2635 GetLog(LLDBLog::Language), scope_or_err.takeError(),
2636 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2637 return false;
2638 }
2639
2640 s << *scope_or_err;
2641
2642 return true;
2643 }
2644
2646 auto name_or_err = ::GetDemangledBasename(sc);
2647 if (!name_or_err) {
2649 GetLog(LLDBLog::Language), name_or_err.takeError(),
2650 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2651 return false;
2652 }
2653
2654 s << *name_or_err;
2655
2656 return true;
2657 }
2658
2660 auto template_args_or_err = ::GetDemangledTemplateArguments(sc);
2661 if (!template_args_or_err) {
2663 template_args_or_err.takeError(),
2664 "Failed to handle ${{function.template-arguments}} "
2665 "frame-format variable: {0}");
2666 return false;
2667 }
2668
2669 s << *template_args_or_err;
2670
2671 return true;
2672 }
2673
2675 // This ensures we print the arguments even when no debug-info is available.
2676 //
2677 // FIXME: we should have a Entry::Type::FunctionArguments and
2678 // use it in the plugin.cplusplus.display.function-name-format
2679 // once we have a "fallback operator" in the frame-format language.
2680 if (!sc.function && sc.symbol)
2681 return PrintDemangledArgumentList(s, sc);
2682
2683 VariableList args;
2684 if (auto variable_list_sp = GetFunctionVariableList(sc))
2686 args);
2687
2688 ExecutionContextScope *exe_scope =
2689 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
2690
2691 s << '(';
2693 s << ')';
2694
2695 return true;
2696 }
2698 auto return_rhs_or_err = ::GetDemangledReturnTypeRHS(sc);
2699 if (!return_rhs_or_err) {
2700 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_rhs_or_err.takeError(),
2701 "Failed to handle ${{function.return-right}} frame-format "
2702 "variable: {0}");
2703 return false;
2704 }
2705
2706 s << *return_rhs_or_err;
2707
2708 return true;
2709 }
2711 auto return_lhs_or_err = ::GetDemangledReturnTypeLHS(sc);
2712 if (!return_lhs_or_err) {
2713 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), return_lhs_or_err.takeError(),
2714 "Failed to handle ${{function.return-left}} frame-format "
2715 "variable: {0}");
2716 return false;
2717 }
2718
2719 s << *return_lhs_or_err;
2720
2721 return true;
2722 }
2724 auto quals_or_err = ::GetDemangledFunctionQualifiers(sc);
2725 if (!quals_or_err) {
2726 LLDB_LOG_ERROR(GetLog(LLDBLog::Language), quals_or_err.takeError(),
2727 "Failed to handle ${{function.qualifiers}} frame-format "
2728 "variable: {0}");
2729 return false;
2730 }
2731
2732 s << *quals_or_err;
2733
2734 return true;
2735 }
2737 auto suffix_or_err = ::GetDemangledFunctionSuffix(sc);
2738 if (!suffix_or_err) {
2740 GetLog(LLDBLog::Language), suffix_or_err.takeError(),
2741 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2742 return false;
2743 }
2744
2745 s << *suffix_or_err;
2746
2747 return true;
2748 }
2749 default:
2750 return false;
2751 }
2752}
2753
2754namespace {
2755class NodeAllocator {
2756 llvm::BumpPtrAllocator Alloc;
2757
2758public:
2759 void reset() { Alloc.Reset(); }
2760
2761 template <typename T, typename... Args> T *makeNode(Args &&...args) {
2762 return new (Alloc.Allocate(sizeof(T), alignof(T)))
2763 T(std::forward<Args>(args)...);
2764 }
2765
2766 void *allocateNodeArray(size_t sz) {
2767 return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
2768 alignof(llvm::itanium_demangle::Node *));
2769 }
2770};
2771
2772template <typename Derived>
2773class ManglingSubstitutor
2774 : public llvm::itanium_demangle::AbstractManglingParser<Derived,
2775 NodeAllocator> {
2776 using Base =
2777 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2778
2779public:
2780 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2781
2782 template <typename... Ts>
2783 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2784 Ts &&...Vals) {
2785 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2786 return substituteImpl(Mangled);
2787 }
2788
2789protected:
2790 void reset(llvm::StringRef Mangled) {
2791 Base::reset(Mangled.begin(), Mangled.end());
2792 Written = Mangled.begin();
2793 Result.clear();
2794 Substituted = false;
2795 }
2796
2797 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2798 if (this->parse() == nullptr)
2799 return llvm::createStringErrorV("failed to substitute mangling in '{0}'",
2800 Mangled);
2801
2802 if (!Substituted)
2803 return ConstString();
2804
2805 // Append any trailing unmodified input.
2806 appendUnchangedInput();
2807 return ConstString(Result);
2808 }
2809
2810 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2811 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2812 return;
2813
2814 // We found a match. Append unmodified input up to this point.
2815 appendUnchangedInput();
2816
2817 // And then perform the replacement.
2818 Result += To;
2819 Written += From.size();
2820 Substituted = true;
2821 }
2822
2823private:
2824 /// Input character until which we have constructed the respective output
2825 /// already.
2826 const char *Written = "";
2827
2828 llvm::SmallString<128> Result;
2829
2830 /// Whether we have performed any substitutions.
2831 bool Substituted = false;
2832
2833 const char *currentParserPos() const { return this->First; }
2834
2835 void appendUnchangedInput() {
2836 Result +=
2837 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2838 Written = currentParserPos();
2839 }
2840};
2841
2842/// Given a mangled function `Mangled`, replace all the primitive function type
2843/// arguments of `Search` with type `Replace`.
2844class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
2845 llvm::StringRef Search;
2846 llvm::StringRef Replace;
2847
2848public:
2849 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2850 llvm::StringRef Replace) {
2851 ManglingSubstitutor::reset(Mangled);
2852 this->Search = Search;
2853 this->Replace = Replace;
2854 }
2855
2856 llvm::itanium_demangle::Node *parseType() {
2857 trySubstitute(Search, Replace);
2858 return ManglingSubstitutor::parseType();
2859 }
2860};
2861
2862class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
2863 llvm::StringRef Search;
2864 llvm::StringRef Replace;
2865
2866public:
2867 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2868 llvm::StringRef Replace) {
2869 ManglingSubstitutor::reset(Mangled);
2870 this->Search = Search;
2871 this->Replace = Replace;
2872 }
2873
2874 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2875
2876 llvm::itanium_demangle::Node *
2877 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
2878 if (!Search.empty() && !Replace.empty()) {
2879 trySubstitute(Search, Replace);
2880 } else {
2881 trySubstitute("D1", "D2");
2882 trySubstitute("C1", "C2");
2883 }
2884 return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
2885 }
2886};
2887} // namespace
2888
2889llvm::Expected<ConstString>
2891 llvm::StringRef subst_from,
2892 llvm::StringRef subst_to) {
2893 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2894}
2895
2897 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2898 llvm::StringRef subst_to) {
2899 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2900}
2901
2902llvm::Expected<ConstString>
2904 llvm::StringRef mangled_name) {
2905 return CtorDtorSubstitutor().substitute(mangled_name);
2906}
2907
2908#define LLDB_PROPERTIES_language_cplusplus
2909#include "LanguageCPlusPlusProperties.inc"
2910
2911enum {
2912#define LLDB_PROPERTIES_language_cplusplus
2913#include "LanguageCPlusPlusPropertiesEnum.inc"
2914};
2915
2916namespace {
2917class PluginProperties : public Properties {
2918public:
2919 static llvm::StringRef GetSettingName() { return "display"; }
2920
2921 PluginProperties() {
2922 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2923 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2924 }
2925
2926 FormatEntity::Entry GetFunctionNameFormat() const {
2927 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2928 ePropertyFunctionNameFormat, {});
2929 }
2930};
2931} // namespace
2932
2933static PluginProperties &GetGlobalPluginProperties() {
2934 static PluginProperties g_settings;
2935 return g_settings;
2936}
2937
2941
2944 debugger, PluginProperties::GetSettingName())) {
2946 debugger, GetGlobalPluginProperties().GetValueProperties(),
2947 "Properties for the CPlusPlus language plug-in.",
2948 /*is_global_property=*/true);
2949 }
2950}
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(const SymbolContext &sc)
static bool GenericStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericDequeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static bool IsTrivialBasename(const llvm::StringRef &basename)
static SyntheticChildrenFrontEnd * GenericExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericTupleSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledBasename(const SymbolContext &sc)
static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericValarraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool IsTrivialContext(llvm::StringRef context)
A context is trivial if an only if it matches this pattern.
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static bool GenericSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static 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 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 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 handles,...
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 handles.
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.
bool HandlesManglingScheme(Mangled::ManglingScheme scheme) const override
Returns true if this language handles the names mangled with scheme.
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(ConstString 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(ConstString category_name, bool can_create=true)
Block & GetBlock(bool can_create)
Get accessor for the block list.
Definition Function.cpp:401
HardcodedFormatterFinders< SyntheticChildren > HardcodedSyntheticFinder
HardcodedFormatterFinders< TypeSummaryImpl > HardcodedSummaryFinder
Parses mangled function names.
Definition Language.h:361
llvm::StringRef GetQualifiers()
Definition Language.h:277
llvm::StringRef GetReturnType()
Definition Language.h:283
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:396
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:371
A class that handles mangled names.
Definition Mangled.h:34
static bool IsMangledName(llvm::StringRef name)
Definition Mangled.cpp:39
ConstString GetMangledName() const
Mangled name get accessor.
Definition Mangled.h:170
ConstString GetDemangledName() const
Demangled name get accessor.
Definition Mangled.cpp:171
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
Definition Mangled.cpp:257
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
Definition Mangled.cpp:43
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:614
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 * LibcxxStdVectorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:984
bool LibcxxStringViewSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:757
SyntheticChildrenFrontEnd * LibStdcppSpanSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibStdcppStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:282
SyntheticChildrenFrontEnd * LibcxxBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
void AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp, CXXFunctionSummaryFormat::Callback funct, const char *description, llvm::StringRef type_name, TypeSummaryImpl::Flags flags, bool regex=false)
Add a summary that is implemented by a C++ callback.
SyntheticChildrenFrontEnd * MsvcStlListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:244
bool MsvcStlWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:268
bool IsMsvcStlSourceLocation(ValueObject &valobj)
Definition MsvcStl.cpp:310
bool LibcxxChronoYearMonthDaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:948
bool LibStdcppUniquePointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:626
SyntheticChildrenFrontEnd * LibcxxTupleFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibcxxStringSummaryProviderASCII(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:683
SyntheticChildrenFrontEnd * MsvcStlForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoLocalSecondsSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:846
SyntheticChildrenFrontEnd * StdlibCoroutineHandleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * MsvcStlTupleSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:764
bool Char8SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxChronoWeekdaySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:927
bool MsvcStlVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlMapLike(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool MsvcStlStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:289
SyntheticChildrenFrontEnd * LibcxxStdProxyArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * GenericErrorCodeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxStringSummaryProviderUTF16(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:690
bool Char16SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxStdSliceArraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxFunctionSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:133
bool MsvcStlSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibcxxStringSummaryProviderUTF32(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
Definition LibCxx.cpp:697
bool IsMsvcStlUniquePtr(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxStdListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool MsvcStlSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:316
bool LibcxxStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:303
void AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp, CXXSyntheticChildren::CreateFrontEndCallback generator, const char *description, llvm::StringRef type_name, ScriptedSyntheticChildren::Flags flags, bool regex=false)
Add a synthetic that is implemented by a C++ callback.
SyntheticChildrenFrontEnd * GenericInitializerListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
SyntheticChildrenFrontEnd * GenericContainerAdaptorFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoLocalDaysSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:900
SyntheticChildrenFrontEnd * LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * MsvcStlBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlVariantSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlMapLikeSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool MsvcStlTreeIterSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlOrdering(ValueObject &valobj)
Definition MsvcStl.cpp:227
bool Char8StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdMapSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlStringViewType(ValueObject &valobj)
Definition MsvcStl.cpp:149
SyntheticChildrenFrontEnd * LibStdcppBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxVariantFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibStdcppSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool StdlibCoroutineHandleSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Summary provider for std::coroutine_handle<T> from libc++, libstdc++ and MSVC STL.
bool MsvcStlWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:191
bool LibcxxVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibCxxAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool ContainerSizeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool Char16StringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * MsvcStlUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool WCharStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlList(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool GenericOptionalSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibcxxStdUnorderedMapSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool IsMsvcStlSpan(ValueObject &valobj)
SyntheticChildrenFrontEnd * MsvcStlSpanSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * MsvcStlDequeSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool BlockPointerSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &)
bool IsMsvcStlValarray(ValueObject &valobj)
SyntheticChildrenFrontEnd * MsvcStlExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlTreeIterSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
SyntheticChildrenFrontEnd * LibcxxStdForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
SyntheticChildrenFrontEnd * LibcxxSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * LibCxxMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlSmartPointerSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool LibcxxChronoSysDaysSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition LibCxx.cpp:894
bool LibStdcppVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool MsvcStlWStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
Definition MsvcStl.cpp:155
SyntheticChildrenFrontEnd * LibcxxStdSliceArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool Char32SummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
lldb_private::SyntheticChildrenFrontEnd * MsvcStlUniquePtrSyntheticFrontEndCreator(lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlVariant(ValueObject &valobj)
bool CXXFunctionPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool GenericErrorCodeSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool LibStdcppWStringViewSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
SyntheticChildrenFrontEnd * MsvcStlAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp)
bool IsMsvcStlBitset(ValueObject &valobj)
SyntheticChildrenFrontEnd * LibcxxStdValarraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP)
bool LibStdcppWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool IsMsvcStlSmartPointer(ValueObject &valobj)
bool MsvcStlAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
bool GenericFilesystemPathSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:338
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeObjC_plus_plus
Objective-C++.
std::shared_ptr< lldb_private::VariableList > VariableListSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVariableArgument
function argument variables
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
std::shared_ptr< CXXFunctionSummaryFormat > SharedPointer
Stores information about where certain portions of a demangled function name begin and end.
bool hasSuffix() const
Returns true if this object holds a valid suffix range.
bool hasBasename() const
Returns true if this object holds a valid basename range.
std::pair< uint32_t, uint32_t > TemplateArgumentsRange
A [start, end) pair for the function template arguments.
bool hasTemplateArguments() const
Returns true if this object holds a valid template arguments range.
std::pair< uint32_t, uint32_t > QualifiersRange
Indicates the [start, end) of the function qualifiers (e.g., CV-qualifiers, reference qualifiers,...
std::pair< uint32_t, uint32_t > BasenameRange
A [start, end) pair for the function basename.
std::pair< uint32_t, uint32_t > SuffixRange
Indicates the [start, end) of the function's suffix.
bool hasScope() const
Returns true if this object holds a valid scope range.
std::pair< uint32_t, uint32_t > ScopeRange
A [start, end) pair for the function scope qualifiers.
bool hasQualifiers() const
Returns true if this object holds a valid qualifiers range.
std::pair< uint32_t, uint32_t > ArgumentsRange
Indicates the [start, end) of the function argument list.
bool hasArguments() const
Returns true if this object holds a valid arguments range.
How to demangle a name in DemangleSymbol().
Definition Language.h:339
bool want_info
Whether to compute the DemangledNameInfo too.
Definition Language.h:341
A demangled name and, if requested, where its parts begin and end.
Definition Language.h:345
std::optional< DemangledNameInfo > info
Only computed if DemangleOptions::want_info is true.
Definition Language.h:349
std::string name
Empty if the name couldn't be demangled.
Definition Language.h:347
ConstString basename
If empty, the symbol is only indexed by its mangled name.
Definition Mangled.h:66
ConstString decl_context
The enclosing context.
Definition Mangled.h:71
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.