19#include "llvm/ADT/StringRef.h"
20#include "llvm/Demangle/ItaniumDemangle.h"
68std::unique_ptr<Language::MethodName>
70 std::unique_ptr<CxxMethodName> cpp_method =
71 std::make_unique<CxxMethodName>(full_name);
72 cpp_method->IsValid();
76std::pair<FunctionNameType, std::optional<ConstString>>
79 return {eFunctionNameTypeFull, std::nullopt};
81 FunctionNameType func_name_type = eFunctionNameTypeNone;
84 if (basename.empty()) {
85 llvm::StringRef context;
88 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
89 : eFunctionNameTypeFull);
91 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
97 func_name_type &= ~(eFunctionNameTypeBase);
100 if (basename.empty())
101 return {func_name_type, std::nullopt};
107 auto mangling_scheme =
117 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
118 if (mangled_name_cstr[0] ==
'_' && mangled_name_cstr[1] ==
'Z' &&
119 (mangled_name_cstr[2] !=
'T' &&
122 mangled_name_cstr[2] !=
'G' &&
123 mangled_name_cstr[2] !=
'Z'))
129 std::string shortname;
131 shortname = cxx_method.
GetContext().str() +
"::";
138 return demangled_name;
153 const llvm::StringRef &left_right_chars,
154 size_t &left_pos,
size_t &right_pos,
155 size_t pos = llvm::StringRef::npos) {
156 assert(left_right_chars.size() == 2);
157 left_pos = llvm::StringRef::npos;
158 const char left_char = left_right_chars[0];
159 const char right_char = left_right_chars[1];
160 pos = s.find_last_of(left_right_chars, pos);
161 if (pos == llvm::StringRef::npos || s[pos] == left_char)
165 while (pos > 0 && depth > 0) {
166 pos = s.find_last_of(left_right_chars, pos);
167 if (pos == llvm::StringRef::npos)
169 if (s[pos] == left_char) {
172 return left_pos < right_pos;
174 }
else if (s[pos] == right_char) {
187 if (basename.starts_with(
'~'))
190 if (basename.size() <= idx)
193 if (!std::isalpha(
static_cast<unsigned char>(basename[idx])) &&
194 basename[idx] !=
'_')
200 while (idx < basename.size()) {
201 if (!std::isalnum(
static_cast<unsigned char>(basename[idx])) &&
202 basename[idx] !=
'_')
208 return idx == basename.size();
215 char const *full_name,
224 if (!return_type.empty()) {
237 if (!qualifiers.empty()) {
245static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
249 return llvm::createStringError(
"Function does not have a mangled name.");
252 if (demangled_name.empty())
253 return llvm::createStringError(
254 "Function '%s' does not have a demangled name.",
259 return llvm::createStringError(
260 "Function '%s' does not have demangled info.", demangled_name.data());
263 if (!info->hasBasename())
264 return llvm::createStringError(
265 "DemangledInfo for '%s does not have basename range.",
266 demangled_name.data());
268 return std::make_pair(demangled_name, *info);
271static llvm::Expected<llvm::StringRef>
275 return info_or_err.takeError();
277 auto [demangled_name, info] = *info_or_err;
289llvm::Expected<llvm::StringRef>
293 return llvm::createStringError(
294 "Template arguments range for '%s' is invalid.", demangled.data());
300static llvm::Expected<llvm::StringRef>
304 return info_or_err.takeError();
306 auto [demangled_name, info] = *info_or_err;
311llvm::Expected<llvm::StringRef>
314 if (info.
ScopeRange.first >= demangled.size())
315 return llvm::createStringError(
316 "Scope range for '%s' LHS return type is invalid.", demangled.data());
318 return demangled.substr(0, info.
ScopeRange.first);
321static llvm::Expected<llvm::StringRef>
325 return info_or_err.takeError();
327 auto [demangled_name, info] = *info_or_err;
332llvm::Expected<llvm::StringRef>
336 return llvm::createStringError(
"Qualifiers range for '%s' is invalid.",
343static llvm::Expected<llvm::StringRef>
347 return info_or_err.takeError();
349 auto [demangled_name, info] = *info_or_err;
355llvm::Expected<llvm::StringRef>
359 return llvm::createStringError(
360 "Qualifiers range for '%s' RHS return type is invalid.",
367static llvm::Expected<llvm::StringRef>
371 return info_or_err.takeError();
373 auto [demangled_name, info] = *info_or_err;
378llvm::Expected<llvm::StringRef>
382 return llvm::createStringError(
"Scope range for '%s' is invalid.",
388static llvm::Expected<llvm::StringRef>
392 return info_or_err.takeError();
394 auto [demangled_name, info] = *info_or_err;
399llvm::Expected<llvm::StringRef>
403 return llvm::createStringError(
"Suffix range for '%s' is invalid.",
409static llvm::Expected<llvm::StringRef>
413 return info_or_err.takeError();
415 auto [demangled_name, info] = *info_or_err;
420llvm::Expected<llvm::StringRef>
424 return llvm::createStringError(
425 "Function arguments range for '%s' is invalid.", demangled.data());
436 "Failed to handle ${{function.formatted-arguments}} "
437 "frame-format variable: {0}");
441 auto [demangled_name, info] = *info_or_err;
447 "Failed to handle ${{function.formatted-arguments}} "
448 "frame-format variable: {0}");
462 size_t arg_start, arg_end;
463 llvm::StringRef full(
m_full.GetCString());
464 llvm::StringRef parens(
"()", 2);
466 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
467 if (arg_end + 1 < full.size())
472 size_t basename_end = arg_start;
473 size_t context_start = 0;
474 size_t context_end = full.rfind(
':', basename_end);
475 if (context_end == llvm::StringRef::npos)
478 if (context_start < context_end)
479 m_context = full.substr(context_start, context_end - 1 - context_start);
480 const size_t basename_begin = context_end + 1;
481 m_basename = full.substr(basename_begin, basename_end - basename_begin);
531 size_t arg_start, arg_end;
532 llvm::StringRef parens(
"<>", 2);
534 return basename.substr(0, arg_start);
545 return m_full.GetStringRef().contains(path);
547 llvm::StringRef identifier;
548 llvm::StringRef context;
549 std::string path_str = path.str();
551 path_str.c_str(), context, identifier);
553 return m_full.GetStringRef().contains(path);
580 if (!haystack.consume_back(context))
582 if (haystack.empty() || !isalnum(haystack.back()))
595 const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {
602 identifier = full_name->basename;
603 context = full_name->context;
611 std::vector<ConstString> alternates;
621 if (!strncmp(mangled_name.
GetCString(),
"_ZN", 3) &&
622 strncmp(mangled_name.
GetCString(),
"_ZNK", 4)) {
623 std::string fixed_scratch(
"_ZNK");
624 fixed_scratch.append(mangled_name.
GetCString() + 3);
629 if (!strncmp(mangled_name.
GetCString(),
"_Z", 2) &&
630 strncmp(mangled_name.
GetCString(),
"_ZL", 3)) {
631 std::string fixed_scratch(
"_ZL");
632 fixed_scratch.append(mangled_name.
GetCString() + 2);
642 if (
auto char_fixup_or_err =
645 if (*char_fixup_or_err)
646 alternates.push_back(*char_fixup_or_err);
649 "Failed to substitute 'char' type mangling: {0}");
652 if (
auto long_fixup_or_err =
654 if (*long_fixup_or_err)
655 alternates.push_back(*long_fixup_or_err);
658 "Failed to substitute 'long long' type mangling: {0}");
662 if (
auto ulong_fixup_or_err =
664 if (*ulong_fixup_or_err)
665 alternates.push_back(*ulong_fixup_or_err);
668 log, ulong_fixup_or_err.takeError(),
669 "Failed to substitute 'unsigned long long' type mangling: {0}");
673 if (*ctor_fixup_or_err) {
674 alternates.push_back(*ctor_fixup_or_err);
678 "Failed to substitute structor alias manglings: {0}");
692 if (!scope_qualified_name.size())
702 std::vector<ConstString> alternates;
705 std::vector<ConstString> param_and_qual_matches;
706 std::vector<ConstString> param_matches;
707 for (
size_t i = 0; i < alternates.size(); i++) {
708 ConstString alternate_mangled_name = alternates[i];
709 Mangled mangled(alternate_mangled_name);
718 param_and_qual_matches.push_back(alternate_mangled_name);
720 param_matches.push_back(alternate_mangled_name);
724 if (param_and_qual_matches.size())
725 return param_and_qual_matches[0];
727 else if (param_matches.size())
728 return param_matches[0];
734 if (!cpp_category_sp)
748 "std::string summary provider",
"^std::__[[:alnum:]]+::string$",
749 stl_summary_flags,
true);
752 "std::string summary provider",
753 "^std::__[[:alnum:]]+::basic_string<char, "
754 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
755 stl_summary_flags,
true);
758 "std::string summary provider",
759 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
760 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
761 stl_summary_flags,
true);
765 "std::u16string summary provider",
766 "^std::__[[:alnum:]]+::basic_string<char16_t, "
767 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
768 stl_summary_flags,
true);
772 "std::u32string summary provider",
773 "^std::__[[:alnum:]]+::basic_string<char32_t, "
774 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
775 stl_summary_flags,
true);
779 "std::wstring summary provider",
780 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags,
true);
783 "std::wstring summary provider",
784 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
785 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
786 stl_summary_flags,
true);
790 "std::string_view summary provider",
791 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags,
true);
794 "std::string_view summary provider",
795 "^std::__[[:alnum:]]+::basic_string_view<char, "
796 "std::__[[:alnum:]]+::char_traits<char> >$",
797 stl_summary_flags,
true);
800 "std::string_view summary provider",
801 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
802 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
803 stl_summary_flags,
true);
807 "std::u16string_view summary provider",
808 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
809 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
810 stl_summary_flags,
true);
814 "std::u32string_view summary provider",
815 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
816 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
817 stl_summary_flags,
true);
821 "std::wstring_view summary provider",
822 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags,
true);
825 "std::wstring_view summary provider",
826 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
827 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
828 stl_summary_flags,
true);
839 "libc++ std::bitset synthetic children",
840 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags,
true);
844 "libc++ std::vector synthetic children",
845 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags,
true);
849 "libc++ std::valarray synthetic children",
850 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags,
true);
854 "libc++ std::slice_array synthetic children",
855 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags,
true);
859 "libc++ synthetic children for the valarray proxy arrays",
860 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
861 stl_deref_flags,
true);
865 "libc++ std::forward_list synthetic children",
866 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags,
true);
870 "libc++ std::list synthetic children",
873 "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
874 "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
875 stl_deref_flags,
true);
879 "libc++ std::map synthetic children",
"^std::__[[:alnum:]]+::map<.+> >$",
880 stl_synth_flags,
true);
884 "libc++ std::set synthetic children",
"^std::__[[:alnum:]]+::set<.+> >$",
885 stl_deref_flags,
true);
889 "libc++ std::multiset synthetic children",
890 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags,
true);
894 "libc++ std::multimap synthetic children",
895 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags,
true);
899 "libc++ std::unordered containers synthetic children",
900 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
901 stl_synth_flags,
true);
903 "libc++ std::queue synthetic children",
904 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags,
true);
906 "libc++ std::tuple synthetic children",
907 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags,
true);
909 "libc++ std::optional synthetic children",
910 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags,
true);
912 "libc++ std::variant synthetic children",
913 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags,
true);
917 "libc++ std::atomic synthetic children",
918 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags,
true);
922 "libc++ std::span synthetic children",
"^std::__[[:alnum:]]+::span<.+>$",
923 stl_deref_flags,
true);
927 "libc++ std::ranges::ref_view synthetic children",
928 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags,
true);
930 cpp_category_sp->AddTypeSynthetic(
934 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
939 "shared_ptr synthetic children",
"^std::__[[:alnum:]]+::shared_ptr<.+>$",
940 stl_synth_flags,
true);
942 static constexpr const char *
const libcxx_std_unique_ptr_regex =
943 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
947 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
948 stl_synth_flags,
true);
953 "weak_ptr synthetic children",
"^std::__[[:alnum:]]+::weak_ptr<.+>$",
954 stl_synth_flags,
true);
957 "libc++ std::function summary provider",
958 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags,
true);
960 static constexpr const char *
const libcxx_std_coroutine_handle_regex =
961 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
965 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
966 stl_deref_flags,
true);
972 "libc++ std::bitset summary provider",
973 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags,
true);
976 "libc++ std::vector summary provider",
977 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags,
true);
980 "libc++ std::valarray summary provider",
981 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags,
true);
984 "libc++ std::slice_array summary provider",
985 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
989 "libc++ summary provider for the valarray proxy arrays",
990 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
991 stl_summary_flags,
true);
994 "libc++ std::list summary provider",
995 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags,
true);
998 "libc++ std::list summary provider",
1001 "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
1002 "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
1003 stl_summary_flags,
true);
1006 "libc++ std::map summary provider",
1007 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags,
true);
1010 "libc++ std::deque summary provider",
1011 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags,
true);
1014 "libc++ std::queue summary provider",
1015 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags,
true);
1018 "libc++ std::set summary provider",
1019 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags,
true);
1022 "libc++ std::multiset summary provider",
1023 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags,
true);
1026 "libc++ std::multimap summary provider",
1027 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags,
true);
1030 "libc++ std::unordered containers summary provider",
1031 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1032 stl_summary_flags,
true);
1034 "libc++ std::tuple summary provider",
1035 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags,
true);
1038 "libc++ std::atomic summary provider",
1039 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags,
true);
1042 "libc++ std::optional summary provider",
1043 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags,
true);
1046 "libc++ std::variant summary provider",
1047 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags,
true);
1050 "libc++ std::span summary provider",
1051 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags,
true);
1057 "libc++ std::shared_ptr summary provider",
1058 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1062 "libc++ std::weak_ptr summary provider",
1063 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags,
true);
1066 "libc++ std::unique_ptr summary provider",
1067 libcxx_std_unique_ptr_regex, stl_summary_flags,
true);
1071 "libc++ std::coroutine_handle summary provider",
1072 libcxx_std_coroutine_handle_regex, stl_summary_flags,
true);
1077 "std::vector iterator synthetic children",
1078 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags,
true);
1083 "std::map iterator synthetic children",
1084 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1090 "std::unordered_map iterator synthetic children",
1091 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1092 stl_synth_flags,
true);
1094 cpp_category_sp->AddTypeSummary(
1097 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ns")));
1098 cpp_category_sp->AddTypeSummary(
1101 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} µs")));
1102 cpp_category_sp->AddTypeSummary(
1105 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ms")));
1106 cpp_category_sp->AddTypeSummary(
1109 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1110 cpp_category_sp->AddTypeSummary(
1113 eTypeOptionHideValue,
1114 "${var.__rep_} min")));
1115 cpp_category_sp->AddTypeSummary(
1118 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} h")));
1120 cpp_category_sp->AddTypeSummary(
1123 eTypeOptionHideValue,
1124 "${var.__rep_} days")));
1125 cpp_category_sp->AddTypeSummary(
1128 eTypeOptionHideValue,
1129 "${var.__rep_} weeks")));
1130 cpp_category_sp->AddTypeSummary(
1133 eTypeOptionHideValue,
1134 "${var.__rep_} months")));
1135 cpp_category_sp->AddTypeSummary(
1138 eTypeOptionHideValue,
1139 "${var.__rep_} years")));
1140 cpp_category_sp->AddTypeSummary(
1143 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1149 "libc++ std::chrono::sys_seconds summary provider",
1150 "^std::__[[:alnum:]]+::chrono::time_point<"
1151 "std::__[[:alnum:]]+::chrono::system_clock, "
1152 "std::__[[:alnum:]]+::chrono::duration<.*, "
1153 "std::__[[:alnum:]]+::ratio<1, 1> "
1155 eTypeOptionHideChildren | eTypeOptionHideValue |
1160 "libc++ std::chrono::sys_seconds summary provider",
1161 "^std::__[[:alnum:]]+::chrono::time_point<"
1162 "std::__[[:alnum:]]+::chrono::system_clock, "
1163 "std::__[[:alnum:]]+::chrono::duration<int, "
1164 "std::__[[:alnum:]]+::ratio<86400, 1> "
1166 eTypeOptionHideChildren | eTypeOptionHideValue |
1173 "libc++ std::chrono::local_seconds summary provider",
1174 "^std::__[[:alnum:]]+::chrono::time_point<"
1175 "std::__[[:alnum:]]+::chrono::local_t, "
1176 "std::__[[:alnum:]]+::chrono::duration<.*, "
1177 "std::__[[:alnum:]]+::ratio<1, 1> "
1179 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1183 "libc++ std::chrono::local_seconds summary provider",
1184 "^std::__[[:alnum:]]+::chrono::time_point<"
1185 "std::__[[:alnum:]]+::chrono::local_t, "
1186 "std::__[[:alnum:]]+::chrono::duration<int, "
1187 "std::__[[:alnum:]]+::ratio<86400, 1> "
1189 eTypeOptionHideChildren | eTypeOptionHideValue |
1195 cpp_category_sp->AddTypeSummary(
1198 eTypeOptionHideValue,
1199 "day=${var.__d_%u}")));
1203 "libc++ std::chrono::month summary provider",
1204 "^std::__[[:alnum:]]+::chrono::month$",
1205 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1207 cpp_category_sp->AddTypeSummary(
1210 eTypeOptionHideChildren | eTypeOptionHideValue,
"year=${var.__y_}")));
1214 "libc++ std::chrono::weekday summary provider",
1215 "^std::__[[:alnum:]]+::chrono::weekday$",
1216 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1218 cpp_category_sp->AddTypeSummary(
1221 eTypeOptionHideChildren | eTypeOptionHideValue,
1222 "${var.__wd_} index=${var.__idx_%u}")));
1224 cpp_category_sp->AddTypeSummary(
1227 eTypeOptionHideValue,
1228 "${var.__wd_} index=last")));
1229 cpp_category_sp->AddTypeSummary(
1232 eTypeOptionHideValue,
1233 "${var.__m_} ${var.__d_}")));
1234 cpp_category_sp->AddTypeSummary(
1237 eTypeOptionHideValue,
1238 "${var.__m_} day=last")));
1240 cpp_category_sp->AddTypeSummary(
1243 eTypeOptionHideValue,
1244 "${var.__m_} ${var.__wdi_}")));
1246 cpp_category_sp->AddTypeSummary(
1249 eTypeOptionHideValue,
1250 "${var.__m_} ${var.__wdl_}")));
1252 cpp_category_sp->AddTypeSummary(
1255 eTypeOptionHideValue,
1256 "${var.__y_} ${var.__m_}")));
1261 "libc++ std::chrono::year_month_day summary provider",
1262 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1263 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1265 cpp_category_sp->AddTypeSummary(
1266 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1269 eTypeOptionHideValue,
1270 "${var.__y_} ${var.__mdl_}")));
1272 cpp_category_sp->AddTypeSummary(
1275 eTypeOptionHideChildren | eTypeOptionHideValue,
1276 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1278 cpp_category_sp->AddTypeSummary(
1279 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1282 eTypeOptionHideChildren | eTypeOptionHideValue,
1283 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1289 auto makeSpecifier = [](llvm::StringRef name) {
1290 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1294 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1296 category_sp->AddTypeSummary(
1297 makeSpecifier(llvm::formatv(
"std::basic_string<{}>", char_ty).str()),
1300 category_sp->AddTypeSummary(
1301 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1302 llvm::formatv(
"^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1313 category_sp->AddTypeSummary(
1314 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1321 category_sp->AddTypeSummary(
1322 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1324 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1332 if (!cpp_category_sp)
1346 "libstdc++ std::(w)string summary provider"));
1349 cpp_category_sp->AddTypeSummary(
1350 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1352 cpp_category_sp->AddTypeSummary(
"^std::__cxx11::basic_string<unsigned char, "
1353 "std::char_traits<unsigned char>,.*>$",
1358 cpp_category_sp->AddTypeSummary(
1359 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1368 cpp_category_sp->AddTypeSynthetic(
1372 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1373 cpp_category_sp->AddTypeSynthetic(
1377 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1378 cpp_category_sp->AddTypeSynthetic(
1382 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1383 cpp_category_sp->AddTypeSynthetic(
1387 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1388 cpp_category_sp->AddTypeSynthetic(
1392 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1393 cpp_category_sp->AddTypeSynthetic(
1397 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1398 cpp_category_sp->AddTypeSynthetic(
1402 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1403 cpp_category_sp->AddTypeSynthetic(
1407 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1408 cpp_category_sp->AddTypeSynthetic(
1412 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1419 "libstdc++ std::bitset summary provider",
1420 "^std::(__debug::)?bitset<.+>(( )?&)?$", stl_summary_flags,
true);
1424 "libstdc++ std::__debug::vector summary provider",
1425 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags,
true);
1429 "libstdc++ debug std::map summary provider",
1430 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags,
true);
1434 "libstdc++ debug std::set summary provider",
1435 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags,
true);
1438 "libstdc++ debug std::deque summary provider",
1439 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags,
true);
1443 "libstdc++ debug std::multimap summary provider",
1444 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags,
true);
1448 "libstdc++ debug std::multiset summary provider",
1449 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags,
true);
1453 "libstdc++ debug std unordered container summary provider",
1454 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1455 stl_summary_flags,
true);
1459 "libstdc++ debug std::list summary provider",
1460 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags,
true);
1462 cpp_category_sp->AddTypeSummary(
1466 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1471 "std::vector iterator synthetic children",
1472 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags,
true);
1477 "std::map iterator synthetic children",
1478 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags,
true);
1483 "std::unique_ptr synthetic children",
"^std::unique_ptr<.+>(( )?&)?$",
1484 stl_synth_flags,
true);
1486 static constexpr const char *
const libstdcpp_std_coroutine_handle_regex =
1487 "^std::coroutine_handle<.+>(( )?&)?$";
1491 "std::coroutine_handle synthetic children",
1492 libstdcpp_std_coroutine_handle_regex, stl_deref_flags,
true);
1497 "std::bitset synthetic child",
"^std::(__debug::)?bitset<.+>(( )?&)?$",
1498 stl_deref_flags,
true);
1502 "libstdc++ std::coroutine_handle summary provider",
1503 libstdcpp_std_coroutine_handle_regex, stl_summary_flags,
true);
1506static lldb_private::SyntheticChildrenFrontEnd *
1525static lldb_private::SyntheticChildrenFrontEnd *
1543static SyntheticChildrenFrontEnd *
1554static SyntheticChildrenFrontEnd *
1565 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1568static SyntheticChildrenFrontEnd *
1577 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1580static SyntheticChildrenFrontEnd *
1589 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1593static SyntheticChildrenFrontEnd *
1604static SyntheticChildrenFrontEnd *
1613 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1623static SyntheticChildrenFrontEnd *
1632 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1636static SyntheticChildrenFrontEnd *
1645 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1648static SyntheticChildrenFrontEnd *
1657 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1662 if (!cpp_category_sp)
1680 cpp_category_sp,
"std::string",
"char",
1681 std::make_shared<CXXFunctionSummaryFormat>(
1687 valobj, stream, options);
1690 "MSVC STL/libstdc++ std::string summary provider"));
1692 cpp_category_sp,
"std::wstring",
"wchar_t",
1693 std::make_shared<CXXFunctionSummaryFormat>(
1701 "MSVC STL/libstdc++ std::wstring summary provider"));
1708 "std::initializer_list synthetic children",
1709 "^std::initializer_list<.+>$", stl_synth_flags,
true);
1715 "std::shared_ptr synthetic children",
1716 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1718 "std::weak_ptr synthetic children",
1719 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1721 "std::unique_ptr synthetic children",
1722 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1724 "std::tuple synthetic children",
"^std::tuple<.*>(( )?&)?$",
1725 stl_synth_flags,
true);
1727 "std::list synthetic children",
"^std::list<.+>(( )?&)?$",
1728 stl_synth_flags,
true);
1730 "std::forward_list synthetic children",
1731 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags,
true);
1733 "std::variant synthetic children",
"^std::variant<.*>$",
1734 stl_synth_flags,
true);
1736 "std::unordered container synthetic children",
1737 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
1743 "std::optional synthetic children",
1744 "^std::optional<.+>(( )?&)?$", stl_deref_flags,
true);
1746 "std::deque container synthetic children",
1747 "^std::deque<.+>(( )?&)?$", stl_deref_flags,
true);
1750 "std::(multi)?map/set synthetic children",
1751 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
1755 "std::initializer_list summary provider",
1756 "^std::initializer_list<.+>$", stl_summary_flags,
true);
1758 "MSVC STL/libstdc++ std::shared_ptr summary provider",
1759 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1761 "MSVC STL/libstdc++ std::weak_ptr summary provider",
1762 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1764 "MSVC STL/libstdc++ std::unique_ptr summary provider",
1765 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1767 "MSVC STL/libstdc++ std::tuple summary provider",
1768 "^std::tuple<.*>(( )?&)?$", stl_summary_flags,
true);
1770 "MSVC/libstdc++ std::vector summary provider",
1771 "^std::vector<.+>(( )?&)?$", stl_summary_flags,
true);
1773 "MSVC/libstdc++ std::vector synthetic provider",
1774 "^std::vector<.+>(( )?&)?$", stl_synth_flags,
true);
1776 "MSVC STL/libstdc++ std::list summary provider",
1777 "^std::list<.+>(( )?&)?$", stl_summary_flags,
true);
1778 cpp_category_sp->AddTypeSummary(
1782 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1784 "MSVC STL/libstd++ std::optional summary provider",
1785 "^std::optional<.+>(( )?&)?$", stl_summary_flags,
true);
1787 "MSVC STL/libstdc++ std::variant summary provider",
1788 "^std::variant<.*>$", stl_summary_flags,
true);
1790 "MSVC STL/libstdc++ std unordered container summary provider",
1791 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
1794 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
1795 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
1798 "MSVC STL/libstd++ std::deque summary provider",
1799 "^std::deque<.+>(( )?&)?$", stl_summary_flags,
true);
1803 if (!cpp_category_sp)
1821 cpp_category_sp,
"std::u8string",
"char8_t",
1822 std::make_shared<CXXFunctionSummaryFormat>(
1825 "MSVC STL std::u8string summary provider"));
1827 cpp_category_sp,
"std::u16string",
"char16_t",
1828 std::make_shared<CXXFunctionSummaryFormat>(
1831 "MSVC STL std::u16string summary provider"));
1833 cpp_category_sp,
"std::u32string",
"char32_t",
1834 std::make_shared<CXXFunctionSummaryFormat>(
1837 "MSVC STL std::u32string summary provider"));
1840 cpp_category_sp,
"std::string_view",
"char",
1841 std::make_shared<CXXFunctionSummaryFormat>(
1844 "MSVC STL std::string_view summary provider"));
1846 cpp_category_sp,
"std::u8string_view",
"char8_t",
1847 std::make_shared<CXXFunctionSummaryFormat>(
1850 "MSVC STL std::u8string_view summary provider"));
1852 cpp_category_sp,
"std::u16string_view",
"char16_t",
1853 std::make_shared<CXXFunctionSummaryFormat>(
1856 "MSVC STL std::u16string_view summary provider"));
1858 cpp_category_sp,
"std::u32string_view",
"char32_t",
1859 std::make_shared<CXXFunctionSummaryFormat>(
1862 "MSVC STL std::u32string_view summary provider"));
1864 cpp_category_sp,
"std::wstring_view",
"wchar_t",
1865 std::make_shared<CXXFunctionSummaryFormat>(
1867 "MSVC STL std::wstring_view summary provider"));
1872 "MSVC STL std::atomic synthetic children",
1873 "^std::atomic<.+>$", stl_synth_flags,
true);
1876 "MSVC STL std::atomic summary provider",
"^std::atomic<.+>$",
1877 stl_summary_flags,
true);
1879 "MSVC STL tree iterator synthetic children",
1880 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
1883 "MSVC STL tree iterator summary",
1884 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
1889 if (!cpp_category_sp)
1912 "char8_t * summary provider",
"char8_t *", string_flags);
1915 "char8_t [] summary provider",
"char8_t ?\\[[0-9]+\\]",
1916 string_array_flags,
true);
1920 "char16_t * summary provider",
"char16_t *", string_flags);
1923 "char16_t [] summary provider",
"char16_t ?\\[[0-9]+\\]",
1924 string_array_flags,
true);
1928 "char32_t * summary provider",
"char32_t *", string_flags);
1931 "char32_t [] summary provider",
"char32_t ?\\[[0-9]+\\]",
1932 string_array_flags,
true);
1936 "wchar_t * summary provider",
"wchar_t *", string_flags);
1939 "wchar_t * summary provider",
"wchar_t ?\\[[0-9]+\\]",
1940 string_array_flags,
true);
1944 "unichar * summary provider",
"unichar *", string_flags);
1956 "char8_t summary provider",
"char8_t", widechar_flags);
1959 "char16_t summary provider",
"char16_t", widechar_flags);
1962 "char32_t summary provider",
"char32_t", widechar_flags);
1964 "wchar_t summary provider",
"wchar_t", widechar_flags);
1968 "unichar summary provider",
"unichar", widechar_flags);
1985 return std::unique_ptr<TypeScavenger>(
new CPlusPlusTypeScavenger());
1989 static llvm::once_flag g_initialize;
1992 llvm::call_once(g_initialize, [
this]() ->
void {
2012 static llvm::once_flag g_initialize;
2016 llvm::call_once(g_initialize, []() ->
void {
2017 g_formatters.push_back(
2024 "Function pointer summary provider"));
2028 return formatter_sp;
2032 g_formatters.push_back(
2039 .SetDontShowChildren(
true)
2040 .SetHideItemNames(
true)
2041 .SetShowMembersOneLiner(
true)
2042 .SetSkipPointers(
true)
2043 .SetSkipReferences(
false),
2045 "vector_type pointer summary provider"));
2047 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2048 return formatter_sp;
2052 g_formatters.push_back(
2059 .SetDontShowChildren(
true)
2060 .SetHideItemNames(
true)
2061 .SetShowMembersOneLiner(
true)
2062 .SetSkipPointers(
true)
2063 .SetSkipReferences(
false),
2065 "block pointer summary provider"));
2067 return formatter_sp;
2073 return g_formatters;
2078 static llvm::once_flag g_initialize;
2082 llvm::call_once(g_initialize, []() ->
void {
2090 .SetSkipPointers(
true)
2091 .SetSkipReferences(
true)
2092 .SetNonCacheable(
true),
2093 "vector_type synthetic children",
2096 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2097 return formatter_sp;
2108 .SetSkipPointers(
true)
2109 .SetSkipReferences(
true)
2110 .SetNonCacheable(
true),
2111 "block pointer synthetic children",
2114 return formatter_sp;
2120 return g_formatters;
2127 bool canReadValue =
true;
2129 return canReadValue && isZero;
2133 const auto suffixes = {
".cpp",
".cxx",
".c++",
".cc",
".c",
2134 ".h",
".hh",
".hpp",
".hxx",
".h++"};
2135 for (
auto suffix : suffixes) {
2136 if (file_path.ends_with_insensitive(suffix))
2142 return file_path.contains(
"/usr/include/c++/");
2150 return inline_block->GetBlockVariableList(
true);
2187 switch (representation) {
2208 llvm_unreachable(
"Fully covered switch above");
2217 if (!scope_or_err) {
2220 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2234 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2245 if (!template_args_or_err) {
2247 template_args_or_err.takeError(),
2248 "Failed to handle ${{function.template-arguments}} "
2249 "frame-format variable: {0}");
2253 s << *template_args_or_err;
2283 if (!return_rhs_or_err) {
2285 "Failed to handle ${{function.return-right}} frame-format "
2290 s << *return_rhs_or_err;
2296 if (!return_lhs_or_err) {
2298 "Failed to handle ${{function.return-left}} frame-format "
2303 s << *return_lhs_or_err;
2309 if (!quals_or_err) {
2311 "Failed to handle ${{function.qualifiers}} frame-format "
2322 if (!suffix_or_err) {
2325 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2329 s << *suffix_or_err;
2339class NodeAllocator {
2340 llvm::BumpPtrAllocator Alloc;
2343 void reset() { Alloc.Reset(); }
2345 template <
typename T,
typename...
Args> T *makeNode(
Args &&...args) {
2346 return new (Alloc.Allocate(
sizeof(T),
alignof(T)))
2347 T(std::forward<Args>(args)...);
2350 void *allocateNodeArray(
size_t sz) {
2351 return Alloc.Allocate(
sizeof(llvm::itanium_demangle::Node *) * sz,
2352 alignof(llvm::itanium_demangle::Node *));
2356template <
typename Derived>
2357class ManglingSubstitutor
2358 :
public llvm::itanium_demangle::AbstractManglingParser<Derived,
2361 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2364 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2366 template <
typename... Ts>
2367 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2369 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2370 return substituteImpl(Mangled);
2374 void reset(llvm::StringRef Mangled) {
2375 Base::reset(Mangled.begin(), Mangled.end());
2376 Written = Mangled.begin();
2378 Substituted =
false;
2381 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2382 if (this->parse() ==
nullptr)
2383 return llvm::createStringError(
2384 llvm::formatv(
"Failed to substitute mangling in '{0}'", Mangled));
2387 return ConstString();
2390 appendUnchangedInput();
2391 return ConstString(Result);
2394 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2395 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2399 appendUnchangedInput();
2403 Written += From.size();
2410 const char *Written =
"";
2412 llvm::SmallString<128> Result;
2415 bool Substituted =
false;
2417 const char *currentParserPos()
const {
return this->First; }
2419 void appendUnchangedInput() {
2421 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2422 Written = currentParserPos();
2428class TypeSubstitutor :
public ManglingSubstitutor<TypeSubstitutor> {
2429 llvm::StringRef Search;
2430 llvm::StringRef Replace;
2433 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2434 llvm::StringRef Replace) {
2435 ManglingSubstitutor::reset(Mangled);
2436 this->Search = Search;
2437 this->Replace = Replace;
2440 llvm::itanium_demangle::Node *parseType() {
2441 trySubstitute(Search, Replace);
2442 return ManglingSubstitutor::parseType();
2446class CtorDtorSubstitutor :
public ManglingSubstitutor<CtorDtorSubstitutor> {
2447 llvm::StringRef Search;
2448 llvm::StringRef Replace;
2451 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2452 llvm::StringRef Replace) {
2453 ManglingSubstitutor::reset(Mangled);
2454 this->Search = Search;
2455 this->Replace = Replace;
2458 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2460 llvm::itanium_demangle::Node *
2461 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *
State) {
2462 if (!Search.empty() && !Replace.empty()) {
2463 trySubstitute(Search, Replace);
2465 trySubstitute(
"D1",
"D2");
2466 trySubstitute(
"C1",
"C2");
2468 return ManglingSubstitutor::parseCtorDtorName(SoFar,
State);
2473llvm::Expected<ConstString>
2475 llvm::StringRef subst_from,
2476 llvm::StringRef subst_to) {
2477 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2481 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2482 llvm::StringRef subst_to) {
2483 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2486llvm::Expected<ConstString>
2488 llvm::StringRef mangled_name) {
2489 return CtorDtorSubstitutor().substitute(mangled_name);
2492#define LLDB_PROPERTIES_language_cplusplus
2493#include "LanguageCPlusPlusProperties.inc"
2496#define LLDB_PROPERTIES_language_cplusplus
2497#include "LanguageCPlusPlusPropertiesEnum.inc"
2501class PluginProperties :
public Properties {
2503 static llvm::StringRef GetSettingName() {
return "display"; }
2505 PluginProperties() {
2506 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2507 m_collection_sp->Initialize(g_language_cplusplus_properties);
2510 FormatEntity::Entry GetFunctionNameFormat()
const {
2511 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2512 ePropertyFunctionNameFormat, {});
2518 static PluginProperties g_settings;
2528 debugger, PluginProperties::GetSettingName())) {
2531 "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 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 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 llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * 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 lldb_private::SyntheticChildrenFrontEnd * GenericSmartPointerSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringViewSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(const SymbolContext &sc)
static bool ReverseFindMatchingChars(const llvm::StringRef &s, const llvm::StringRef &left_right_chars, size_t &left_pos, size_t &right_pos, size_t pos=llvm::StringRef::npos)
static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
Load formatters that are formatting types from more than one STL.
static SyntheticChildrenFrontEnd * GenericVectorSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static lldb_private::SyntheticChildrenFrontEnd * GenericUniquePtrSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericVariantSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericUniquePtrSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static PluginProperties & GetGlobalPluginProperties()
#define LLDB_LOG_ERROR(log, error,...)
bool lldb_private::formatters::MsvcStlStringSummaryProvider< StringElementType::ASCII >(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
lldb::TypeCategoryImplSP GetFormatters() override
static llvm::StringRef GetPluginNameStatic()
FormatEntity::Entry GetFunctionNameFormat() const override
HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override
static llvm::StringRef GetDemangledBasename(llvm::StringRef demangled, const DemangledNameInfo &info)
llvm::StringRef GetPluginName() override
std::vector< ConstString > GenerateAlternateFunctionManglings(const ConstString mangled) const override
static llvm::Expected< ConstString > SubstituteType_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium type encoding substrings given by subst_from in mangled_name with subst_to.
bool GetFunctionDisplayName(const SymbolContext &sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream &s) override
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(llvm::StringRef demangled, const DemangledNameInfo &info)
std::pair< lldb::FunctionNameType, std::optional< ConstString > > GetFunctionNameInfo(ConstString name) const override
bool DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(llvm::StringRef demangled, const DemangledNameInfo &info)
ConstString FindBestAlternateFunctionMangledName(const Mangled mangled, const SymbolContext &sym_ctx) const override
bool SymbolNameFitsToLanguage(const Mangled &mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
static bool ExtractContextAndIdentifier(const char *name, llvm::StringRef &context, llvm::StringRef &identifier)
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....
virtual std::unique_ptr< Language::MethodName > GetMethodName(ConstString name) const override
bool HandleFrameFormatVariable(const SymbolContext &sc, const ExecutionContext *exe_ctx, FormatEntity::Entry::Type type, Stream &s) override
static void DebuggerInitialize(Debugger &)
CPlusPlusLanguage()=default
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.
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C 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.
static bool GetCategory(ConstString category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
A class to manage flag bits.
"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.
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 bool IsMangledName(llvm::StringRef name)
ConstString GetMangledName() const
Mangled name get accessor.
ConstString GetDemangledName() const
Demangled name get accessor.
const std::optional< DemangledNameInfo > & GetDemangledInfo() const
Retrieve DemangledNameInfo of the demangled name held by this object.
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 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
CompilerType GetCompilerType()
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
virtual lldb::ValueType GetValueType() const =0
lldb::LanguageType GetObjectRuntimeLanguage()
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++.
std::shared_ptr< lldb_private::VariableList > VariableListSP
std::shared_ptr< lldb_private::SyntheticChildren > SyntheticChildrenSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVariableArgument
function argument variables
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< size_t, size_t > TemplateArgumentsRange
A [start, end) pair for the function template arguments.
std::pair< size_t, size_t > ArgumentsRange
Indicates the [start, end) of the function argument list.
std::pair< size_t, size_t > SuffixRange
Indicates the [start, end) of the function's suffix.
std::pair< size_t, size_t > BasenameRange
A [start, end) pair for the function basename.
bool hasTemplateArguments() const
Returns true if this object holds a valid template arguments range.
bool hasScope() const
Returns true if this object holds a valid scope range.
bool hasQualifiers() const
Returns true if this object holds a valid qualifiers range.
bool hasArguments() const
Returns true if this object holds a valid arguments range.
std::pair< size_t, size_t > ScopeRange
A [start, end) pair for the function scope qualifiers.
std::pair< size_t, size_t > QualifiersRange
Indicates the [start, end) of the function qualifiers (e.g., CV-qualifiers, reference qualifiers,...
@ FunctionTemplateArguments
@ FunctionFormattedArguments