19#include "llvm/ADT/StringRef.h"
20#include "llvm/Demangle/ItaniumDemangle.h"
21#include "llvm/Support/ErrorExtras.h"
70std::unique_ptr<Language::MethodName>
72 std::unique_ptr<CxxMethodName> cpp_method =
73 std::make_unique<CxxMethodName>(full_name.str());
74 cpp_method->IsValid();
78std::pair<FunctionNameType, std::optional<ConstString>>
81 return {eFunctionNameTypeFull, std::nullopt};
83 FunctionNameType func_name_type = eFunctionNameTypeNone;
86 if (basename.empty()) {
87 llvm::StringRef context;
90 ? (eFunctionNameTypeMethod | eFunctionNameTypeBase)
91 : eFunctionNameTypeFull);
93 func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
99 func_name_type &= ~(eFunctionNameTypeBase);
102 if (basename.empty())
103 return {func_name_type, std::nullopt};
109 auto mangling_scheme =
119 if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
120 if (mangled_name_cstr[0] ==
'_' && mangled_name_cstr[1] ==
'Z' &&
121 (mangled_name_cstr[2] !=
'T' &&
124 mangled_name_cstr[2] !=
'G' &&
125 mangled_name_cstr[2] !=
'Z'))
131 std::string shortname;
133 shortname = cxx_method.
GetContext().str() +
"::";
140 return demangled_name;
155 const llvm::StringRef &left_right_chars,
156 size_t &left_pos,
size_t &right_pos,
157 size_t pos = llvm::StringRef::npos) {
158 assert(left_right_chars.size() == 2);
159 left_pos = llvm::StringRef::npos;
160 const char left_char = left_right_chars[0];
161 const char right_char = left_right_chars[1];
162 pos = s.find_last_of(left_right_chars, pos);
163 if (pos == llvm::StringRef::npos || s[pos] == left_char)
167 while (pos > 0 && depth > 0) {
168 pos = s.find_last_of(left_right_chars, pos);
169 if (pos == llvm::StringRef::npos)
171 if (s[pos] == left_char) {
174 return left_pos < right_pos;
176 }
else if (s[pos] == right_char) {
189 if (basename.starts_with(
'~'))
192 if (basename.size() <= idx)
195 if (!std::isalpha(
static_cast<unsigned char>(basename[idx])) &&
196 basename[idx] !=
'_')
202 while (idx < basename.size()) {
203 if (!std::isalnum(
static_cast<unsigned char>(basename[idx])) &&
204 basename[idx] !=
'_')
210 return idx == basename.size();
218 context = context.trim();
220 const auto iter = context.find_if_not([](
char current) {
221 return std::isalnum(
static_cast<unsigned char>(current)) ||
222 current ==
'_' || current ==
':';
224 return iter == llvm::StringRef::npos;
231 llvm::StringRef full_name,
240 if (!return_type.empty()) {
253 if (!qualifiers.empty()) {
265 .GetDemangledNameInfoCacheSize());
269static llvm::Expected<std::pair<llvm::StringRef, DemangledNameInfo>>
273 return llvm::createStringError(
"function does not have a mangled name");
276 if (demangled_name.empty())
277 return llvm::createStringErrorV(
278 "function '{0}' does not have a demangled name",
283 return llvm::createStringErrorV(
284 "function '{0}' does not have demangled info", demangled_name);
287 if (!info->hasBasename())
288 return llvm::createStringErrorV(
289 "demangled info for '{0}' does not have a basename range",
292 return std::make_pair(demangled_name, *info);
295static llvm::Expected<llvm::StringRef>
299 return info_or_err.takeError();
301 auto [demangled_name, info] = *info_or_err;
313llvm::Expected<llvm::StringRef>
317 return llvm::createStringErrorV(
318 "template arguments range for '{0}' is invalid", demangled);
324static llvm::Expected<llvm::StringRef>
328 return info_or_err.takeError();
330 auto [demangled_name, info] = *info_or_err;
335llvm::Expected<llvm::StringRef>
338 if (info.
ScopeRange.first >= demangled.size())
339 return llvm::createStringErrorV(
340 "scope range for '{0}' LHS return type is invalid", demangled);
342 return demangled.substr(0, info.
ScopeRange.first);
345static llvm::Expected<llvm::StringRef>
349 return info_or_err.takeError();
351 auto [demangled_name, info] = *info_or_err;
356llvm::Expected<llvm::StringRef>
360 return llvm::createStringErrorV(
"qualifiers range for '{0}' is invalid",
367static llvm::Expected<llvm::StringRef>
371 return info_or_err.takeError();
373 auto [demangled_name, info] = *info_or_err;
379llvm::Expected<llvm::StringRef>
383 return llvm::createStringErrorV(
384 "qualifiers range for '{0}' RHS return type is invalid", demangled);
390static llvm::Expected<llvm::StringRef>
394 return info_or_err.takeError();
396 auto [demangled_name, info] = *info_or_err;
401llvm::Expected<llvm::StringRef>
405 return llvm::createStringErrorV(
"scope range for '{0}' is invalid",
411static llvm::Expected<llvm::StringRef>
415 return info_or_err.takeError();
417 auto [demangled_name, info] = *info_or_err;
422llvm::Expected<llvm::StringRef>
426 return llvm::createStringErrorV(
"suffix range for '{0}' is invalid",
432static llvm::Expected<llvm::StringRef>
436 return info_or_err.takeError();
438 auto [demangled_name, info] = *info_or_err;
443llvm::Expected<llvm::StringRef>
447 return llvm::createStringErrorV(
448 "function arguments range for '{0}' is invalid", demangled);
459 "Failed to handle ${{function.formatted-arguments}} "
460 "frame-format variable: {0}");
464 auto [demangled_name, info] = *info_or_err;
470 "Failed to handle ${{function.formatted-arguments}} "
471 "frame-format variable: {0}");
485 size_t arg_start, arg_end;
486 llvm::StringRef full(
m_full);
487 llvm::StringRef parens(
"()", 2);
489 m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
490 if (arg_end + 1 < full.size())
495 size_t basename_end = arg_start;
496 size_t context_start = 0;
497 size_t context_end = full.rfind(
':', basename_end);
498 if (context_end == llvm::StringRef::npos)
501 if (context_start < context_end)
502 m_context = full.substr(context_start, context_end - 1 - context_start);
503 const size_t basename_begin = context_end + 1;
504 m_basename = full.substr(basename_begin, basename_end - basename_begin);
553 size_t arg_start, arg_end;
554 llvm::StringRef parens(
"<>", 2);
556 return basename.substr(0, arg_start);
567 return llvm::StringRef(
m_full).contains(path);
569 llvm::StringRef identifier;
570 llvm::StringRef context;
574 return llvm::StringRef(
m_full).contains(path);
601 if (!haystack.consume_back(context))
603 if (haystack.empty() || !isalnum(haystack.back()))
616 llvm::StringRef name, llvm::StringRef &context,
617 llvm::StringRef &identifier) {
624 identifier = full_name->basename;
625 context = full_name->context;
633 std::vector<ConstString> alternates;
643 if (!strncmp(mangled_name.
GetCString(),
"_ZN", 3) &&
644 strncmp(mangled_name.
GetCString(),
"_ZNK", 4)) {
645 std::string fixed_scratch(
"_ZNK");
646 fixed_scratch.append(mangled_name.
GetCString() + 3);
651 if (!strncmp(mangled_name.
GetCString(),
"_Z", 2) &&
652 strncmp(mangled_name.
GetCString(),
"_ZL", 3)) {
653 std::string fixed_scratch(
"_ZL");
654 fixed_scratch.append(mangled_name.
GetCString() + 2);
664 if (
auto char_fixup_or_err =
667 if (*char_fixup_or_err)
668 alternates.push_back(*char_fixup_or_err);
671 "Failed to substitute 'char' type mangling: {0}");
674 if (
auto long_fixup_or_err =
676 if (*long_fixup_or_err)
677 alternates.push_back(*long_fixup_or_err);
680 "Failed to substitute 'long long' type mangling: {0}");
684 if (
auto ulong_fixup_or_err =
686 if (*ulong_fixup_or_err)
687 alternates.push_back(*ulong_fixup_or_err);
690 log, ulong_fixup_or_err.takeError(),
691 "Failed to substitute 'unsigned long long' type mangling: {0}");
695 if (*ctor_fixup_or_err) {
696 alternates.push_back(*ctor_fixup_or_err);
700 "Failed to substitute structor alias manglings: {0}");
714 if (!scope_qualified_name.size())
724 std::vector<ConstString> alternates;
727 std::vector<ConstString> param_and_qual_matches;
728 std::vector<ConstString> param_matches;
729 for (
size_t i = 0; i < alternates.size(); i++) {
730 ConstString alternate_mangled_name = alternates[i];
731 Mangled mangled(alternate_mangled_name);
740 param_and_qual_matches.push_back(alternate_mangled_name);
742 param_matches.push_back(alternate_mangled_name);
746 if (param_and_qual_matches.size())
747 return param_and_qual_matches[0];
749 else if (param_matches.size())
750 return param_matches[0];
756 if (!cpp_category_sp)
770 "std::string summary provider",
"^std::__[[:alnum:]]+::string$",
771 stl_summary_flags,
true);
774 "std::string summary provider",
775 "^std::__[[:alnum:]]+::basic_string<char, "
776 "std::__[[:alnum:]]+::char_traits<char>,.*>$",
777 stl_summary_flags,
true);
780 "std::string summary provider",
781 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
782 "std::__[[:alnum:]]+::char_traits<unsigned char>,.*>$",
783 stl_summary_flags,
true);
787 "std::u16string summary provider",
788 "^std::__[[:alnum:]]+::basic_string<char16_t, "
789 "std::__[[:alnum:]]+::char_traits<char16_t>,.*>$",
790 stl_summary_flags,
true);
794 "std::u32string summary provider",
795 "^std::__[[:alnum:]]+::basic_string<char32_t, "
796 "std::__[[:alnum:]]+::char_traits<char32_t>,.*>$",
797 stl_summary_flags,
true);
801 "std::wstring summary provider",
802 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags,
true);
805 "std::wstring summary provider",
806 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
807 "std::__[[:alnum:]]+::char_traits<wchar_t>,.*>$",
808 stl_summary_flags,
true);
812 "std::string_view summary provider",
813 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags,
true);
816 "std::string_view summary provider",
817 "^std::__[[:alnum:]]+::basic_string_view<char, "
818 "std::__[[:alnum:]]+::char_traits<char> >$",
819 stl_summary_flags,
true);
822 "std::string_view summary provider",
823 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
824 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
825 stl_summary_flags,
true);
829 "std::u16string_view summary provider",
830 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
831 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
832 stl_summary_flags,
true);
836 "std::u32string_view summary provider",
837 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
838 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
839 stl_summary_flags,
true);
843 "std::wstring_view summary provider",
844 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags,
true);
847 "std::wstring_view summary provider",
848 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
849 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
850 stl_summary_flags,
true);
861 "libc++ std::bitset synthetic children",
862 "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags,
true);
866 "libc++ std::vector synthetic children",
867 "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags,
true);
871 "libc++ std::valarray synthetic children",
872 "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags,
true);
876 "libc++ std::slice_array synthetic children",
877 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags,
true);
881 "libc++ synthetic children for the valarray proxy arrays",
882 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
883 stl_deref_flags,
true);
887 "libc++ std::forward_list synthetic children",
888 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags,
true);
892 "libc++ std::list synthetic children",
"^std::__[[:alnum:]]+::list<.+>$",
893 stl_deref_flags,
true);
897 "libc++ std::map synthetic children",
"^std::__[[:alnum:]]+::map<.+> >$",
898 stl_synth_flags,
true);
902 "libc++ std::set synthetic children",
"^std::__[[:alnum:]]+::set<.+> >$",
903 stl_deref_flags,
true);
907 "libc++ std::multiset synthetic children",
908 "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags,
true);
912 "libc++ std::multimap synthetic children",
913 "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags,
true);
917 "libc++ std::unordered containers synthetic children",
918 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
919 stl_synth_flags,
true);
921 "libc++ std::queue synthetic children",
922 "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags,
true);
924 "libc++ std::tuple synthetic children",
925 "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags,
true);
927 "libc++ std::optional synthetic children",
928 "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags,
true);
930 "libc++ std::variant synthetic children",
931 "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags,
true);
935 "libc++ std::atomic synthetic children",
936 "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags,
true);
940 "libc++ std::span synthetic children",
"^std::__[[:alnum:]]+::span<.+>$",
941 stl_deref_flags,
true);
945 "libc++ std::ranges::ref_view synthetic children",
946 "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags,
true);
948 cpp_category_sp->AddTypeSynthetic(
952 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
957 "shared_ptr synthetic children",
"^std::__[[:alnum:]]+::shared_ptr<.+>$",
958 stl_synth_flags,
true);
960 static constexpr const char *
const libcxx_std_unique_ptr_regex =
961 "^std::__[[:alnum:]]+::unique_ptr<.+>$";
965 "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
966 stl_synth_flags,
true);
971 "weak_ptr synthetic children",
"^std::__[[:alnum:]]+::weak_ptr<.+>$",
972 stl_synth_flags,
true);
975 "libc++ std::function summary provider",
976 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags,
true);
978 static constexpr const char *
const libcxx_std_coroutine_handle_regex =
979 "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
983 "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
984 stl_deref_flags,
true);
990 "libc++ std::bitset summary provider",
991 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags,
true);
994 "libc++ std::vector summary provider",
995 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags,
true);
998 "libc++ std::valarray summary provider",
999 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags,
true);
1002 "libc++ std::slice_array summary provider",
1003 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
1007 "libc++ summary provider for the valarray proxy arrays",
1008 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
1009 stl_summary_flags,
true);
1012 "libc++ std::list summary provider",
1013 "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags,
true);
1016 "libc++ std::list summary provider",
1017 "^std::__[[:alnum:]]+::list<.+>$", stl_summary_flags,
true);
1020 "libc++ std::map summary provider",
1021 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags,
true);
1024 "libc++ std::deque summary provider",
1025 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags,
true);
1028 "libc++ std::queue summary provider",
1029 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags,
true);
1032 "libc++ std::set summary provider",
1033 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags,
true);
1036 "libc++ std::multiset summary provider",
1037 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags,
true);
1040 "libc++ std::multimap summary provider",
1041 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags,
true);
1044 "libc++ std::unordered containers summary provider",
1045 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
1046 stl_summary_flags,
true);
1048 "libc++ std::tuple summary provider",
1049 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags,
true);
1052 "libc++ std::atomic summary provider",
1053 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags,
true);
1056 "libc++ std::optional summary provider",
1057 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags,
true);
1060 "libc++ std::variant summary provider",
1061 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags,
true);
1064 "libc++ std::span summary provider",
1065 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags,
true);
1071 "libc++ std::shared_ptr summary provider",
1072 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
1076 "libc++ std::weak_ptr summary provider",
1077 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags,
true);
1080 "libc++ std::unique_ptr summary provider",
1081 libcxx_std_unique_ptr_regex, stl_summary_flags,
true);
1085 "libc++ std::coroutine_handle summary provider",
1086 libcxx_std_coroutine_handle_regex, stl_summary_flags,
true);
1091 "std::vector iterator synthetic children",
1092 "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags,
true);
1097 "std::map iterator synthetic children",
1098 "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
1104 "std::unordered_map iterator synthetic children",
1105 "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1106 stl_synth_flags,
true);
1108 cpp_category_sp->AddTypeSummary(
1111 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ns")));
1112 cpp_category_sp->AddTypeSummary(
1115 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} µs")));
1116 cpp_category_sp->AddTypeSummary(
1119 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} ms")));
1120 cpp_category_sp->AddTypeSummary(
1123 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1124 cpp_category_sp->AddTypeSummary(
1127 eTypeOptionHideValue,
1128 "${var.__rep_} min")));
1129 cpp_category_sp->AddTypeSummary(
1132 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} h")));
1134 cpp_category_sp->AddTypeSummary(
1137 eTypeOptionHideValue,
1138 "${var.__rep_} days")));
1139 cpp_category_sp->AddTypeSummary(
1142 eTypeOptionHideValue,
1143 "${var.__rep_} weeks")));
1144 cpp_category_sp->AddTypeSummary(
1147 eTypeOptionHideValue,
1148 "${var.__rep_} months")));
1149 cpp_category_sp->AddTypeSummary(
1152 eTypeOptionHideValue,
1153 "${var.__rep_} years")));
1154 cpp_category_sp->AddTypeSummary(
1157 eTypeOptionHideChildren | eTypeOptionHideValue,
"${var.__rep_} s")));
1163 "libc++ std::chrono::sys_seconds summary provider",
1164 "^std::__[[:alnum:]]+::chrono::time_point<"
1165 "std::__[[:alnum:]]+::chrono::system_clock, "
1166 "std::__[[:alnum:]]+::chrono::duration<.*, "
1167 "std::__[[:alnum:]]+::ratio<1, 1> "
1169 eTypeOptionHideChildren | eTypeOptionHideValue |
1174 "libc++ std::chrono::sys_seconds summary provider",
1175 "^std::__[[:alnum:]]+::chrono::time_point<"
1176 "std::__[[:alnum:]]+::chrono::system_clock, "
1177 "std::__[[:alnum:]]+::chrono::duration<int, "
1178 "std::__[[:alnum:]]+::ratio<86400, 1> "
1180 eTypeOptionHideChildren | eTypeOptionHideValue |
1187 "libc++ std::chrono::local_seconds summary provider",
1188 "^std::__[[:alnum:]]+::chrono::time_point<"
1189 "std::__[[:alnum:]]+::chrono::local_t, "
1190 "std::__[[:alnum:]]+::chrono::duration<.*, "
1191 "std::__[[:alnum:]]+::ratio<1, 1> "
1193 eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1197 "libc++ std::chrono::local_seconds summary provider",
1198 "^std::__[[:alnum:]]+::chrono::time_point<"
1199 "std::__[[:alnum:]]+::chrono::local_t, "
1200 "std::__[[:alnum:]]+::chrono::duration<int, "
1201 "std::__[[:alnum:]]+::ratio<86400, 1> "
1203 eTypeOptionHideChildren | eTypeOptionHideValue |
1209 cpp_category_sp->AddTypeSummary(
1212 eTypeOptionHideValue,
1213 "day=${var.__d_%u}")));
1217 "libc++ std::chrono::month summary provider",
1218 "^std::__[[:alnum:]]+::chrono::month$",
1219 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1221 cpp_category_sp->AddTypeSummary(
1224 eTypeOptionHideChildren | eTypeOptionHideValue,
"year=${var.__y_}")));
1228 "libc++ std::chrono::weekday summary provider",
1229 "^std::__[[:alnum:]]+::chrono::weekday$",
1230 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1232 cpp_category_sp->AddTypeSummary(
1235 eTypeOptionHideChildren | eTypeOptionHideValue,
1236 "${var.__wd_} index=${var.__idx_%u}")));
1238 cpp_category_sp->AddTypeSummary(
1241 eTypeOptionHideValue,
1242 "${var.__wd_} index=last")));
1243 cpp_category_sp->AddTypeSummary(
1246 eTypeOptionHideValue,
1247 "${var.__m_} ${var.__d_}")));
1248 cpp_category_sp->AddTypeSummary(
1251 eTypeOptionHideValue,
1252 "${var.__m_} day=last")));
1254 cpp_category_sp->AddTypeSummary(
1257 eTypeOptionHideValue,
1258 "${var.__m_} ${var.__wdi_}")));
1260 cpp_category_sp->AddTypeSummary(
1263 eTypeOptionHideValue,
1264 "${var.__m_} ${var.__wdl_}")));
1266 cpp_category_sp->AddTypeSummary(
1269 eTypeOptionHideValue,
1270 "${var.__y_} ${var.__m_}")));
1275 "libc++ std::chrono::year_month_day summary provider",
1276 "^std::__[[:alnum:]]+::chrono::year_month_day$",
1277 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1279 cpp_category_sp->AddTypeSummary(
1280 "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
1283 eTypeOptionHideValue,
1284 "${var.__y_} ${var.__mdl_}")));
1286 cpp_category_sp->AddTypeSummary(
1289 eTypeOptionHideChildren | eTypeOptionHideValue,
1290 "${var.__y_} ${var.__m_} ${var.__wdi_}")));
1292 cpp_category_sp->AddTypeSummary(
1293 "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
1296 eTypeOptionHideChildren | eTypeOptionHideValue,
1297 "${var.__y_} ${var.__m_} ${var.__wdl_}")));
1301 "libc++ std::partial_ordering summary provider",
1302 "^std::__[[:alnum:]]+::partial_ordering$",
1303 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1306 "libc++ std::weak_ordering summary provider",
1307 "^std::__[[:alnum:]]+::weak_ordering$",
1308 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1311 "libc++ std::strong_ordering summary provider",
1312 "^std::__[[:alnum:]]+::strong_ordering$",
1313 eTypeOptionHideChildren | eTypeOptionHideValue,
true);
1317 "libc++ std::source_location summary provider",
1318 "^std::__[[:alnum:]]+::source_location$", stl_summary_flags,
1325 auto makeSpecifier = [](llvm::StringRef name) {
1326 return std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1330 category_sp->AddTypeSummary(makeSpecifier(string_ty), summary_sp);
1332 category_sp->AddTypeSummary(
1333 makeSpecifier(llvm::formatv(
"std::basic_string<{}>", char_ty).str()),
1336 category_sp->AddTypeSummary(
1337 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1338 llvm::formatv(
"^std::basic_string<{0}, ?std::char_traits<{0}>,.*>$",
1349 category_sp->AddTypeSummary(
1350 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1357 category_sp->AddTypeSummary(
1358 std::make_shared<lldb_private::TypeNameSpecifierImpl>(
1360 "^std::basic_string_view<{0}, ?std::char_traits<{0}> ?>$",
1368 if (!cpp_category_sp)
1382 "libstdc++ std::(w)string summary provider"));
1385 cpp_category_sp->AddTypeSummary(
1386 "^std::__cxx11::basic_string<char, std::char_traits<char>,.*>$",
1388 cpp_category_sp->AddTypeSummary(
"^std::__cxx11::basic_string<unsigned char, "
1389 "std::char_traits<unsigned char>,.*>$",
1394 cpp_category_sp->AddTypeSummary(
1395 "^std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,.*>$",
1404 cpp_category_sp->AddTypeSynthetic(
1408 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1409 cpp_category_sp->AddTypeSynthetic(
1413 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1414 cpp_category_sp->AddTypeSynthetic(
1418 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1419 cpp_category_sp->AddTypeSynthetic(
1423 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1424 cpp_category_sp->AddTypeSynthetic(
1428 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1429 cpp_category_sp->AddTypeSynthetic(
1433 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1434 cpp_category_sp->AddTypeSynthetic(
1438 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1439 cpp_category_sp->AddTypeSynthetic(
1443 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1444 cpp_category_sp->AddTypeSynthetic(
1448 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1455 "libstdc++ std::bitset summary provider",
1456 "^std::__debug::bitset<.+>(( )?&)?$", stl_summary_flags,
true);
1460 "libstdc++ std::__debug::vector summary provider",
1461 "^std::__debug::vector<.+>(( )?&)?$", stl_summary_flags,
true);
1465 "libstdc++ debug std::map summary provider",
1466 "^std::__debug::map<.+> >(( )?&)?$", stl_summary_flags,
true);
1470 "libstdc++ debug std::set summary provider",
1471 "^std::__debug::set<.+> >(( )?&)?$", stl_summary_flags,
true);
1474 "libstdc++ debug std::deque summary provider",
1475 "^std::__debug::deque<.+>(( )?&)?$", stl_summary_flags,
true);
1479 "libstdc++ debug std::multimap summary provider",
1480 "^std::__debug::multimap<.+> >(( )?&)?$", stl_summary_flags,
true);
1484 "libstdc++ debug std::multiset summary provider",
1485 "^std::__debug::multiset<.+> >(( )?&)?$", stl_summary_flags,
true);
1489 "libstdc++ debug std unordered container summary provider",
1490 "^std::__debug::unordered_(multi)?(map|set)<.+> >$",
1491 stl_summary_flags,
true);
1495 "libstdc++ debug std::list summary provider",
1496 "^std::__(debug|cxx11)::list<.+>(( )?&)?$", stl_summary_flags,
true);
1498 cpp_category_sp->AddTypeSummary(
1502 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1507 "std::vector iterator synthetic children",
1508 "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags,
true);
1513 "std::map iterator synthetic children",
1514 "^std::_Rb_tree_(const_)?iterator<.+>$", stl_synth_flags,
true);
1519 "std::unique_ptr synthetic children",
"^std::unique_ptr<.+>(( )?&)?$",
1520 stl_synth_flags,
true);
1522 static constexpr const char *
const libstdcpp_std_coroutine_handle_regex =
1523 "^std::coroutine_handle<.+>(( )?&)?$";
1527 "std::coroutine_handle synthetic children",
1528 libstdcpp_std_coroutine_handle_regex, stl_deref_flags,
true);
1533 "std::bitset synthetic child",
"^std::__debug::bitset<.+>(( )?&)?$",
1534 stl_deref_flags,
true);
1538 "libstdc++ std::coroutine_handle summary provider",
1539 libstdcpp_std_coroutine_handle_regex, stl_summary_flags,
true);
1544 "libstdc++ std::source_location summary provider",
"std::source_location",
1548static lldb_private::SyntheticChildrenFrontEnd *
1567static lldb_private::SyntheticChildrenFrontEnd *
1585static SyntheticChildrenFrontEnd *
1596static SyntheticChildrenFrontEnd *
1607 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider", *valobj_sp);
1610static SyntheticChildrenFrontEnd *
1619 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider", *valobj_sp);
1622static SyntheticChildrenFrontEnd *
1631 "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider",
1635static SyntheticChildrenFrontEnd *
1646static SyntheticChildrenFrontEnd *
1655 "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider", *valobj_sp);
1665static SyntheticChildrenFrontEnd *
1674 "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider",
1678static SyntheticChildrenFrontEnd *
1687 "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider", *valobj_sp);
1690static SyntheticChildrenFrontEnd *
1699 "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider", *valobj_sp);
1702static SyntheticChildrenFrontEnd *
1737static SyntheticChildrenFrontEnd *
1748static SyntheticChildrenFrontEnd *
1765static SyntheticChildrenFrontEnd *
1792 if (!cpp_category_sp)
1810 cpp_category_sp,
"std::string",
"char",
1811 std::make_shared<CXXFunctionSummaryFormat>(
1817 valobj, stream, options);
1820 "MSVC STL/libstdc++ std::string summary provider"));
1822 cpp_category_sp,
"std::wstring",
"wchar_t",
1823 std::make_shared<CXXFunctionSummaryFormat>(
1831 "MSVC STL/libstdc++ std::wstring summary provider"));
1834 cpp_category_sp,
"std::string_view",
"char",
1835 std::make_shared<CXXFunctionSummaryFormat>(
1841 valobj, stream, options);
1843 valobj, stream, options);
1845 "MSVC STL/libstdc++ std::string_view summary provider"));
1847 cpp_category_sp,
"std::u8string_view",
"char8_t",
1848 std::make_shared<CXXFunctionSummaryFormat>(
1854 valobj, stream, options);
1856 valobj, stream, options);
1858 "MSVC STL/libstdc++ std::u8string_view summary provider"));
1860 cpp_category_sp,
"std::u16string_view",
"char16_t",
1861 std::make_shared<CXXFunctionSummaryFormat>(
1867 valobj, stream, options);
1869 valobj, stream, options);
1871 "MSVC STL/libstdc++ std::u16string_view summary provider"));
1873 cpp_category_sp,
"std::u32string_view",
"char32_t",
1874 std::make_shared<CXXFunctionSummaryFormat>(
1880 valobj, stream, options);
1882 valobj, stream, options);
1884 "MSVC STL/libstdc++ std::u32string_view summary provider"));
1886 cpp_category_sp,
"std::wstring_view",
"wchar_t",
1887 std::make_shared<CXXFunctionSummaryFormat>(
1895 "MSVC STL/libstdc++ std::wstring_view summary provider"));
1902 "std::initializer_list synthetic children",
1903 "^std::initializer_list<.+>$", stl_synth_flags,
true);
1906 "MSVC STL/libstdc++ std::filesystem::path summary provider",
1907 "^std::filesystem::(__cxx11::)?path$", stl_summary_flags,
true);
1910 "MSVC STL/libstdc++ std::source_location summary provider",
1911 "std::source_location", stl_summary_flags);
1917 "std::shared_ptr synthetic children",
1918 "^std::shared_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1920 "std::weak_ptr synthetic children",
1921 "^std::weak_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1923 "std::unique_ptr synthetic children",
1924 "^std::unique_ptr<.+>(( )?&)?$", stl_synth_flags,
true);
1926 "std::tuple synthetic children",
"^std::tuple<.*>(( )?&)?$",
1927 stl_synth_flags,
true);
1929 "std::list synthetic children",
"^std::list<.+>(( )?&)?$",
1930 stl_synth_flags,
true);
1932 "std::forward_list synthetic children",
1933 "^std::forward_list<.+>(( )?&)?$", stl_synth_flags,
true);
1935 "std::variant synthetic children",
"^std::variant<.*>$",
1936 stl_synth_flags,
true);
1938 "std::unordered container synthetic children",
1939 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_synth_flags,
1945 "std::optional synthetic children",
1946 "^std::optional<.+>(( )?&)?$", stl_deref_flags,
true);
1948 "std::deque container synthetic children",
1949 "^std::deque<.+>(( )?&)?$", stl_deref_flags,
true);
1951 "std::span container synthetic children",
"^std::span<.+>$",
1952 stl_deref_flags,
true);
1955 "std::(multi)?map/set synthetic children",
1956 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_synth_flags,
1959 "std::bitset synthetic children",
"^std::bitset<.+>(( )?&)?$",
1960 stl_deref_flags,
true);
1963 "std::initializer_list summary provider",
1964 "^std::initializer_list<.+>$", stl_summary_flags,
true);
1966 "MSVC STL/libstdc++ std::shared_ptr summary provider",
1967 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1969 "MSVC STL/libstdc++ std::weak_ptr summary provider",
1970 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1972 "MSVC STL/libstdc++ std::unique_ptr summary provider",
1973 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags,
true);
1975 "MSVC STL/libstdc++ std::tuple summary provider",
1976 "^std::tuple<.*>(( )?&)?$", stl_summary_flags,
true);
1978 "MSVC/libstdc++ std::vector summary provider",
1979 "^std::vector<.+>(( )?&)?$", stl_summary_flags,
true);
1981 "MSVC/libstdc++ std::vector synthetic provider",
1982 "^std::vector<.+>(( )?&)?$", stl_synth_flags,
true);
1984 "MSVC STL/libstdc++ std::list summary provider",
1985 "^std::list<.+>(( )?&)?$", stl_summary_flags,
true);
1986 cpp_category_sp->AddTypeSummary(
1990 "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1992 "MSVC STL/libstd++ std::optional summary provider",
1993 "^std::optional<.+>(( )?&)?$", stl_summary_flags,
true);
1995 "MSVC STL/libstdc++ std::variant summary provider",
1996 "^std::variant<.*>$", stl_summary_flags,
true);
1998 "MSVC STL/libstdc++ std unordered container summary provider",
1999 "^std::unordered_(multi)?(map|set)<.+> ?>$", stl_summary_flags,
2002 "MSVC STL/libstdc++ std::(multi)?map/set summary provider",
2003 "^std::(multi)?(map|set)<.+>(( )?&)?$", stl_summary_flags,
2006 "MSVC STL/libstd++ std::deque summary provider",
2007 "^std::deque<.+>(( )?&)?$", stl_summary_flags,
true);
2009 "MSVC STL/libstd++ std::span summary provider",
2010 "^std::span<.+>$", stl_summary_flags,
true);
2012 "MSVC STL/libstdc++ std::partial_ordering summary provider",
2013 "std::partial_ordering",
2014 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2016 "MSVC STL/libstdc++ std::weak_ordering summary provider",
2017 "std::weak_ordering",
2018 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2020 "MSVC STL/libstdc++ std::strong_ordering summary provider",
2021 "std::strong_ordering",
2022 eTypeOptionHideChildren | eTypeOptionHideValue,
false);
2027 "std::queue synthetic children",
"^std::queue<.+>(( )?&)?$",
2028 stl_synth_flags,
true);
2030 "std::stack synthetic children",
"^std::stack<.+>(( )?&)?$",
2031 stl_synth_flags,
true);
2033 "std::priority_queue synthetic children",
2034 "^std::priority_queue<.+>(( )?&)?$", stl_synth_flags,
true);
2036 "std::queue summary provider",
"^std::queue<.+>(( )?&)?$",
2037 stl_summary_flags,
true);
2039 "std::stack summary provider",
"^std::stack<.+>(( )?&)?$",
2040 stl_summary_flags,
true);
2042 "std::priority_queue summary provider",
2043 "^std::priority_queue<.+>(( )?&)?$", stl_summary_flags,
true);
2046 "MSVC STL/libstdc++ std::error_code summary provider",
2047 "std::error_code", stl_summary_flags);
2049 "MSVC STL/libstdc++ std::error_condition summary provider",
2050 "std::error_condition", stl_summary_flags);
2052 "MSVC STL/libstdc++ std::error_code/error_condition "
2053 "synthetic children",
2054 "^std::error_(code|condition)$", stl_synth_flags,
true);
2056 "MSVC STL/libstdc++ std::bitset summary provider",
2057 "^std::bitset<.+>(( )?&)?$", stl_summary_flags,
true);
2060 "MSVC STL std::expected synthetic children",
2061 "^std::expected<.+>(( )?&)?$", stl_deref_flags,
true);
2063 "MSVC STL std::expected summary provider",
2064 "^std::expected<.+>(( )?&)?$", stl_summary_flags,
true);
2067 "MSVC STL std::valarray synthetic children",
2068 "^std::valarray<.+>(( )?&)?$", stl_deref_flags,
true);
2070 "MSVC STL std::valarray summary provider",
2071 "^std::valarray<.+>(( )?&)?$", stl_summary_flags,
true);
2075 if (!cpp_category_sp)
2093 cpp_category_sp,
"std::u8string",
"char8_t",
2094 std::make_shared<CXXFunctionSummaryFormat>(
2097 "MSVC STL std::u8string summary provider"));
2099 cpp_category_sp,
"std::u16string",
"char16_t",
2100 std::make_shared<CXXFunctionSummaryFormat>(
2103 "MSVC STL std::u16string summary provider"));
2105 cpp_category_sp,
"std::u32string",
"char32_t",
2106 std::make_shared<CXXFunctionSummaryFormat>(
2109 "MSVC STL std::u32string summary provider"));
2114 "MSVC STL std::atomic synthetic children",
2115 "^std::atomic<.+>$", stl_synth_flags,
true);
2118 "MSVC STL std::atomic summary provider",
"^std::atomic<.+>$",
2119 stl_summary_flags,
true);
2121 "MSVC STL tree iterator synthetic children",
2122 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
2125 "MSVC STL tree iterator summary",
2126 "^std::_Tree(_const)?_iterator<.+>(( )?&)?$", stl_summary_flags,
2130 "MSVC STL vector iterator synthetic children",
2131 "^std::_Vector(_const)?_iterator<.+>(( )?&)?$", stl_synth_flags,
true);
2135 if (!cpp_category_sp)
2158 "char8_t * summary provider",
"char8_t *", string_flags);
2161 "char8_t [] summary provider",
"char8_t ?\\[[0-9]+\\]",
2162 string_array_flags,
true);
2166 "char16_t * summary provider",
"char16_t *", string_flags);
2169 "char16_t [] summary provider",
"char16_t ?\\[[0-9]+\\]",
2170 string_array_flags,
true);
2174 "char32_t * summary provider",
"char32_t *", string_flags);
2177 "char32_t [] summary provider",
"char32_t ?\\[[0-9]+\\]",
2178 string_array_flags,
true);
2182 "wchar_t * summary provider",
"wchar_t *", string_flags);
2185 "wchar_t * summary provider",
"wchar_t ?\\[[0-9]+\\]",
2186 string_array_flags,
true);
2190 "unichar * summary provider",
"unichar *", string_flags);
2202 "char8_t summary provider",
"char8_t", widechar_flags);
2205 "char16_t summary provider",
"char16_t", widechar_flags);
2208 "char32_t summary provider",
"char32_t", widechar_flags);
2210 "wchar_t summary provider",
"wchar_t", widechar_flags);
2214 "unichar summary provider",
"unichar", widechar_flags);
2231 return std::unique_ptr<TypeScavenger>(
new CPlusPlusTypeScavenger());
2235 static llvm::once_flag g_initialize;
2238 llvm::call_once(g_initialize, [
this]() ->
void {
2258 static llvm::once_flag g_initialize;
2262 llvm::call_once(g_initialize, []() ->
void {
2263 g_formatters.push_back(
2270 "Function pointer summary provider"));
2274 return formatter_sp;
2278 g_formatters.push_back(
2285 .SetDontShowChildren(
true)
2286 .SetHideItemNames(
true)
2287 .SetShowMembersOneLiner(
true)
2288 .SetSkipPointers(
true)
2289 .SetSkipReferences(
false),
2291 "vector_type pointer summary provider"));
2293 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2294 return formatter_sp;
2298 g_formatters.push_back(
2305 .SetDontShowChildren(
true)
2306 .SetHideItemNames(
true)
2307 .SetShowMembersOneLiner(
true)
2308 .SetSkipPointers(
true)
2309 .SetSkipReferences(
false),
2311 "block pointer summary provider"));
2313 return formatter_sp;
2319 return g_formatters;
2324 static llvm::once_flag g_initialize;
2328 llvm::call_once(g_initialize, []() ->
void {
2336 .SetSkipPointers(
true)
2337 .SetSkipReferences(
true)
2338 .SetNonCacheable(
true),
2339 "vector_type synthetic children",
2342 if (fmt_mgr.
GetCategory(g_vectortypes)->IsEnabled())
2343 return formatter_sp;
2354 .SetSkipPointers(
true)
2355 .SetSkipReferences(
true)
2356 .SetNonCacheable(
true),
2357 "block pointer synthetic children",
2360 return formatter_sp;
2366 return g_formatters;
2373 bool canReadValue =
true;
2375 return canReadValue && isZero;
2379 const auto suffixes = {
".cpp",
".cxx",
".c++",
".cc",
".c",
2380 ".h",
".hh",
".hpp",
".hxx",
".h++"};
2381 for (
auto suffix : suffixes) {
2382 if (file_path.ends_with_insensitive(suffix))
2388 return file_path.contains(
"/usr/include/c++/");
2396 return inline_block->GetBlockVariableList(
true);
2433 switch (representation) {
2454 llvm_unreachable(
"Fully covered switch above");
2463 if (!scope_or_err) {
2466 "Failed to handle ${{function.scope}} frame-format variable: {0}");
2480 "Failed to handle ${{function.basename}} frame-format variable: {0}");
2491 if (!template_args_or_err) {
2493 template_args_or_err.takeError(),
2494 "Failed to handle ${{function.template-arguments}} "
2495 "frame-format variable: {0}");
2499 s << *template_args_or_err;
2529 if (!return_rhs_or_err) {
2531 "Failed to handle ${{function.return-right}} frame-format "
2536 s << *return_rhs_or_err;
2542 if (!return_lhs_or_err) {
2544 "Failed to handle ${{function.return-left}} frame-format "
2549 s << *return_lhs_or_err;
2555 if (!quals_or_err) {
2557 "Failed to handle ${{function.qualifiers}} frame-format "
2568 if (!suffix_or_err) {
2571 "Failed to handle ${{function.suffix}} frame-format variable: {0}");
2575 s << *suffix_or_err;
2585class NodeAllocator {
2586 llvm::BumpPtrAllocator Alloc;
2589 void reset() { Alloc.Reset(); }
2591 template <
typename T,
typename...
Args> T *makeNode(
Args &&...args) {
2592 return new (Alloc.Allocate(
sizeof(T),
alignof(T)))
2593 T(std::forward<Args>(args)...);
2596 void *allocateNodeArray(
size_t sz) {
2597 return Alloc.Allocate(
sizeof(llvm::itanium_demangle::Node *) * sz,
2598 alignof(llvm::itanium_demangle::Node *));
2602template <
typename Derived>
2603class ManglingSubstitutor
2604 :
public llvm::itanium_demangle::AbstractManglingParser<Derived,
2607 llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
2610 ManglingSubstitutor() : Base(nullptr, nullptr) {}
2612 template <
typename... Ts>
2613 llvm::Expected<ConstString> substitute(llvm::StringRef Mangled,
2615 this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
2616 return substituteImpl(Mangled);
2620 void reset(llvm::StringRef Mangled) {
2621 Base::reset(Mangled.begin(), Mangled.end());
2622 Written = Mangled.begin();
2624 Substituted =
false;
2627 llvm::Expected<ConstString> substituteImpl(llvm::StringRef Mangled) {
2628 if (this->parse() ==
nullptr)
2629 return llvm::createStringErrorV(
"failed to substitute mangling in '{0}'",
2633 return ConstString();
2636 appendUnchangedInput();
2637 return ConstString(Result);
2640 void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
2641 if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
2645 appendUnchangedInput();
2649 Written += From.size();
2656 const char *Written =
"";
2658 llvm::SmallString<128> Result;
2661 bool Substituted =
false;
2663 const char *currentParserPos()
const {
return this->First; }
2665 void appendUnchangedInput() {
2667 llvm::StringRef(Written, std::distance(Written, currentParserPos()));
2668 Written = currentParserPos();
2674class TypeSubstitutor :
public ManglingSubstitutor<TypeSubstitutor> {
2675 llvm::StringRef Search;
2676 llvm::StringRef Replace;
2679 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2680 llvm::StringRef Replace) {
2681 ManglingSubstitutor::reset(Mangled);
2682 this->Search = Search;
2683 this->Replace = Replace;
2686 llvm::itanium_demangle::Node *parseType() {
2687 trySubstitute(Search, Replace);
2688 return ManglingSubstitutor::parseType();
2692class CtorDtorSubstitutor :
public ManglingSubstitutor<CtorDtorSubstitutor> {
2693 llvm::StringRef Search;
2694 llvm::StringRef Replace;
2697 void reset(llvm::StringRef Mangled, llvm::StringRef Search,
2698 llvm::StringRef Replace) {
2699 ManglingSubstitutor::reset(Mangled);
2700 this->Search = Search;
2701 this->Replace = Replace;
2704 void reset(llvm::StringRef Mangled) { ManglingSubstitutor::reset(Mangled); }
2706 llvm::itanium_demangle::Node *
2707 parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *
State) {
2708 if (!Search.empty() && !Replace.empty()) {
2709 trySubstitute(Search, Replace);
2711 trySubstitute(
"D1",
"D2");
2712 trySubstitute(
"C1",
"C2");
2714 return ManglingSubstitutor::parseCtorDtorName(SoFar,
State);
2719llvm::Expected<ConstString>
2721 llvm::StringRef subst_from,
2722 llvm::StringRef subst_to) {
2723 return TypeSubstitutor().substitute(mangled_name, subst_from, subst_to);
2727 llvm::StringRef mangled_name, llvm::StringRef subst_from,
2728 llvm::StringRef subst_to) {
2729 return CtorDtorSubstitutor().substitute(mangled_name, subst_from, subst_to);
2732llvm::Expected<ConstString>
2734 llvm::StringRef mangled_name) {
2735 return CtorDtorSubstitutor().substitute(mangled_name);
2738#define LLDB_PROPERTIES_language_cplusplus
2739#include "LanguageCPlusPlusProperties.inc"
2742#define LLDB_PROPERTIES_language_cplusplus
2743#include "LanguageCPlusPlusPropertiesEnum.inc"
2747class PluginProperties :
public Properties {
2749 static llvm::StringRef GetSettingName() {
return "display"; }
2751 PluginProperties() {
2752 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
2753 m_collection_sp->Initialize(g_language_cplusplus_properties_def);
2756 FormatEntity::Entry GetFunctionNameFormat()
const {
2757 return GetPropertyAtIndexAs<FormatEntity::Entry>(
2758 ePropertyFunctionNameFormat, {});
2764 static PluginProperties g_settings;
2774 debugger, PluginProperties::GetSettingName())) {
2777 "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 IsTrivialBasename(const llvm::StringRef &basename)
static SyntheticChildrenFrontEnd * GenericExpectedSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool PrintDemangledArgumentList(Stream &s, const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericTupleSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledBasename(const SymbolContext &sc)
static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericSpanSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledScope(const SymbolContext &sc)
static bool GenericPartialOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericValarraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericWeakOrderingSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool GenericSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static bool IsTrivialContext(llvm::StringRef context)
A context is trivial if an only if it matches this pattern.
static llvm::Expected< std::pair< llvm::StringRef, DemangledNameInfo > > GetAndValidateInfo(const SymbolContext &sc)
static bool GenericSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static llvm::Expected< llvm::StringRef > GetDemangledFunctionQualifiers(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericOptionalSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericVariantSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadMsvcStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericValarraySyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static SyntheticChildrenFrontEnd * GenericMapLikeSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static llvm::Expected< llvm::StringRef > GetDemangledTemplateArguments(const SymbolContext &sc)
static SyntheticChildrenFrontEnd * GenericForwardListSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static bool GenericExpectedSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options)
static lldb_private::SyntheticChildrenFrontEnd * GenericSmartPointerSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void RegisterStdStringViewSummaryProvider(const lldb::TypeCategoryImplSP &category_sp, llvm::StringRef string_ty, llvm::StringRef char_ty, lldb::TypeSummaryImplSP summary_sp)
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(const SymbolContext &sc)
static bool ReverseFindMatchingChars(const llvm::StringRef &s, const llvm::StringRef &left_right_chars, size_t &left_pos, size_t &right_pos, size_t pos=llvm::StringRef::npos)
static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
Load formatters that are formatting types from more than one STL.
static SyntheticChildrenFrontEnd * GenericVectorSyntheticFrontEndCreator(CXXSyntheticChildren *children, lldb::ValueObjectSP valobj_sp)
static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
static SyntheticChildrenFrontEnd * GenericBitsetSyntheticFrontEndCreator(CXXSyntheticChildren *children, ValueObjectSP valobj_sp)
static DemangledNameInfoCache & GetDemangledInfoCache()
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()
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::ASCII >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF32 >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF16 >(ValueObject &, Stream &, const TypeSummaryOptions &)
template bool lldb_private::formatters::LibStdcppStringViewSummaryProvider< StringElementType::UTF8 >(ValueObject &, Stream &, const TypeSummaryOptions &)
#define LLDB_LOG_ERROR(log, error,...)
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
static bool ExtractContextAndIdentifier(llvm::StringRef name, llvm::StringRef &context, llvm::StringRef &identifier)
lldb::TypeCategoryImplSP GetFormatters() override
static llvm::StringRef GetPluginNameStatic()
FormatEntity::Entry GetFunctionNameFormat() const override
HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override
static llvm::StringRef GetDemangledBasename(llvm::StringRef demangled, const DemangledNameInfo &info)
llvm::StringRef GetPluginName() override
std::vector< ConstString > GenerateAlternateFunctionManglings(const ConstString mangled) const override
static llvm::Expected< ConstString > SubstituteType_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium type encoding substrings given by subst_from in mangled_name with subst_to.
bool GetFunctionDisplayName(const SymbolContext &sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream &s) override
static llvm::Expected< llvm::StringRef > GetDemangledReturnTypeRHS(llvm::StringRef demangled, const DemangledNameInfo &info)
std::pair< lldb::FunctionNameType, std::optional< ConstString > > GetFunctionNameInfo(ConstString name) const override
bool DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const override
static llvm::Expected< llvm::StringRef > GetDemangledFunctionSuffix(llvm::StringRef demangled, const DemangledNameInfo &info)
ConstString FindBestAlternateFunctionMangledName(const Mangled mangled, const SymbolContext &sym_ctx) const override
bool SymbolNameFitsToLanguage(const Mangled &mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
static llvm::Expected< llvm::StringRef > GetDemangledFunctionArguments(llvm::StringRef demangled, const DemangledNameInfo &info)
static llvm::Expected< llvm::StringRef > GetDemangledScope(llvm::StringRef demangled, const DemangledNameInfo &info)
std::unique_ptr< TypeScavenger > GetTypeScavenger() override
static llvm::Expected< ConstString > SubstituteStructor_ItaniumMangle(llvm::StringRef mangled_name, llvm::StringRef subst_from, llvm::StringRef subst_to)
Substitutes Itanium structor encoding substrings given by subst_from in mangled_name with subst_to.
HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override
static lldb_private::Language * CreateInstance(lldb::LanguageType language)
static llvm::Expected< ConstString > SubstituteStructorAliases_ItaniumMangle(llvm::StringRef mangled_name)
Tries replacing Itanium structor encoding substrings in mangled_name with potential aliases....
bool HandleFrameFormatVariable(const SymbolContext &sc, const ExecutionContext *exe_ctx, FormatEntity::Entry::Type type, Stream &s) override
static void DebuggerInitialize(Debugger &)
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.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
const char * AsCString(const char *value_if_empty) const
Get the string value as a C string.
static bool GetCategory(ConstString category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
A class to manage flag bits.
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.
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.
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 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++.
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