20#include "llvm/ADT/StringRef.h"
21#include "llvm/Demangle/Demangle.h"
22#include "llvm/Demangle/ItaniumDemangle.h"
23#include "llvm/Support/ErrorExtras.h"
90std::unique_ptr<Language::MethodName>
92 std::unique_ptr<CxxMethodName> cpp_method =
93 std::make_unique<CxxMethodName>(full_name.str());
94 cpp_method->IsValid();
98std::pair<FunctionNameType, std::optional<ConstString>>
101 return {eFunctionNameTypeFull, std::nullopt};
103 FunctionNameType func_name_type = eFunctionNameTypeNone;
106 if (basename.empty()) {
107 llvm::StringRef context;
110 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
111 : eFunctionNameTypeFull);
113 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
119 func_name_type &= ~(eFunctionNameTypeBase);
122 if (basename.empty())
123 return {func_name_type, std::nullopt};
134 char *demangled_cstr = llvm::microsoftDemangle(
136 llvm::MSDemangleFlags(
137 llvm::MSDF_NoAccessSpecifier | llvm::MSDF_NoCallingConvention |
138 llvm::MSDF_NoMemberType | llvm::MSDF_NoVariableType));
141 if (demangled_cstr && demangled_cstr[0])
142 LLDB_LOGF(log,
"demangled msvc: %s -> \"%s\"", M.data(), demangled_cstr);
144 LLDB_LOGF(log,
"demangled msvc: %s -> error", M.data());
147 return demangled_cstr;
150static std::pair<char *, DemangledNameInfo>
152 char *demangled_cstr =
nullptr;
155 llvm::ItaniumPartialDemangler ipd;
156 bool err = ipd.partialDemangle(M);
160 size_t demangled_size = 80;
161 demangled_cstr =
static_cast<char *
>(std::malloc(80));
164 demangled_cstr = ipd.finishDemangle(&OB);
167 assert(demangled_cstr &&
168 "finishDemangle must always succeed if partialDemangle did");
169 assert(demangled_cstr[OB.getCurrentPosition() - 1] ==
'\0' &&
170 "Expected demangled_size to return length including trailing null");
175 LLDB_LOGF(log,
"demangled itanium: %s -> \"%s\"", M, demangled_cstr);
177 LLDB_LOGF(log,
"demangled itanium: %s -> error: failed to demangle", M);
181 "demangled itanium: %s -> error: failed to retrieve name info",
185 return {demangled_cstr, std::move(info)};
195 if (demangled_cstr) {
196 demangled.
name = demangled_cstr;
197 std::free(demangled_cstr);
200 demangled.
info = std::move(info);
203 demangled.
name = demangled_cstr;
204 std::free(demangled_cstr);
212 if (mangled.size() < 3 || !mangled.starts_with(
"_Z"))
216 switch (mangled[2]) {
234 : m_scheme(scheme) {}
236 std::optional<Mangled::FunctionNameParts>
237 Parse(
const Mangled &mangled)
override {
238 if (!ParseRichManglingInfo(mangled))
241 Mangled::FunctionNameParts parts;
242 llvm::StringRef base_name = m_rmc.ParseFunctionBaseName();
243 if (base_name.empty())
247 parts.
basename = ConstString(base_name);
248 llvm::StringRef decl_context = m_rmc.ParseFunctionDeclContextName();
249 if (decl_context.empty()) {
250 parts.
kind = Mangled::FunctionNameKind::TopLevel;
255 parts.
kind = m_rmc.IsCtorOrDtor()
256 ? Mangled::FunctionNameKind::ConstructorOrDestructor
257 : Mangled::FunctionNameKind::Unknown;
262 bool ParseRichManglingInfo(
const Mangled &mangled) {
266 m_rmc.FromItaniumName(mangled_name);
271 return !demangled.
IsEmpty() && m_rmc.FromCxxMethodName(demangled);
277 RichManglingContext m_rmc;
281std::unique_ptr<Language::MangledNameParser>
286 return std::make_unique<CPlusPlusMangledNameParser>(scheme);
293 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
294 if (mangled_name_cstr[0] ==
'_' && mangled_name_cstr[1] ==
'Z' &&
295 (mangled_name_cstr[2] !=
'T' &&
298 mangled_name_cstr[2] !=
'G' &&
299 mangled_name_cstr[2] !=
'Z'))
305 std::string shortname;
307 shortname = cxx_method.
GetContext().str() +
"::";
314 return demangled_name;
329 const llvm::StringRef &left_right_chars,
330 size_t &left_pos,
size_t &right_pos,
331 size_t pos = llvm::StringRef::npos) {
332 assert(left_right_chars.size() == 2);
333 left_pos = llvm::StringRef::npos;
334 const char left_char = left_right_chars[0];
335 const char right_char = left_right_chars[1];
336 pos = s.find_last_of(left_right_chars, pos);
337 if (pos == llvm::StringRef::npos || s[pos] == left_char)
341 while (pos > 0 && depth > 0) {
342 pos = s.find_last_of(left_right_chars, pos);
343 if (pos == llvm::StringRef::npos)
345 if (s[pos] == left_char) {
348 return left_pos < right_pos;
350 }
else if (s[pos] == right_char) {
363 if (basename.starts_with(
'~'))
366 if (basename.size() <= idx)
369 if (!std::isalpha(
static_cast<unsigned char>(basename[idx])) &&
370 basename[idx] !=
'_')
376 while (idx < basename.size()) {
377 if (!std::isalnum(
static_cast<unsigned char>(basename[idx])) &&
378 basename[idx] !=
'_')
384 return idx == basename.size();
392 context = context.trim();
394 const auto iter = context.find_if_not([](
char current) {
395 return std::isalnum(
static_cast<unsigned char>(current)) ||
396 current ==
'_' || current ==
':';
398 return iter == llvm::StringRef::npos;
405 llvm::StringRef full_name,
414 if (!return_type.empty()) {
427 if (!qualifiers.empty()) {
439 .GetDemangledNameInfoCacheSize());
443static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
447 return llvm::createStringError(
"function does not have a mangled name");
450 if (demangled_name.empty())
451 return llvm::createStringErrorV(
452 "function '{0}' does not have a demangled name",
457 return llvm::createStringErrorV(
458 "function '{0}' does not have demangled info", demangled_name);
461 if (!info->hasBasename())
462 return llvm::createStringErrorV(
463 "demangled info for '{0}' does not have a basename range",
466 return std::make_pair(demangled_name, *info);
469static llvm::Expected<llvm::StringRef>
473 return info_or_err.takeError();
475 auto [demangled_name, info] = *info_or_err;
487llvm::Expected<llvm::StringRef>
491 return llvm::createStringErrorV(
492 "template arguments range for '{0}' is invalid", demangled);
498static llvm::Expected<llvm::StringRef>
502 return info_or_err.takeError();
504 auto [demangled_name, info] = *info_or_err;
509llvm::Expected<llvm::StringRef>
512 if (info.
ScopeRange.first >= demangled.size())
513 return llvm::createStringErrorV(
514 "scope range for '{0}' LHS return type is invalid", demangled);
516 return demangled.substr(0, info.
ScopeRange.first);
519static llvm::Expected<llvm::StringRef>
523 return info_or_err.takeError();
525 auto [demangled_name, info] = *info_or_err;
530llvm::Expected<llvm::StringRef>
534 return llvm::createStringErrorV(
"qualifiers range for '{0}' is invalid",
541static llvm::Expected<llvm::StringRef>
545 return info_or_err.takeError();
547 auto [demangled_name, info] = *info_or_err;
553llvm::Expected<llvm::StringRef>
557 return llvm::createStringErrorV(
558 "qualifiers range for '{0}' RHS return type is invalid", demangled);
564static llvm::Expected<llvm::StringRef>
568 return info_or_err.takeError();
570 auto [demangled_name, info] = *info_or_err;
575llvm::Expected<llvm::StringRef>
579 return llvm::createStringErrorV(
"scope range for '{0}' is invalid",
585static llvm::Expected<llvm::StringRef>
589 return info_or_err.takeError();
591 auto [demangled_name, info] = *info_or_err;
596llvm::Expected<llvm::StringRef>
600 return llvm::createStringErrorV(
"suffix range for '{0}' is invalid",
606static llvm::Expected<llvm::StringRef>
610 return info_or_err.takeError();
612 auto [demangled_name, info] = *info_or_err;
617llvm::Expected<llvm::StringRef>
621 return llvm::createStringErrorV(
622 "function arguments range for '{0}' is invalid", demangled);
633 "Failed to handle ${{function.formatted-arguments}} "
634 "frame-format variable: {0}");
638 auto [demangled_name, info] = *info_or_err;
644 "Failed to handle ${{function.formatted-arguments}} "
645 "frame-format variable: {0}");
659 size_t arg_start, arg_end;
660 llvm::StringRef full(
m_full);
661 llvm::StringRef parens(
"()", 2);
663 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
664 if (arg_end + 1 < full.size())
669 size_t basename_end = arg_start;
670 size_t context_start = 0;
671 size_t context_end = full.rfind(
':', basename_end);
672 if (context_end == llvm::StringRef::npos)
675 if (context_start < context_end)
676 m_context = full.substr(context_start, context_end - 1 - context_start);
677 const size_t basename_begin = context_end + 1;
678 m_basename = full.substr(basename_begin, basename_end - basename_begin);
727 size_t arg_start, arg_end;
728 llvm::StringRef parens(
"<>", 2);
730 return basename.substr(0, arg_start);
741 return llvm::StringRef(
m_full).contains(path);
743 llvm::StringRef identifier;
744 llvm::StringRef context;
748 return llvm::StringRef(
m_full).contains(path);
775 if (!haystack.consume_back(context))
777 if (haystack.empty() || !isalnum(haystack.back()))
790 llvm::StringRef name, llvm::StringRef &context,
791 llvm::StringRef &identifier) {
798 identifier = full_name->basename;
799 context = full_name->context;
807 std::vector<ConstString> alternates;
817 if (!strncmp(mangled_name.
GetCString(),
"_ZN", 3) &&
818 strncmp(mangled_name.
GetCString(),
"_ZNK", 4)) {
819 std::string fixed_scratch(
"_ZNK");
820 fixed_scratch.append(mangled_name.
GetCString() + 3);
825 if (!strncmp(mangled_name.
GetCString(),
"_Z", 2) &&
826 strncmp(mangled_name.
GetCString(),
"_ZL", 3)) {
827 std::string fixed_scratch(
"_ZL");
828 fixed_scratch.append(mangled_name.
GetCString() + 2);
838 if (
auto char_fixup_or_err =
841 if (*char_fixup_or_err)
842 alternates.push_back(*char_fixup_or_err);
845 "Failed to substitute 'char' type mangling: {0}");
848 if (
auto long_fixup_or_err =
850 if (*long_fixup_or_err)
851 alternates.push_back(*long_fixup_or_err);
854 "Failed to substitute 'long long' type mangling: {0}");
858 if (
auto ulong_fixup_or_err =
860 if (*ulong_fixup_or_err)
861 alternates.push_back(*ulong_fixup_or_err);
864 log, ulong_fixup_or_err.takeError(),
865 "Failed to substitute 'unsigned long long' type mangling: {0}");
869 if (*ctor_fixup_or_err) {
870 alternates.push_back(*ctor_fixup_or_err);
874 "Failed to substitute structor alias manglings: {0}");
888 if (!scope_qualified_name.size())
898 std::vector<ConstString> alternates;
901 std::vector<ConstString> param_and_qual_matches;
902 std::vector<ConstString> param_matches;
903 for (
size_t i = 0; i < alternates.size(); i++) {
904 ConstString alternate_mangled_name = alternates[i];
905 Mangled mangled(alternate_mangled_name);
914 param_and_qual_matches.push_back(alternate_mangled_name);
916 param_matches.push_back(alternate_mangled_name);
920 if (param_and_qual_matches.size())
921 return param_and_qual_matches[0];
923 else if (param_matches.size())
924 return param_matches[0];
930 if (!cpp_category_sp)
944 "std::string summary provider",
"^std::__[[:alnum:]]+::string$",
945 stl_summary_flags,
true);
948 "std::string summary provider",
949 "^std::__[[:alnum:]]+::basic_string<char, "
950 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
951 stl_summary_flags,
true);
954 "std::string summary provider",
955 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
956 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
957 stl_summary_flags,
true);
961 "std::u16string summary provider",
962 "^std::__[[:alnum:]]+::basic_string<char16_t, "
963 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
964 stl_summary_flags,
true);
968 "std::u32string summary provider",
969 "^std::__[[:alnum:]]+::basic_string<char32_t, "
970 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
971 stl_summary_flags,
true);
975 "std::wstring summary provider",
976 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags,
true);
979 "std::wstring summary provider",
980 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
981 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
982 stl_summary_flags,
true);
986 "std::string_view summary provider",
987 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags,
true);
990 "std::string_view summary provider",
991 "^std::__[[:alnum:]]+::basic_string_view<char, "
992 "std::__[[:alnum:]]+::char_traits<char> >$",
993 stl_summary_flags,
true);
996 "std::string_view summary provider",
997 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
998 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
999 stl_summary_flags,
true);
1003 "std::u16string_view summary provider",
1004 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
1005 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
1006 stl_summary_flags,
true);
1010 "std::u32string_view summary provider",
1011 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
1012 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
1013 stl_summary_flags,
true);
1017 "std::wstring_view summary provider",
1018 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags,
true);
1021 "std::wstring_view summary provider",
1022 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
1023 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
1024 stl_summary_flags,
true);
1035 "libc++ std::bitset synthetic children",
1036 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags,
true);
1040 "libc++ std::vector synthetic children",
1041 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags,
true);
1045 "libc++ std::valarray synthetic children",
1046 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags,
true);
1050 "libc++ std::slice_array synthetic children",
1051 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags,
true);
1055 "libc++ synthetic children for the valarray proxy arrays",
1056 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1057 stl_deref_flags,
true);
1061 "libc++ std::forward_list synthetic children",
1062 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags,
true);
1066 "libc++ std::list synthetic children",
"^std::__[[:alnum:]]+::list<.+>$",
1067 stl_deref_flags,
true);
1071 "libc++ std::map synthetic children",
"^std::__[[:alnum:]]+::map<.+> >$",
1072 stl_synth_flags,
true);
1076 "libc++ std::set synthetic children",
"^std::__[[:alnum:]]+::set<.+> >$",
1077 stl_deref_flags,
true);
1081 "libc++ std::multiset synthetic children",
1082 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags,
true);
1086 "libc++ std::multimap synthetic children",
1087 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags,
true);
1091 "libc++ std::unordered containers synthetic children",
1092 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1093 stl_synth_flags,
true);
1095 "libc++ std::queue synthetic children",
1096 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags,
true);
1098 "libc++ std::tuple synthetic children",
1099 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags,
true);
1101 "libc++ std::optional synthetic children",
1102 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags,
true);
1104 "libc++ std::variant synthetic children",
1105 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags,
true);
1109 "libc++ std::atomic synthetic children",
1110 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags,
true);
1114 "libc++ std::span synthetic children",
"^std::__[[:alnum:]]+::span<.+>$",
1115 stl_deref_flags,
true);
1119 "libc++ std::ranges::ref_view synthetic children",
1120 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags,
true);
1122 cpp_category_sp->AddTypeSynthetic(
1126 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
1131 "shared_ptr synthetic children",
"^std::__[[:alnum:]]+::shared_ptr<.+>$",
1132 stl_synth_flags,
true);
1134 static constexpr const char *
const libcxx_std_unique_ptr_regex =
1135 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
1139 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
1140 stl_synth_flags,
true);
1145 "weak_ptr synthetic children",
"^std::__[[:alnum:]]+::weak_ptr<.+>$",
1146 stl_synth_flags,
true);
1149 "libc++ std::function summary provider",
1150 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags,
true);
1152 static constexpr const char *
const libcxx_std_coroutine_handle_regex =
1153 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
1157 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
1158 stl_deref_flags,
true);
1164 "libc++ std::bitset summary provider",
1165 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags,
true);
1168 "libc++ std::vector summary provider",
1169 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags,
true);
1172 "libc++ std::valarray summary provider",
1173 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags,
true);
1176 "libc++ std::slice_array summary provider",
1177 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
1181 "libc++ summary provider for the valarray proxy arrays",
1182 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1183 stl_summary_flags,
true);
1186 "libc++ std::list summary provider",
1187 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags,
true);
1190 "libc++ std::list summary provider",
1191 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags,
true);
1194 "libc++ std::map summary provider",
1195 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags,
true);
1198 "libc++ std::deque summary provider",
1199 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags,
true);
1202 "libc++ std::queue summary provider",
1203 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags,
true);
1206 "libc++ std::set summary provider",
1207 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags,
true);
1210 "libc++ std::multiset summary provider",
1211 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags,
true);
1214 "libc++ std::multimap summary provider",
1215 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags,
true);
1218 "libc++ std::unordered containers summary provider",
1219 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1220 stl_summary_flags,
true);
1222 "libc++ std::tuple summary provider",
1223 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags,
true);
1226 "libc++ std::atomic summary provider",
1227 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags,
true);
1230 "libc++ std::optional summary provider",
1231 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags,
true);
1234 "libc++ std::variant summary provider",
1235 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags,
true);
1238 "libc++ std::span summary provider",
1239 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags,
true);
1245 "libc++ std::shared_ptr summary provider",
1246 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1250 "libc++ std::weak_ptr summary provider",
1251 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags,
true);
1254 "libc++ std::unique_ptr summary provider",
1255 libcxx_std_unique_ptr_regex, stl_summary_flags,
true);
1259 "libc++ std::coroutine_handle summary provider",
1260 libcxx_std_coroutine_handle_regex, stl_summary_flags,
true);
1265 "std::vector iterator synthetic children",
1266 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags,
true);
1271 "std::map iterator synthetic children",
1272 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1278 "std::unordered_map iterator synthetic children",
1279 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1280 stl_synth_flags,
true);
1282 cpp_category_sp->AddTypeSummary(
1285 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ns")));
1286 cpp_category_sp->AddTypeSummary(
1289 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} µs")));
1290 cpp_category_sp->AddTypeSummary(
1293 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ms")));
1294 cpp_category_sp->AddTypeSummary(
1297 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1298 cpp_category_sp->AddTypeSummary(
1301 eTypeOptionHideValue,
1302 "${var.__rep_} min")));
1303 cpp_category_sp->AddTypeSummary(
1306 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} h")));
1308 cpp_category_sp->AddTypeSummary(
1311 eTypeOptionHideValue,
1312 "${var.__rep_} days")));
1313 cpp_category_sp->AddTypeSummary(
1316 eTypeOptionHideValue,
1317 "${var.__rep_} weeks")));
1318 cpp_category_sp->AddTypeSummary(
1321 eTypeOptionHideValue,
1322 "${var.__rep_} months")));
1323 cpp_category_sp->AddTypeSummary(
1326 eTypeOptionHideValue,
1327 "${var.__rep_} years")));
1328 cpp_category_sp->AddTypeSummary(
1331 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1337 "libc++ std::chrono::sys_seconds summary provider",
1338 "^std::__[[:alnum:]]+::chrono::time_point<"
1339 "std::__[[:alnum:]]+::chrono::system_clock, "
1340 "std::__[[:alnum:]]+::chrono::duration<.*, "
1341 "std::__[[:alnum:]]+::ratio<1, 1> "
1343 eTypeOptionHideChildren | eTypeOptionHideValue |
1348 "libc++ std::chrono::sys_seconds summary provider",
1349 "^std::__[[:alnum:]]+::chrono::time_point<"
1350 "std::__[[:alnum:]]+::chrono::system_clock, "
1351 "std::__[[:alnum:]]+::chrono::duration<int, "
1352 "std::__[[:alnum:]]+::ratio<86400, 1> "
1354 eTypeOptionHideChildren | eTypeOptionHideValue |
1361 "libc++ std::chrono::local_seconds summary provider",
1362 "^std::__[[:alnum:]]+::chrono::time_point<"
1363 "std::__[[:alnum:]]+::chrono::local_t, "
1364 "std::__[[:alnum:]]+::chrono::duration<.*, "
1365 "std::__[[:alnum:]]+::ratio<1, 1> "
1367 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1371 "libc++ std::chrono::local_seconds summary provider",
1372 "^std::__[[:alnum:]]+::chrono::time_point<"
1373 "std::__[[:alnum:]]+::chrono::local_t, "
1374 "std::__[[:alnum:]]+::chrono::duration<int, "
1375 "std::__[[:alnum:]]+::ratio<86400, 1> "
1377 eTypeOptionHideChildren | eTypeOptionHideValue |
1383 cpp_category_sp->AddTypeSummary(
1386 eTypeOptionHideValue,
1387 "day=${var.__d_%u}")));
1391 "libc++ std::chrono::month summary provider",
1392 "^std::__[[:alnum:]]+::chrono::month$",
1393 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1395 cpp_category_sp->AddTypeSummary(
1398 eTypeOptionHideChildren | eTypeOptionHideValue,
"year=${var.__y_}")));
1402 "libc++ std::chrono::weekday summary provider",
1403 "^std::__[[:alnum:]]+::chrono::weekday$",
1404 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1406 cpp_category_sp->AddTypeSummary(
1409 eTypeOptionHideChildren | eTypeOptionHideValue,
1410 "${var.__wd_} index=${var.__idx_%u}")));
1412 cpp_category_sp->AddTypeSummary(
1415 eTypeOptionHideValue,
1416 "${var.__wd_} index=last")));
1417 cpp_category_sp->AddTypeSummary(
1420 eTypeOptionHideValue,
1421 "${var.__m_} ${var.__d_}")));
1422 cpp_category_sp->AddTypeSummary(
1425 eTypeOptionHideValue,
1426 "${var.__m_} day=last")));
1428 cpp_category_sp->AddTypeSummary(
1431 eTypeOptionHideValue,
1432 "${var.__m_} ${var.__wdi_}")));
1434 cpp_category_sp->AddTypeSummary(
1437 eTypeOptionHideValue,
1438 "${var.__m_} ${var.__wdl_}")));
1440 cpp_category_sp->AddTypeSummary(
1443 eTypeOptionHideValue,
1444 "${var.__y_} ${var.__m_}")));
1449 "libc++ std::chrono::year_month_day summary provider",
1450 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1451 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1453 cpp_category_sp->AddTypeSummary(
1454 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1457 eTypeOptionHideValue,
1458 "${var.__y_} ${var.__mdl_}")));
1460 cpp_category_sp->AddTypeSummary(
1463 eTypeOptionHideChildren | eTypeOptionHideValue,
1464 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1466 cpp_category_sp->AddTypeSummary(
1467 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1470 eTypeOptionHideChildren | eTypeOptionHideValue,
1471 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1475 "libc++ std::partial_ordering summary provider",
1476 "^std::__[[:alnum:]]+::partial_ordering$",
1477 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1480 "libc++ std::weak_ordering summary provider",
1481 "^std::__[[:alnum:]]+::weak_ordering$",
1482 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1485 "libc++ std::strong_ordering summary provider",
1486 "^std::__[[:alnum:]]+::strong_ordering$",
1487 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1491 "libc++ std::source_location summary provider",
1492 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1499 auto makeSpecifier = [](llvm::StringRef name) {
1500 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1504 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1506 category_sp->AddTypeSummary(
1507 makeSpecifier(llvm::formatv(
"std::basic_string<{}>", char_ty).str()),
1510 category_sp->AddTypeSummary(
1511 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1512 llvm::formatv(
"^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1523 category_sp->AddTypeSummary(
1524 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1531 category_sp->AddTypeSummary(
1532 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1534 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1542 if (!cpp_category_sp)
1556 "libstdc++ std::(w)string summary provider"));
1559 cpp_category_sp->AddTypeSummary(
1560 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1562 cpp_category_sp->AddTypeSummary(
"^std::__cxx11::basic_string<unsigned char, "
1563 "std::char_traits<unsigned char>,.*>$",
1568 cpp_category_sp->AddTypeSummary(
1569 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1578 cpp_category_sp->AddTypeSynthetic(
1582 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1583 cpp_category_sp->AddTypeSynthetic(
1587 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1588 cpp_category_sp->AddTypeSynthetic(
1592 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1593 cpp_category_sp->AddTypeSynthetic(
1597 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1598 cpp_category_sp->AddTypeSynthetic(
1602 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1603 cpp_category_sp->AddTypeSynthetic(
1607 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1608 cpp_category_sp->AddTypeSynthetic(
1612 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1613 cpp_category_sp->AddTypeSynthetic(
1617 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1618 cpp_category_sp->AddTypeSynthetic(
1622 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1629 "libstdc++ std::bitset summary provider",
1630 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags,
true);
1634 "libstdc++ std::__debug::vector summary provider",
1635 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags,
true);
1639 "libstdc++ debug std::map summary provider",
1640 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags,
true);
1644 "libstdc++ debug std::set summary provider",
1645 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags,
true);
1648 "libstdc++ debug std::deque summary provider",
1649 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags,
true);
1653 "libstdc++ debug std::multimap summary provider",
1654 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags,
true);
1658 "libstdc++ debug std::multiset summary provider",
1659 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags,
true);
1663 "libstdc++ debug std unordered container summary provider",
1664 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1665 stl_summary_flags,
true);
1669 "libstdc++ debug std::list summary provider",
1670 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags,
true);
1672 cpp_category_sp->AddTypeSummary(
1676 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1681 "std::vector iterator synthetic children",
1682 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags,
true);
1687 "std::map iterator synthetic children",
1688 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags,
true);
1693 "std::unique_ptr synthetic children",
"^std::unique_ptr<.+>(( )?&)?$",
1694 stl_synth_flags,
true);
1696 static constexpr const char *
const libstdcpp_std_coroutine_handle_regex =
1697 "^std::coroutine_handle<.+>(( )?&)?$";
1701 "std::coroutine_handle synthetic children",
1702 libstdcpp_std_coroutine_handle_regex, stl_deref_flags,
true);
1707 "std::bitset synthetic child",
"^std::__debug::bitset<.+>(( )?&)?$",
1708 stl_deref_flags,
true);
1712 "libstdc++ std::coroutine_handle summary provider",
1713 libstdcpp_std_coroutine_handle_regex, stl_summary_flags,
true);
1718 "libstdc++ std::source_location summary provider",
"std::source_location",
1722static lldb_private::SyntheticChildrenFrontEnd *
1740static lldb_private::SyntheticChildrenFrontEnd *
1759static lldb_private::SyntheticChildrenFrontEnd *
1777static SyntheticChildrenFrontEnd *
1788static SyntheticChildrenFrontEnd *
1799 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1802static SyntheticChildrenFrontEnd *
1811 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1814static SyntheticChildrenFrontEnd *
1823 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1827static SyntheticChildrenFrontEnd *
1838static SyntheticChildrenFrontEnd *
1847 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1857static SyntheticChildrenFrontEnd *
1866 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1870static SyntheticChildrenFrontEnd *
1879 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1882static SyntheticChildrenFrontEnd *
1891 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1894static SyntheticChildrenFrontEnd *
1929static SyntheticChildrenFrontEnd *
1940static SyntheticChildrenFrontEnd *
1957static SyntheticChildrenFrontEnd *
1984 if (!cpp_category_sp)
2002 cpp_category_sp,
"std::string",
"char",
2003 std::make_shared<CXXFunctionSummaryFormat>(
2009 valobj, stream, options);
2012 "MSVC STL/libstdc++ std::string summary provider"));
2014 cpp_category_sp,
"std::wstring",
"wchar_t",
2015 std::make_shared<CXXFunctionSummaryFormat>(
2023 "MSVC STL/libstdc++ std::wstring summary provider"));
2026 cpp_category_sp,
"std::string_view",
"char",
2027 std::make_shared<CXXFunctionSummaryFormat>(
2033 valobj, stream, options);
2035 valobj, stream, options);
2037 "MSVC STL/libstdc++ std::string_view summary provider"));
2039 cpp_category_sp,
"std::u8string_view",
"char8_t",
2040 std::make_shared<CXXFunctionSummaryFormat>(
2046 valobj, stream, options);
2048 valobj, stream, options);
2050 "MSVC STL/libstdc++ std::u8string_view summary provider"));
2052 cpp_category_sp,
"std::u16string_view",
"char16_t",
2053 std::make_shared<CXXFunctionSummaryFormat>(
2059 valobj, stream, options);
2061 valobj, stream, options);
2063 "MSVC STL/libstdc++ std::u16string_view summary provider"));
2065 cpp_category_sp,
"std::u32string_view",
"char32_t",
2066 std::make_shared<CXXFunctionSummaryFormat>(
2072 valobj, stream, options);
2074 valobj, stream, options);
2076 "MSVC STL/libstdc++ std::u32string_view summary provider"));
2078 cpp_category_sp,
"std::wstring_view",
"wchar_t",
2079 std::make_shared<CXXFunctionSummaryFormat>(
2087 "MSVC STL/libstdc++ std::wstring_view summary provider"));
2090 "std::atomic synthetic children",
"^std::atomic<.+>$",
2091 stl_synth_flags,
true);
2097 "std::initializer_list synthetic children",
2098 "^std::initializer_list<.+>$", stl_synth_flags,
true);
2101 "MSVC STL/libstdc++ std::filesystem::path summary provider",
2102 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags,
true);
2105 "MSVC STL/libstdc++ std::source_location summary provider",
2106 "std::source_location", stl_summary_flags);
2112 "std::shared_ptr synthetic children",
2113 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
2115 "std::weak_ptr synthetic children",
2116 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
2118 "std::unique_ptr synthetic children",
2119 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
2121 "std::tuple synthetic children",
"^std::tuple<.*>(( )?&)?$",
2122 stl_synth_flags,
true);
2124 "std::list synthetic children",
"^std::list<.+>(( )?&)?$",
2125 stl_synth_flags,
true);
2127 "std::forward_list synthetic children",
2128 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags,
true);
2130 "std::variant synthetic children",
"^std::variant<.*>$",
2131 stl_synth_flags,
true);
2133 "std::unordered container synthetic children",
2134 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
2140 "std::optional synthetic children",
2141 "^std::optional<.+>(( )?&)?$", stl_deref_flags,
true);
2143 "std::deque container synthetic children",
2144 "^std::deque<.+>(( )?&)?$", stl_deref_flags,
true);
2146 "std::span container synthetic children",
"^std::span<.+>$",
2147 stl_deref_flags,
true);
2150 "std::(multi)?map/set synthetic children",
2151 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
2154 "std::bitset synthetic children",
"^std::bitset<.+>(( )?&)?$",
2155 stl_deref_flags,
true);
2158 "std::initializer_list summary provider",
2159 "^std::initializer_list<.+>$", stl_summary_flags,
true);
2161 "std::atomic summary provider",
"^std::atomic<.+>$",
2162 stl_summary_flags,
true);
2164 "MSVC STL/libstdc++ std::shared_ptr summary provider",
2165 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
2167 "MSVC STL/libstdc++ std::weak_ptr summary provider",
2168 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
2170 "MSVC STL/libstdc++ std::unique_ptr summary provider",
2171 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
2173 "MSVC STL/libstdc++ std::tuple summary provider",
2174 "^std::tuple<.*>(( )?&)?$", stl_summary_flags,
true);
2176 "MSVC/libstdc++ std::vector summary provider",
2177 "^std::vector<.+>(( )?&)?$", stl_summary_flags,
true);
2179 "MSVC/libstdc++ std::vector synthetic provider",
2180 "^std::vector<.+>(( )?&)?$", stl_synth_flags,
true);
2182 "MSVC STL/libstdc++ std::list summary provider",
2183 "^std::list<.+>(( )?&)?$", stl_summary_flags,
true);
2184 cpp_category_sp->AddTypeSummary(
2188 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
2190 "MSVC STL/libstd++ std::optional summary provider",
2191 "^std::optional<.+>(( )?&)?$", stl_summary_flags,
true);
2193 "MSVC STL/libstdc++ std::variant summary provider",
2194 "^std::variant<.*>$", stl_summary_flags,
true);
2196 "MSVC STL/libstdc++ std unordered container summary provider",
2197 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
2200 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
2201 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
2204 "MSVC STL/libstd++ std::deque summary provider",
2205 "^std::deque<.+>(( )?&)?$", stl_summary_flags,
true);
2207 "MSVC STL/libstd++ std::span summary provider",
2208 "^std::span<.+>$", stl_summary_flags,
true);
2210 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2211 "std::partial_ordering",
2212 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2214 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2215 "std::weak_ordering",
2216 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2218 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2219 "std::strong_ordering",
2220 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2225 "std::queue synthetic children",
"^std::queue<.+>(( )?&)?$",
2226 stl_synth_flags,
true);
2228 "std::stack synthetic children",
"^std::stack<.+>(( )?&)?$",
2229 stl_synth_flags,
true);
2231 "std::priority_queue synthetic children",
2232 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags,
true);
2234 "std::queue summary provider",
"^std::queue<.+>(( )?&)?$",
2235 stl_summary_flags,
true);
2237 "std::stack summary provider",
"^std::stack<.+>(( )?&)?$",
2238 stl_summary_flags,
true);
2240 "std::priority_queue summary provider",
2241 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags,
true);
2244 "MSVC STL/libstdc++ std::error_code summary provider",
2245 "std::error_code", stl_summary_flags);
2247 "MSVC STL/libstdc++ std::error_condition summary provider",
2248 "std::error_condition", stl_summary_flags);
2250 "MSVC STL/libstdc++ std::error_code/error_condition "
2251 "synthetic children",
2252 "^std::error_(code|condition)$", stl_synth_flags,
true);
2254 "MSVC STL/libstdc++ std::bitset summary provider",
2255 "^std::bitset<.+>(( )?&)?$", stl_summary_flags,
true);
2258 "MSVC STL std::expected synthetic children",
2259 "^std::expected<.+>(( )?&)?$", stl_deref_flags,
true);
2261 "MSVC STL std::expected summary provider",
2262 "^std::expected<.+>(( )?&)?$", stl_summary_flags,
true);
2265 "MSVC STL std::valarray synthetic children",
2266 "^std::valarray<.+>(( )?&)?$", stl_deref_flags,
true);
2268 "MSVC STL std::valarray summary provider",
2269 "^std::valarray<.+>(( )?&)?$", stl_summary_flags,
true);
2273 if (!cpp_category_sp)
2291 cpp_category_sp,
"std::u8string",
"char8_t",
2292 std::make_shared<CXXFunctionSummaryFormat>(
2295 "MSVC STL std::u8string summary provider"));
2297 cpp_category_sp,
"std::u16string",
"char16_t",
2298 std::make_shared<CXXFunctionSummaryFormat>(
2301 "MSVC STL std::u16string summary provider"));
2303 cpp_category_sp,
"std::u32string",
"char32_t",
2304 std::make_shared<CXXFunctionSummaryFormat>(
2307 "MSVC STL std::u32string summary provider"));
2312 "MSVC STL tree iterator synthetic children",
2313 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2316 "MSVC STL tree iterator summary",
2317 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2321 "MSVC STL vector iterator synthetic children",
2322 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
true);
2326 if (!cpp_category_sp)
2349 "char8_t * summary provider",
"char8_t *", string_flags);
2352 "char8_t [] summary provider",
"char8_t ?\\[[0-9]+\\]",
2353 string_array_flags,
true);
2357 "char16_t * summary provider",
"char16_t *", string_flags);
2360 "char16_t [] summary provider",
"char16_t ?\\[[0-9]+\\]",
2361 string_array_flags,
true);
2365 "char32_t * summary provider",
"char32_t *", string_flags);
2368 "char32_t [] summary provider",
"char32_t ?\\[[0-9]+\\]",
2369 string_array_flags,
true);
2373 "wchar_t * summary provider",
"wchar_t *", string_flags);
2376 "wchar_t * summary provider",
"wchar_t ?\\[[0-9]+\\]",
2377 string_array_flags,
true);
2381 "unichar * summary provider",
"unichar *", string_flags);
2393 "char8_t summary provider",
"char8_t", widechar_flags);
2396 "char16_t summary provider",
"char16_t", widechar_flags);
2399 "char32_t summary provider",
"char32_t", widechar_flags);
2401 "wchar_t summary provider",
"wchar_t", widechar_flags);
2405 "unichar summary provider",
"unichar", widechar_flags);
2422 return std::unique_ptr<TypeScavenger>(
new CPlusPlusTypeScavenger());
2426 static llvm::once_flag g_initialize;
2429 llvm::call_once(g_initialize, [
this]() ->
void {
2449 static llvm::once_flag g_initialize;
2453 llvm::call_once(g_initialize, []() ->
void {
2454 g_formatters.push_back(
2461 "Function pointer summary provider"));
2465 return formatter_sp;
2469 g_formatters.push_back(
2476 .SetDontShowChildren(
true)
2477 .SetHideItemNames(
true)
2478 .SetShowMembersOneLiner(
true)
2479 .SetSkipPointers(
true)
2480 .SetSkipReferences(
false),
2482 "vector_type pointer summary provider"));
2484 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2485 return formatter_sp;
2489 g_formatters.push_back(
2496 .SetDontShowChildren(
true)
2497 .SetHideItemNames(
true)
2498 .SetShowMembersOneLiner(
true)
2499 .SetSkipPointers(
true)
2500 .SetSkipReferences(
false),
2502 "block pointer summary provider"));
2504 return formatter_sp;
2510 return g_formatters;
2515 static llvm::once_flag g_initialize;
2519 llvm::call_once(g_initialize, []() ->
void {
2527 .SetSkipPointers(
true)
2528 .SetSkipReferences(
true)
2529 .SetNonCacheable(
true),
2530 "vector_type synthetic children",
2533 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2534 return formatter_sp;
2545 .SetSkipPointers(
true)
2546 .SetSkipReferences(
true)
2547 .SetNonCacheable(
true),
2548 "block pointer synthetic children",
2551 return formatter_sp;
2557 return g_formatters;
2564 bool canReadValue =
true;
2566 return canReadValue && isZero;
2570 const auto suffixes = {
".cpp",
".cxx",
".c++",
".cc",
".c",
2571 ".h",
".hh",
".hpp",
".hxx",
".h++"};
2572 for (
auto suffix : suffixes) {
2573 if (file_path.ends_with_insensitive(suffix))
2579 return file_path.contains(
"/usr/include/c++/");
2587 return inline_block->GetBlockVariableList(
true);
2624 switch (representation) {
2645 llvm_unreachable(
"Fully covered switch above");
2654 if (!scope_or_err) {
2657 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2671 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2682 if (!template_args_or_err) {
2684 template_args_or_err.takeError(),
2685 "Failed to handle ${{function.template-arguments}} "
2686 "frame-format variable: {0}");
2690 s << *template_args_or_err;
2720 if (!return_rhs_or_err) {
2722 "Failed to handle ${{function.return-right}} frame-format "
2727 s << *return_rhs_or_err;
2733 if (!return_lhs_or_err) {
2735 "Failed to handle ${{function.return-left}} frame-format "
2740 s << *return_lhs_or_err;
2746 if (!quals_or_err) {
2748 "Failed to handle ${{function.qualifiers}} frame-format "
2759 if (!suffix_or_err) {
2762 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2766 s << *suffix_or_err;
2776class NodeAllocator {
2777 llvm::BumpPtrAllocator Alloc;
2780 void reset() { Alloc.Reset(); }
2782 template <
typename T,
typename...
Args> T *makeNode(
Args &&...args) {
2783 return new (Alloc.Allocate(
sizeof(T),
alignof(T)))
2784 T(std::forward<Args>(args)...);
2787 void *allocateNodeArray(
size_t sz) {
2788 return Alloc.Allocate(
sizeof(llvm::itanium_demangle::Node *) * sz,
2789 alignof(llvm::itanium_demangle::Node *));
2793template <
typename Derived>
2794class ManglingSubstitutor
2795 :
public llvm::itanium_demangle::AbstractManglingParser<Derived,
2798 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2801 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2803 template <
typename... Ts>
2804 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2806 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2807 return substituteImpl(Mangled);
2811 void reset(llvm::StringRef Mangled) {
2812 Base::reset(Mangled.begin(), Mangled.end());
2813 Written = Mangled.begin();
2815 Substituted =
false;
2818 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2819 if (this->parse() ==
nullptr)
2820 return llvm::createStringErrorV(
"failed to substitute mangling in '{0}'",
2824 return ConstString();
2827 appendUnchangedInput();
2828 return ConstString(Result);
2831 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2832 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2836 appendUnchangedInput();
2840 Written += From.size();
2847 const char *Written =
"";
2849 llvm::SmallString<128> Result;
2852 bool Substituted =
false;
2854 const char *currentParserPos()
const {
return this->First; }
2856 void appendUnchangedInput() {
2858 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2859 Written = currentParserPos();
2865class TypeSubstitutor :
public ManglingSubstitutor<TypeSubstitutor> {
2866 llvm::StringRef Search;
2867 llvm::StringRef Replace;
2870 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2871 llvm::StringRef Replace) {
2872 ManglingSubstitutor::reset(Mangled);
2873 this->Search = Search;
2874 this->Replace = Replace;
2877 llvm::itanium_demangle::Node *parseType() {
2878 trySubstitute(Search, Replace);
2879 return ManglingSubstitutor::parseType();
2883class CtorDtorSubstitutor :
public ManglingSubstitutor<CtorDtorSubstitutor> {
2884 llvm::StringRef Search;
2885 llvm::StringRef Replace;
2888 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2889 llvm::StringRef Replace) {
2890 ManglingSubstitutor::reset(Mangled);
2891 this->Search = Search;
2892 this->Replace = Replace;
2895 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2897 llvm::itanium_demangle::Node *
2898 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *
State) {
2899 if (!Search.empty() && !Replace.empty()) {
2900 trySubstitute(Search, Replace);
2902 trySubstitute(
"D1",
"D2");
2903 trySubstitute(
"C1",
"C2");
2905 return ManglingSubstitutor::parseCtorDtorName(SoFar,
State);
2910llvm::Expected<ConstString>
2912 llvm::StringRef subst_from,
2913 llvm::StringRef subst_to) {
2914 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2918 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2919 llvm::StringRef subst_to) {
2920 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2923llvm::Expected<ConstString>
2925 llvm::StringRef mangled_name) {
2926 return CtorDtorSubstitutor().substitute(mangled_name);
2929#define LLDB_PROPERTIES_language_cplusplus
2930#include "LanguageCPlusPlusProperties.inc"
2933#define LLDB_PROPERTIES_language_cplusplus
2934#include "LanguageCPlusPlusPropertiesEnum.inc"
2938class PluginProperties :
public Properties {
2940 static llvm::StringRef GetSettingName() {
return "display"; }
2942 PluginProperties() {
2943 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2944 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2947 FormatEntity::Entry GetFunctionNameFormat()
const {
2948 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2949 ePropertyFunctionNameFormat, {});
2955 static PluginProperties g_settings;
2965 debugger, PluginProperties::GetSettingName())) {
2968 "Properties for the CPlusPlus language plug-in.",
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(const SymbolContext &sc)
static bool GenericStrongOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericUnorderedSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericDequeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static bool GenericAtomicSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool IsTrivialBasename(const llvm::StringRef &basename)
static SyntheticChildrenFrontEnd * GenericExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericTupleSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledBasename(const SymbolContext &sc)
static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericValarraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool IsTrivialContext(llvm::StringRef context)
A context is trivial if an only if it matches this pattern.
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static bool IsCPlusPlusManglingScheme(Mangled::ManglingScheme scheme)
static bool GenericSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static Mangled::ManglingScheme g_itanium_scheme
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static std::pair< char *, DemangledNameInfo > GetItaniumDemangledStr(const char *M)
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericValarraySyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static lldb_private::SyntheticChildrenFrontEnd * GenericAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *children, const lldb::ValueObjectSP &valobj_sp)
static SyntheticChildrenFrontEnd * GenericMapLikeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledTemplateArguments(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericExpectedSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static lldb_private::SyntheticChildrenFrontEnd * GenericSmartPointerSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool SkipItaniumName(llvm::StringRef mangled)
Returns true for the Itanium names that aren't worth indexing as functions.
static void RegisterStdStringViewSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(const SymbolContext &sc)
static bool ReverseFindMatchingChars(const llvm::StringRef &s, const llvm::StringRef &left_right_chars, size_t &left_pos, size_t &right_pos, size_t pos=llvm::StringRef::npos)
static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
Load formatters that are formatting types from more than one STL.
static SyntheticChildrenFrontEnd * GenericVectorSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static Mangled::ManglingScheme g_msvc_scheme
static DemangledNameInfoCache & GetDemangledInfoCache()
static lldb_private::SyntheticChildrenFrontEnd * GenericUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static char * GetMSVCDemangledStr(llvm::StringRef M)
static bool GenericUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static 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,...)
#define LLDB_LOG_ERROR(log, error,...)
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF32 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF8 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool lldb_private::formatters::MsvcStlStringSummaryProvider< StringElementType::ASCII >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::ASCII >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
bool lldb_private::formatters::MsvcStlStringViewSummaryProvider< StringElementType::UTF16 >(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &summary_options)
#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.
A class that describes a single lexical block.
lldb::VariableListSP GetBlockVariableList(bool can_create)
Get the variable list for this block only.
Block * GetContainingInlinedBlock()
Get the inlined block that contains this block.
bool ContainsPath(llvm::StringRef path)
llvm::StringRef GetBasenameNoTemplateParameters()
Returns the Basename of this method without a template parameter list, if any.
bool TrySimplifiedParse()
bool IsNilReference(ValueObject &valobj) override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeLHS(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledTemplateArguments(llvm::StringRef demangled, const DemangledNameInfo &info)
bool IsSourceFile(llvm::StringRef file_path) const override
ConstString GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override
std::unique_ptr< MangledNameParser > CreateMangledNameParser(Mangled::ManglingScheme scheme) const override
Returns a parser for the names mangled with scheme, a scheme that this language registered,...
static bool ExtractContextAndIdentifier(llvm::StringRef name, llvm::StringRef &context, llvm::StringRef &identifier)
lldb::TypeCategoryImplSP GetFormatters() override
static llvm::StringRef GetPluginNameStatic()
FormatEntity::Entry GetFunctionNameFormat() const override
HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override
static llvm::StringRef GetDemangledBasename(llvm::StringRef demangled, const DemangledNameInfo &info)
llvm::StringRef GetPluginName() override
std::vector< ConstString > GenerateAlternateFunctionManglings(const ConstString mangled) const override
static llvm::Expected< ConstString > SubstituteType_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium type encoding substrings given by subst_from in mangled_name with subst_to.
bool GetFunctionDisplayName(const SymbolContext &sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream &s) override
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(llvm::StringRef demangled, const DemangledNameInfo &info)
std::pair< lldb::FunctionNameType, std::optional< ConstString > > GetFunctionNameInfo(ConstString name) const override
bool DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(llvm::StringRef demangled, const DemangledNameInfo &info)
ConstString FindBestAlternateFunctionMangledName(const Mangled mangled, const SymbolContext &sym_ctx) const override
DemangledName DemangleSymbol(ConstString mangled, Mangled::ManglingScheme scheme, const DemangleOptions &options) const override
Demangle mangled, a name mangled with scheme, a scheme that this language registered with Mangled::Re...
bool SymbolNameFitsToLanguage(const Mangled &mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
static llvm::Expected< llvm::StringRef > GetDemangledFunctionArguments(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledScope(llvm::StringRef demangled, const DemangledNameInfo &info)
std::unique_ptr< TypeScavenger > GetTypeScavenger() override
static llvm::Expected< ConstString > SubstituteStructor_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium structor encoding substrings given by subst_from in mangled_name with subst_to.
HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override
static lldb_private::Language * CreateInstance(lldb::LanguageType language)
static llvm::Expected< ConstString > SubstituteStructorAliases_ItaniumMangle(llvm::StringRef mangled_name)
Tries replacing Itanium structor encoding substrings in mangled_name with potential aliases....
bool HandleFrameFormatVariable(const SymbolContext &sc, const ExecutionContext *exe_ctx, FormatEntity::Entry::Type type, Stream &s) override
static void DebuggerInitialize(Debugger &)
CPlusPlusLanguage()=default
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 IsFunctionPointerType() const
bool IsTypedefType() const
bool IsVectorType(CompilerType *element_type=nullptr, uint64_t *size=nullptr) const
A uniqued constant string class.
bool IsEmpty() const
Test for empty string.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
static bool GetCategory(llvm::StringRef category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
A class to manage flag bits.
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
Block & GetBlock(bool can_create)
Get accessor for the block list.
Parses mangled function names.
llvm::StringRef m_return_type
llvm::StringRef GetArguments()
llvm::StringRef m_basename
llvm::StringRef GetQualifiers()
llvm::StringRef m_qualifiers
std::string m_scope_qualified
llvm::StringRef m_arguments
llvm::StringRef GetReturnType()
llvm::StringRef GetBasename()
llvm::StringRef m_context
std::string GetScopeQualifiedName()
llvm::StringRef GetContext()
FunctionNameRepresentation
static bool LanguageIsC(lldb::LanguageType language)
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
A class that handles mangled names.
static ManglingScheme RegisterManglingScheme(llvm::ArrayRef< llvm::StringRef > prefixes, lldb::LanguageType language, ManglingSchemeMatcher matches=nullptr)
Register a mangling scheme for language.
static bool IsMangledName(llvm::StringRef name)
ConstString GetMangledName() const
Mangled name get accessor.
ConstString GetDemangledName() const
Demangled name get accessor.
ConstString GetName(NamePreference preference=ePreferDemangled) const
Best name get accessor.
static Mangled::ManglingScheme GetManglingScheme(llvm::StringRef name)
Try to identify the mangling scheme used.
static void UnregisterManglingScheme(ManglingScheme scheme)
Stop recognizing the names of scheme, a scheme returned by RegisterManglingScheme().
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.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
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.
virtual void GetMangledNamesForFunction(const std::string &scope_qualified_name, std::vector< ConstString > &mangled_names)
ConstString GetName() const
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)
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)
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.
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
LanguageType
Programming language type.
@ eLanguageTypeObjC_plus_plus
Objective-C++.
@ eLanguageTypeC_plus_plus
ISO C++:1998.
std::shared_ptr< lldb_private::VariableList > VariableListSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVariableArgument
function argument variables
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
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.
@ FunctionTemplateArguments
@ FunctionFormattedArguments
How to demangle a name in DemangleSymbol().
bool want_info
Whether to compute the DemangledNameInfo too.
A demangled name and, if requested, where its parts begin and end.
std::optional< DemangledNameInfo > info
Only computed if DemangleOptions::want_info is true.
std::string name
Empty if the name couldn't be demangled.
ConstString basename
If empty, the symbol is only indexed by its mangled name.
ConstString decl_context
The enclosing context.
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.