1 //===-- Mangled.cpp ---------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 // FreeBSD9-STABLE requires this to know about size_t in cxxabi.h
14 // Cannot enable the builtin demangler on msvc as it does not support the cpp11 within the implementation.
15 #elif defined (__FreeBSD__)
16 #define LLDB_USE_BUILTIN_DEMANGLER
21 #ifdef LLDB_USE_BUILTIN_DEMANGLER
23 //----------------------------------------------------------------------
25 // http://llvm.org/svn/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp
29 // - remove the "__cxxabiv1" namespace
30 // - stripped GCC attributes()
31 // - removed extern "C" from the cxa_demangle function
32 // - Changed the scope of the unnamed namespace to include cxa_demangle
34 // - Added "#undef _LIBCPP_EXTERN_TEMPLATE" to avoid warning
35 //----------------------------------------------------------------------
37 #undef _LIBCPP_EXTERN_TEMPLATE // Avoid warning below
39 //===-------------------------- cxa_demangle.cpp --------------------------===//
41 // The LLVM Compiler Infrastructure
43 // This file is dual licensed under the MIT and the University of Illinois Open
44 // Source Licenses. See LICENSE.TXT for details.
46 //===----------------------------------------------------------------------===//
48 #define _LIBCPP_EXTERN_TEMPLATE(...)
49 #define _LIBCPP_NO_EXCEPTIONS
73 const char* parse_type(const char* first, const char* last, C& db);
75 const char* parse_encoding(const char* first, const char* last, C& db);
77 const char* parse_name(const char* first, const char* last, C& db);
79 const char* parse_expression(const char* first, const char* last, C& db);
81 const char* parse_template_args(const char* first, const char* last, C& db);
83 const char* parse_operator_name(const char* first, const char* last, C& db);
85 const char* parse_unqualified_name(const char* first, const char* last, C& db);
87 const char* parse_decltype(const char* first, const char* last, C& db);
91 print_stack(const C& db)
93 printf("---------\n");
95 for (auto& s : db.names)
96 printf("{%s#%s}\n", s.first.c_str(), s.second.c_str());
99 for (auto& v : db.subs)
102 printf("S%i_ = {", i);
106 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
110 printf("template_param:\n");
111 for (auto& t : db.template_param)
118 printf("T%i_ = {", i);
122 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
127 printf("---------\n\n");
132 print_state(const char* msg, const char* first, const char* last, const C& db)
135 for (; first != last; ++first)
136 printf("%c", *first);
141 // <number> ::= [n] <non-negative decimal integer>
144 parse_number(const char* first, const char* last)
148 const char* t = first;
157 else if ('1' <= *t && *t <= '9')
160 while (first != last && std::isdigit(*first))
168 template <class Float>
172 struct float_data<float>
174 static const size_t mangled_size = 8;
175 static const size_t max_demangled_size = 24;
176 static constexpr const char* spec = "%af";
179 constexpr const char* float_data<float>::spec;
182 struct float_data<double>
184 static const size_t mangled_size = 16;
185 static const size_t max_demangled_size = 32;
186 static constexpr const char* spec = "%a";
189 constexpr const char* float_data<double>::spec;
192 struct float_data<long double>
194 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
195 static const size_t max_demangled_size = 40;
196 static constexpr const char* spec = "%LaL";
199 constexpr const char* float_data<long double>::spec;
201 template <class Float, class C>
203 parse_floating_number(const char* first, const char* last, C& db)
205 const size_t N = float_data<Float>::mangled_size;
206 if (static_cast<std::size_t>(last - first) > N)
212 char buf[sizeof(Float)];
214 const char* t = first;
216 for (; t != last; ++t, ++e)
220 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
221 static_cast<unsigned>(*t - 'a' + 10);
223 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
224 static_cast<unsigned>(*t - 'a' + 10);
225 *e = static_cast<char>((d1 << 4) + d0);
229 #if __LITTLE_ENDIAN__
230 std::reverse(buf, e);
232 char num[float_data<Float>::max_demangled_size] = {0};
233 int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
234 if (static_cast<std::size_t>(n) >= sizeof(num))
236 db.names.push_back(typename C::String(num, static_cast<std::size_t>(n)));
243 // <source-name> ::= <positive length number> <identifier>
247 parse_source_name(const char* first, const char* last, C& db)
252 if (isdigit(c) && first+1 != last)
254 const char* t = first+1;
255 size_t n = static_cast<size_t>(c - '0');
256 for (c = *t; isdigit(c); c = *t)
258 n = n * 10 + static_cast<size_t>(c - '0');
262 if (static_cast<size_t>(last - t) >= n)
264 typename C::String r(t, n);
265 if (r.substr(0, 10) == "_GLOBAL__N")
266 db.names.push_back("(anonymous namespace)");
268 db.names.push_back(std::move(r));
276 // <substitution> ::= S <seq-id> _
278 // <substitution> ::= Sa # ::std::allocator
279 // <substitution> ::= Sb # ::std::basic_string
280 // <substitution> ::= Ss # ::std::basic_string < char,
281 // ::std::char_traits<char>,
282 // ::std::allocator<char> >
283 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
284 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
285 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
289 parse_substitution(const char* first, const char* last, C& db)
291 if (last - first >= 2)
298 db.names.push_back("std::allocator");
302 db.names.push_back("std::basic_string");
306 db.names.push_back("std::string");
310 db.names.push_back("std::istream");
314 db.names.push_back("std::ostream");
318 db.names.push_back("std::iostream");
322 if (!db.subs.empty())
324 for (const auto& n : db.subs.front())
325 db.names.push_back(n);
330 if (std::isdigit(first[1]) || std::isupper(first[1]))
333 const char* t = first+1;
334 if (std::isdigit(*t))
335 sub = static_cast<size_t>(*t - '0');
337 sub = static_cast<size_t>(*t - 'A') + 10;
338 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
341 if (std::isdigit(*t))
342 sub += static_cast<size_t>(*t - '0');
344 sub += static_cast<size_t>(*t - 'A') + 10;
346 if (t == last || *t != '_')
349 if (sub < db.subs.size())
351 for (const auto& n : db.subs[sub])
352 db.names.push_back(n);
363 // <builtin-type> ::= v # void
367 // ::= a # signed char
368 // ::= h # unsigned char
370 // ::= t # unsigned short
372 // ::= j # unsigned int
374 // ::= m # unsigned long
375 // ::= x # long long, __int64
376 // ::= y # unsigned long long, __int64
378 // ::= o # unsigned __int128
381 // ::= e # long double, __float80
382 // ::= g # __float128
384 // ::= Dd # IEEE 754r decimal floating point (64 bits)
385 // ::= De # IEEE 754r decimal floating point (128 bits)
386 // ::= Df # IEEE 754r decimal floating point (32 bits)
387 // ::= Dh # IEEE 754r half-precision floating point (16 bits)
390 // ::= Da # auto (in dependent new-expressions)
391 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
392 // ::= u <source-name> # vendor extended type
396 parse_builtin_type(const char* first, const char* last, C& db)
403 db.names.push_back("void");
407 db.names.push_back("wchar_t");
411 db.names.push_back("bool");
415 db.names.push_back("char");
419 db.names.push_back("signed char");
423 db.names.push_back("unsigned char");
427 db.names.push_back("short");
431 db.names.push_back("unsigned short");
435 db.names.push_back("int");
439 db.names.push_back("unsigned int");
443 db.names.push_back("long");
447 db.names.push_back("unsigned long");
451 db.names.push_back("long long");
455 db.names.push_back("unsigned long long");
459 db.names.push_back("__int128");
463 db.names.push_back("unsigned __int128");
467 db.names.push_back("float");
471 db.names.push_back("double");
475 db.names.push_back("long double");
479 db.names.push_back("__float128");
483 db.names.push_back("...");
488 const char*t = parse_source_name(first+1, last, db);
499 db.names.push_back("decimal64");
503 db.names.push_back("decimal128");
507 db.names.push_back("decimal32");
511 db.names.push_back("decimal16");
515 db.names.push_back("char32_t");
519 db.names.push_back("char16_t");
523 db.names.push_back("auto");
527 db.names.push_back("std::nullptr_t");
538 // <CV-qualifiers> ::= [r] [V] [K]
541 parse_cv_qualifiers(const char* first, const char* last, unsigned& cv)
565 // <template-param> ::= T_ # first template parameter
566 // ::= T <parameter-2 non-negative number> _
570 parse_template_param(const char* first, const char* last, C& db)
572 if (last - first >= 2)
578 if (db.template_param.empty())
580 if (!db.template_param.back().empty())
582 for (auto& t : db.template_param.back().front())
583 db.names.push_back(t);
588 db.names.push_back("T_");
590 db.fix_forward_references = true;
593 else if (isdigit(first[1]))
595 const char* t = first+1;
596 size_t sub = static_cast<size_t>(*t - '0');
597 for (++t; t != last && isdigit(*t); ++t)
600 sub += static_cast<size_t>(*t - '0');
602 if (t == last || *t != '_' || db.template_param.empty())
605 if (sub < db.template_param.back().size())
607 for (auto& temp : db.template_param.back()[sub])
608 db.names.push_back(temp);
613 db.names.push_back(typename C::String(first, t+1));
615 db.fix_forward_references = true;
623 // cc <type> <expression> # const_cast<type> (expression)
627 parse_const_cast_expr(const char* first, const char* last, C& db)
629 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
631 const char* t = parse_type(first+2, last, db);
634 const char* t1 = parse_expression(t, last, db);
637 if (db.names.size() < 2)
639 auto expr = db.names.back().move_full();
641 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
649 // dc <type> <expression> # dynamic_cast<type> (expression)
653 parse_dynamic_cast_expr(const char* first, const char* last, C& db)
655 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
657 const char* t = parse_type(first+2, last, db);
660 const char* t1 = parse_expression(t, last, db);
663 if (db.names.size() < 2)
665 auto expr = db.names.back().move_full();
667 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
675 // rc <type> <expression> # reinterpret_cast<type> (expression)
679 parse_reinterpret_cast_expr(const char* first, const char* last, C& db)
681 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
683 const char* t = parse_type(first+2, last, db);
686 const char* t1 = parse_expression(t, last, db);
689 if (db.names.size() < 2)
691 auto expr = db.names.back().move_full();
693 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
701 // sc <type> <expression> # static_cast<type> (expression)
705 parse_static_cast_expr(const char* first, const char* last, C& db)
707 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
709 const char* t = parse_type(first+2, last, db);
712 const char* t1 = parse_expression(t, last, db);
715 if (db.names.size() < 2)
717 auto expr = db.names.back().move_full();
719 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
727 // sp <expression> # pack expansion
731 parse_pack_expansion(const char* first, const char* last, C& db)
733 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
735 const char* t = parse_expression(first+2, last, db);
742 // st <type> # sizeof (a type)
746 parse_sizeof_type_expr(const char* first, const char* last, C& db)
748 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
750 const char* t = parse_type(first+2, last, db);
753 if (db.names.empty())
755 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
762 // sz <expr> # sizeof (a expression)
766 parse_sizeof_expr_expr(const char* first, const char* last, C& db)
768 if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
770 const char* t = parse_expression(first+2, last, db);
773 if (db.names.empty())
775 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
782 // sZ <template-param> # size of a parameter pack
786 parse_sizeof_param_pack_expr(const char* first, const char* last, C& db)
788 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
790 size_t k0 = db.names.size();
791 const char* t = parse_template_param(first+2, last, db);
792 size_t k1 = db.names.size();
795 typename C::String tmp("sizeof...(");
799 tmp += db.names[k].move_full();
800 for (++k; k != k1; ++k)
801 tmp += ", " + db.names[k].move_full();
804 for (; k1 != k0; --k1)
806 db.names.push_back(std::move(tmp));
813 // <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
814 // ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
815 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
816 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters
820 parse_function_param(const char* first, const char* last, C& db)
822 if (last - first >= 3 && *first == 'f')
827 const char* t = parse_cv_qualifiers(first+2, last, cv);
828 const char* t1 = parse_number(t, last);
829 if (t1 != last && *t1 == '_')
831 db.names.push_back("fp" + typename C::String(t, t1));
835 else if (first[1] == 'L')
838 const char* t0 = parse_number(first+2, last);
839 if (t0 != last && *t0 == 'p')
842 const char* t = parse_cv_qualifiers(t0, last, cv);
843 const char* t1 = parse_number(t, last);
844 if (t1 != last && *t1 == '_')
846 db.names.push_back("fp" + typename C::String(t, t1));
855 // sZ <function-param> # size of a function parameter pack
859 parse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db)
861 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
863 const char* t = parse_function_param(first+2, last, db);
866 if (db.names.empty())
868 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
875 // te <expression> # typeid (expression)
876 // ti <type> # typeid (type)
880 parse_typeid_expr(const char* first, const char* last, C& db)
882 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
886 t = parse_expression(first+2, last, db);
888 t = parse_type(first+2, last, db);
891 if (db.names.empty())
893 db.names.back() = "typeid(" + db.names.back().move_full() + ")";
900 // tw <expression> # throw expression
904 parse_throw_expr(const char* first, const char* last, C& db)
906 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
908 const char* t = parse_expression(first+2, last, db);
911 if (db.names.empty())
913 db.names.back() = "throw " + db.names.back().move_full();
920 // ds <expression> <expression> # expr.*expr
924 parse_dot_star_expr(const char* first, const char* last, C& db)
926 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
928 const char* t = parse_expression(first+2, last, db);
931 const char* t1 = parse_expression(t, last, db);
934 if (db.names.size() < 2)
936 auto expr = db.names.back().move_full();
938 db.names.back().first += ".*" + expr;
946 // <simple-id> ::= <source-name> [ <template-args> ]
950 parse_simple_id(const char* first, const char* last, C& db)
954 const char* t = parse_source_name(first, last, db);
957 const char* t1 = parse_template_args(t, last, db);
960 if (db.names.size() < 2)
962 auto args = db.names.back().move_full();
964 db.names.back().first += std::move(args);
974 // <unresolved-type> ::= <template-param>
976 // ::= <substitution>
980 parse_unresolved_type(const char* first, const char* last, C& db)
984 const char* t = first;
989 size_t k0 = db.names.size();
990 t = parse_template_param(first, last, db);
991 size_t k1 = db.names.size();
992 if (t != first && k1 == k0 + 1)
994 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
999 for (; k1 != k0; --k1)
1000 db.names.pop_back();
1005 t = parse_decltype(first, last, db);
1008 if (db.names.empty())
1010 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1015 t = parse_substitution(first, last, db);
1020 if (last - first > 2 && first[1] == 't')
1022 t = parse_unqualified_name(first+2, last, db);
1025 if (db.names.empty())
1027 db.names.back().first.insert(0, "std::");
1028 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1039 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
1040 // ::= <simple-id> # e.g., ~A<2*N>
1044 parse_destructor_name(const char* first, const char* last, C& db)
1048 const char* t = parse_unresolved_type(first, last, db);
1050 t = parse_simple_id(first, last, db);
1053 if (db.names.empty())
1055 db.names.back().first.insert(0, "~");
1062 // <base-unresolved-name> ::= <simple-id> # unresolved name
1063 // extension ::= <operator-name> # unresolved operator-function-id
1064 // extension ::= <operator-name> <template-args> # unresolved operator template-id
1065 // ::= on <operator-name> # unresolved operator-function-id
1066 // ::= on <operator-name> <template-args> # unresolved operator template-id
1067 // ::= dn <destructor-name> # destructor or pseudo-destructor;
1068 // # e.g. ~X or ~X<N-1>
1072 parse_base_unresolved_name(const char* first, const char* last, C& db)
1074 if (last - first >= 2)
1076 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
1078 if (first[0] == 'o')
1080 const char* t = parse_operator_name(first+2, last, db);
1083 first = parse_template_args(t, last, db);
1086 if (db.names.size() < 2)
1088 auto args = db.names.back().move_full();
1089 db.names.pop_back();
1090 db.names.back().first += std::move(args);
1096 const char* t = parse_destructor_name(first+2, last, db);
1103 const char* t = parse_simple_id(first, last, db);
1106 t = parse_operator_name(first, last, db);
1109 first = parse_template_args(t, last, db);
1112 if (db.names.size() < 2)
1114 auto args = db.names.back().move_full();
1115 db.names.pop_back();
1116 db.names.back().first += std::move(args);
1127 // <unresolved-qualifier-level> ::= <simple-id>
1131 parse_unresolved_qualifier_level(const char* first, const char* last, C& db)
1133 return parse_simple_id(first, last, db);
1136 // <unresolved-name>
1137 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
1138 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
1139 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
1140 // # A::x, N::y, A<T>::z; "gs" means leading "::"
1141 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
1142 // extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
1143 // # T::N::x /decltype(p)::N::x
1144 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
1148 parse_unresolved_name(const char* first, const char* last, C& db)
1150 if (last - first > 2)
1152 const char* t = first;
1153 bool global = false;
1154 if (t[0] == 'g' && t[1] == 's')
1159 const char* t2 = parse_base_unresolved_name(t, last, db);
1164 if (db.names.empty())
1166 db.names.back().first.insert(0, "::");
1170 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
1175 const char* t1 = parse_unresolved_type(t, last, db);
1176 if (t1 == t || t1 == last)
1179 t1 = parse_template_args(t, last, db);
1182 if (db.names.size() < 2)
1184 auto args = db.names.back().move_full();
1185 db.names.pop_back();
1186 db.names.back().first += std::move(args);
1190 db.names.pop_back();
1196 t1 = parse_unresolved_qualifier_level(t, last, db);
1197 if (t1 == t || t1 == last || db.names.size() < 2)
1199 auto s = db.names.back().move_full();
1200 db.names.pop_back();
1201 db.names.back().first += "::" + std::move(s);
1205 t1 = parse_base_unresolved_name(t, last, db);
1208 if (!db.names.empty())
1209 db.names.pop_back();
1212 if (db.names.size() < 2)
1214 auto s = db.names.back().move_full();
1215 db.names.pop_back();
1216 db.names.back().first += "::" + std::move(s);
1222 const char* t1 = parse_unresolved_type(t, last, db);
1226 t1 = parse_template_args(t, last, db);
1229 if (db.names.size() < 2)
1231 auto args = db.names.back().move_full();
1232 db.names.pop_back();
1233 db.names.back().first += std::move(args);
1236 t1 = parse_base_unresolved_name(t, last, db);
1239 if (!db.names.empty())
1240 db.names.pop_back();
1243 if (db.names.size() < 2)
1245 auto s = db.names.back().move_full();
1246 db.names.pop_back();
1247 db.names.back().first += "::" + std::move(s);
1252 t1 = parse_unresolved_qualifier_level(t, last, db);
1253 if (t1 == t || t1 == last)
1258 if (db.names.empty())
1260 db.names.back().first.insert(0, "::");
1264 t1 = parse_unresolved_qualifier_level(t, last, db);
1265 if (t1 == t || t1 == last || db.names.size() < 2)
1267 auto s = db.names.back().move_full();
1268 db.names.pop_back();
1269 db.names.back().first += "::" + std::move(s);
1273 t1 = parse_base_unresolved_name(t, last, db);
1276 if (!db.names.empty())
1277 db.names.pop_back();
1280 if (db.names.size() < 2)
1282 auto s = db.names.back().move_full();
1283 db.names.pop_back();
1284 db.names.back().first += "::" + std::move(s);
1293 // dt <expression> <unresolved-name> # expr.name
1297 parse_dot_expr(const char* first, const char* last, C& db)
1299 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
1301 const char* t = parse_expression(first+2, last, db);
1304 const char* t1 = parse_unresolved_name(t, last, db);
1307 if (db.names.size() < 2)
1309 auto name = db.names.back().move_full();
1310 db.names.pop_back();
1311 db.names.back().first += "." + name;
1319 // cl <expression>+ E # call
1323 parse_call_expr(const char* first, const char* last, C& db)
1325 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
1327 const char* t = parse_expression(first+2, last, db);
1332 if (db.names.empty())
1334 db.names.back().first += db.names.back().second;
1335 db.names.back().second = typename C::String();
1336 db.names.back().first.append("(");
1337 bool first_expr = true;
1340 const char* t1 = parse_expression(t, last, db);
1341 if (t1 == t || t1 == last)
1343 if (db.names.empty())
1345 auto tmp = db.names.back().move_full();
1346 db.names.pop_back();
1349 if (db.names.empty())
1353 db.names.back().first.append(", ");
1356 db.names.back().first.append(tmp);
1361 if (db.names.empty())
1363 db.names.back().first.append(")");
1370 // [gs] nw <expression>* _ <type> E # new (expr-list) type
1371 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
1372 // [gs] na <expression>* _ <type> E # new[] (expr-list) type
1373 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
1374 // <initializer> ::= pi <expression>* E # parenthesized initialization
1378 parse_new_expr(const char* first, const char* last, C& db)
1380 if (last - first >= 4)
1382 const char* t = first;
1383 bool parsed_gs = false;
1384 if (t[0] == 'g' && t[1] == 's')
1389 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
1391 bool is_array = t[1] == 'a';
1395 bool has_expr_list = false;
1396 bool first_expr = true;
1399 const char* t1 = parse_expression(t, last, db);
1400 if (t1 == t || t1 == last)
1402 has_expr_list = true;
1405 if (db.names.empty())
1407 auto tmp = db.names.back().move_full();
1408 db.names.pop_back();
1411 if (db.names.empty())
1413 db.names.back().first.append(", ");
1414 db.names.back().first.append(tmp);
1421 const char* t1 = parse_type(t, last, db);
1422 if (t1 == t || t1 == last)
1425 bool has_init = false;
1426 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
1433 t1 = parse_expression(t, last, db);
1434 if (t1 == t || t1 == last)
1438 if (db.names.empty())
1440 auto tmp = db.names.back().move_full();
1441 db.names.pop_back();
1444 if (db.names.empty())
1446 db.names.back().first.append(", ");
1447 db.names.back().first.append(tmp);
1456 typename C::String init_list;
1459 if (db.names.empty())
1461 init_list = db.names.back().move_full();
1462 db.names.pop_back();
1464 if (db.names.empty())
1466 auto type = db.names.back().move_full();
1467 db.names.pop_back();
1468 typename C::String expr_list;
1471 if (db.names.empty())
1473 expr_list = db.names.back().move_full();
1474 db.names.pop_back();
1476 typename C::String r;
1484 r += "(" + expr_list + ") ";
1487 r += " (" + init_list + ")";
1488 db.names.push_back(std::move(r));
1495 // cv <type> <expression> # conversion with one argument
1496 // cv <type> _ <expression>* E # conversion with a different number of arguments
1500 parse_conversion_expr(const char* first, const char* last, C& db)
1502 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
1504 bool try_to_parse_template_args = db.try_to_parse_template_args;
1505 db.try_to_parse_template_args = false;
1506 const char* t = parse_type(first+2, last, db);
1507 db.try_to_parse_template_args = try_to_parse_template_args;
1508 if (t != first+2 && t != last)
1512 const char* t1 = parse_expression(t, last, db);
1523 db.names.emplace_back();
1526 bool first_expr = true;
1529 const char* t1 = parse_expression(t, last, db);
1530 if (t1 == t || t1 == last)
1534 if (db.names.empty())
1536 auto tmp = db.names.back().move_full();
1537 db.names.pop_back();
1540 if (db.names.empty())
1542 db.names.back().first.append(", ");
1543 db.names.back().first.append(tmp);
1552 if (db.names.size() < 2)
1554 auto tmp = db.names.back().move_full();
1555 db.names.pop_back();
1556 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
1563 // pt <expression> <expression> # expr->name
1567 parse_arrow_expr(const char* first, const char* last, C& db)
1569 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
1571 const char* t = parse_expression(first+2, last, db);
1574 const char* t1 = parse_expression(t, last, db);
1577 if (db.names.size() < 2)
1579 auto tmp = db.names.back().move_full();
1580 db.names.pop_back();
1581 db.names.back().first += "->";
1582 db.names.back().first += tmp;
1590 // <ref-qualifier> ::= R # & ref-qualifier
1591 // <ref-qualifier> ::= O # && ref-qualifier
1593 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
1597 parse_function_type(const char* first, const char* last, C& db)
1599 if (first != last && *first == 'F')
1601 const char* t = first+1;
1604 bool externC = false;
1611 const char* t1 = parse_type(t, last, db);
1615 typename C::String sig("(");
1621 db.names.pop_back();
1634 if (*t == 'R' && t+1 != last && t[1] == 'E')
1640 if (*t == 'O' && t+1 != last && t[1] == 'E')
1646 size_t k0 = db.names.size();
1647 t1 = parse_type(t, last, db);
1648 size_t k1 = db.names.size();
1649 if (t1 == t || t1 == last)
1651 for (size_t k = k0; k < k1; ++k)
1655 sig += db.names[k].move_full();
1657 for (size_t k = k0; k < k1; ++k)
1658 db.names.pop_back();
1671 if (db.names.empty())
1673 db.names.back().first += " ";
1674 db.names.back().second.insert(0, sig);
1682 // <pointer-to-member-type> ::= M <class type> <member type>
1686 parse_pointer_to_member_type(const char* first, const char* last, C& db)
1688 if (first != last && *first == 'M')
1690 const char* t = parse_type(first+1, last, db);
1693 const char* t2 = parse_type(t, last, db);
1696 if (db.names.size() < 2)
1698 auto func = std::move(db.names.back());
1699 db.names.pop_back();
1700 auto class_type = std::move(db.names.back());
1701 if (func.second.front() == '(')
1703 db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*";
1704 db.names.back().second = ")" + std::move(func.second);
1708 db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*";
1709 db.names.back().second = std::move(func.second);
1718 // <array-type> ::= A <positive dimension number> _ <element type>
1719 // ::= A [<dimension expression>] _ <element type>
1723 parse_array_type(const char* first, const char* last, C& db)
1725 if (first != last && *first == 'A' && first+1 != last)
1727 if (first[1] == '_')
1729 const char* t = parse_type(first+2, last, db);
1732 if (db.names.empty())
1734 if (db.names.back().second.substr(0, 2) == " [")
1735 db.names.back().second.erase(0, 1);
1736 db.names.back().second.insert(0, " []");
1740 else if ('1' <= first[1] && first[1] <= '9')
1742 const char* t = parse_number(first+1, last);
1743 if (t != last && *t == '_')
1745 const char* t2 = parse_type(t+1, last, db);
1748 if (db.names.empty())
1750 if (db.names.back().second.substr(0, 2) == " [")
1751 db.names.back().second.erase(0, 1);
1752 db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]");
1759 const char* t = parse_expression(first+1, last, db);
1760 if (t != first+1 && t != last && *t == '_')
1762 const char* t2 = parse_type(++t, last, db);
1765 if (db.names.size() < 2)
1767 auto type = std::move(db.names.back());
1768 db.names.pop_back();
1769 auto expr = std::move(db.names.back());
1770 db.names.back().first = std::move(type.first);
1771 if (type.second.substr(0, 2) == " [")
1772 type.second.erase(0, 1);
1773 db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second);
1782 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
1783 // ::= DT <expression> E # decltype of an expression (C++0x)
1787 parse_decltype(const char* first, const char* last, C& db)
1789 if (last - first >= 4 && first[0] == 'D')
1796 const char* t = parse_expression(first+2, last, db);
1797 if (t != first+2 && t != last && *t == 'E')
1799 if (db.names.empty())
1801 db.names.back() = "decltype(" + db.names.back().move_full() + ")";
1812 // <vector-type> ::= Dv <positive dimension number> _
1813 // <extended element type>
1814 // ::= Dv [<dimension expression>] _ <element type>
1815 // <extended element type> ::= <element type>
1816 // ::= p # AltiVec vector pixel
1820 parse_vector_type(const char* first, const char* last, C& db)
1822 if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
1824 if ('1' <= first[2] && first[2] <= '9')
1826 const char* t = parse_number(first+2, last);
1827 if (t == last || *t != '_')
1829 const char* num = first + 2;
1830 size_t sz = static_cast<size_t>(t - num);
1835 const char* t1 = parse_type(t, last, db);
1838 if (db.names.empty())
1840 db.names.back().first += " vector[" + typename C::String(num, sz) + "]";
1847 db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]");
1854 typename C::String num;
1855 const char* t1 = first+2;
1858 const char* t = parse_expression(t1, last, db);
1861 if (db.names.empty())
1863 num = db.names.back().move_full();
1864 db.names.pop_back();
1868 if (t1 != last && *t1 == '_' && ++t1 != last)
1870 const char* t = parse_type(t1, last, db);
1873 if (db.names.empty())
1875 db.names.back().first += " vector[" + num + "]";
1884 // <type> ::= <builtin-type>
1885 // ::= <function-type>
1886 // ::= <class-enum-type>
1888 // ::= <pointer-to-member-type>
1889 // ::= <template-param>
1890 // ::= <template-template-param> <template-args>
1892 // ::= <substitution>
1893 // ::= <CV-qualifiers> <type>
1894 // ::= P <type> # pointer-to
1895 // ::= R <type> # reference-to
1896 // ::= O <type> # rvalue reference-to (C++0x)
1897 // ::= C <type> # complex pair (C 2000)
1898 // ::= G <type> # imaginary (C 2000)
1899 // ::= Dp <type> # pack expansion (C++0x)
1900 // ::= U <source-name> <type> # vendor extended type qualifier
1901 // extension := U <objc-name> <objc-type> # objc-type<identifier>
1902 // extension := <vector-type> # <vector-type> starts with Dv
1904 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
1905 // <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
1909 parse_type(const char* first, const char* last, C& db)
1920 const char* t = parse_cv_qualifiers(first, last, cv);
1923 bool is_function = *t == 'F';
1924 size_t k0 = db.names.size();
1925 const char* t1 = parse_type(t, last, db);
1926 size_t k1 = db.names.size();
1931 db.subs.emplace_back(db.names.get_allocator());
1932 for (size_t k = k0; k < k1; ++k)
1936 size_t p = db.names[k].second.size();
1937 if (db.names[k].second[p-2] == '&')
1939 else if (db.names[k].second.back() == '&')
1943 db.names[k].second.insert(p, " const");
1948 db.names[k].second.insert(p, " volatile");
1952 db.names[k].second.insert(p, " restrict");
1957 db.names[k].first.append(" const");
1959 db.names[k].first.append(" volatile");
1961 db.names[k].first.append(" restrict");
1963 db.subs.back().push_back(db.names[k]);
1972 const char* t = parse_builtin_type(first, last, db);
1982 t = parse_array_type(first, last, db);
1985 if (db.names.empty())
1988 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1992 t = parse_type(first+1, last, db);
1995 if (db.names.empty())
1997 db.names.back().first.append(" complex");
1999 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2003 t = parse_function_type(first, last, db);
2006 if (db.names.empty())
2009 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2013 t = parse_type(first+1, last, db);
2016 if (db.names.empty())
2018 db.names.back().first.append(" imaginary");
2020 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2024 t = parse_pointer_to_member_type(first, last, db);
2027 if (db.names.empty())
2030 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2035 size_t k0 = db.names.size();
2036 t = parse_type(first+1, last, db);
2037 size_t k1 = db.names.size();
2040 db.subs.emplace_back(db.names.get_allocator());
2041 for (size_t k = k0; k < k1; ++k)
2043 if (db.names[k].second.substr(0, 2) == " [")
2045 db.names[k].first += " (";
2046 db.names[k].second.insert(0, ")");
2048 else if (db.names[k].second.front() == '(')
2050 db.names[k].first += "(";
2051 db.names[k].second.insert(0, ")");
2053 db.names[k].first.append("&&");
2054 db.subs.back().push_back(db.names[k]);
2062 size_t k0 = db.names.size();
2063 t = parse_type(first+1, last, db);
2064 size_t k1 = db.names.size();
2067 db.subs.emplace_back(db.names.get_allocator());
2068 for (size_t k = k0; k < k1; ++k)
2070 if (db.names[k].second.substr(0, 2) == " [")
2072 db.names[k].first += " (";
2073 db.names[k].second.insert(0, ")");
2075 else if (db.names[k].second.front() == '(')
2077 db.names[k].first += "(";
2078 db.names[k].second.insert(0, ")");
2080 if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
2082 db.names[k].first.append("*");
2086 db.names[k].first.replace(0, 11, "id");
2088 db.subs.back().push_back(db.names[k]);
2096 size_t k0 = db.names.size();
2097 t = parse_type(first+1, last, db);
2098 size_t k1 = db.names.size();
2101 db.subs.emplace_back(db.names.get_allocator());
2102 for (size_t k = k0; k < k1; ++k)
2104 if (db.names[k].second.substr(0, 2) == " [")
2106 db.names[k].first += " (";
2107 db.names[k].second.insert(0, ")");
2109 else if (db.names[k].second.front() == '(')
2111 db.names[k].first += "(";
2112 db.names[k].second.insert(0, ")");
2114 db.names[k].first.append("&");
2115 db.subs.back().push_back(db.names[k]);
2123 size_t k0 = db.names.size();
2124 t = parse_template_param(first, last, db);
2125 size_t k1 = db.names.size();
2128 db.subs.emplace_back(db.names.get_allocator());
2129 for (size_t k = k0; k < k1; ++k)
2130 db.subs.back().push_back(db.names[k]);
2131 if (db.try_to_parse_template_args && k1 == k0+1)
2133 const char* t1 = parse_template_args(t, last, db);
2136 auto args = db.names.back().move_full();
2137 db.names.pop_back();
2138 db.names.back().first += std::move(args);
2139 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2148 if (first+1 != last)
2150 t = parse_source_name(first+1, last, db);
2153 const char* t2 = parse_type(t, last, db);
2156 if (db.names.size() < 2)
2158 auto type = db.names.back().move_full();
2159 db.names.pop_back();
2160 if (db.names.back().first.substr(0, 9) != "objcproto")
2162 db.names.back() = type + " " + db.names.back().move_full();
2166 auto proto = db.names.back().move_full();
2167 db.names.pop_back();
2168 t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2169 if (t != proto.data() + 9)
2171 db.names.back() = type + "<" + db.names.back().move_full() + ">";
2175 db.names.push_back(type + " " + proto);
2178 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2185 if (first+1 != last && first[1] == 't')
2187 t = parse_name(first, last, db);
2190 if (db.names.empty())
2192 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2198 t = parse_substitution(first, last, db);
2202 // Parsed a substitution. If the substitution is a
2203 // <template-param> it might be followed by <template-args>.
2204 t = parse_template_args(first, last, db);
2207 if (db.names.size() < 2)
2209 auto template_args = db.names.back().move_full();
2210 db.names.pop_back();
2211 db.names.back().first += template_args;
2212 // Need to create substitution for <template-template-param> <template-args>
2213 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2220 if (first+1 != last)
2226 size_t k0 = db.names.size();
2227 t = parse_type(first+2, last, db);
2228 size_t k1 = db.names.size();
2231 db.subs.emplace_back(db.names.get_allocator());
2232 for (size_t k = k0; k < k1; ++k)
2233 db.subs.back().push_back(db.names[k]);
2241 t = parse_decltype(first, last, db);
2244 if (db.names.empty())
2246 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2252 t = parse_vector_type(first, last, db);
2255 if (db.names.empty())
2257 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2266 // must check for builtin-types before class-enum-types to avoid
2267 // ambiguities with operator-names
2268 t = parse_builtin_type(first, last, db);
2275 t = parse_name(first, last, db);
2278 if (db.names.empty())
2280 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2296 // ::= ad # & (unary)
2303 // ::= cv <type> # (cast)
2304 // ::= da # delete[]
2305 // ::= de # * (unary)
2316 // ::= li <source-name> # operator ""
2324 // ::= mm # -- (postfix in <expression> context)
2327 // ::= ng # - (unary)
2336 // ::= pp # ++ (postfix in <expression> context)
2337 // ::= ps # + (unary)
2344 // ::= v <digit> <source-name> # vendor extended operator
2348 parse_operator_name(const char* first, const char* last, C& db)
2350 if (last - first >= 2)
2358 db.names.push_back("operator&&");
2363 db.names.push_back("operator&");
2367 db.names.push_back("operator&=");
2371 db.names.push_back("operator=");
2380 db.names.push_back("operator()");
2384 db.names.push_back("operator,");
2388 db.names.push_back("operator~");
2393 bool try_to_parse_template_args = db.try_to_parse_template_args;
2394 db.try_to_parse_template_args = false;
2395 const char* t = parse_type(first+2, last, db);
2396 db.try_to_parse_template_args = try_to_parse_template_args;
2399 if (db.names.empty())
2401 db.names.back().first.insert(0, "operator ");
2402 db.parsed_ctor_dtor_cv = true;
2413 db.names.push_back("operator delete[]");
2417 db.names.push_back("operator*");
2421 db.names.push_back("operator delete");
2425 db.names.push_back("operator/");
2429 db.names.push_back("operator/=");
2438 db.names.push_back("operator^");
2442 db.names.push_back("operator^=");
2446 db.names.push_back("operator==");
2455 db.names.push_back("operator>=");
2459 db.names.push_back("operator>");
2465 if (first[1] == 'x')
2467 db.names.push_back("operator[]");
2475 db.names.push_back("operator<=");
2480 const char* t = parse_source_name(first+2, last, db);
2483 if (db.names.empty())
2485 db.names.back().first.insert(0, "operator\"\" ");
2491 db.names.push_back("operator<<");
2495 db.names.push_back("operator<<=");
2499 db.names.push_back("operator<");
2508 db.names.push_back("operator-");
2512 db.names.push_back("operator-=");
2516 db.names.push_back("operator*");
2520 db.names.push_back("operator*=");
2524 db.names.push_back("operator--");
2533 db.names.push_back("operator new[]");
2537 db.names.push_back("operator!=");
2541 db.names.push_back("operator-");
2545 db.names.push_back("operator!");
2549 db.names.push_back("operator new");
2558 db.names.push_back("operator||");
2562 db.names.push_back("operator|");
2566 db.names.push_back("operator|=");
2575 db.names.push_back("operator->*");
2579 db.names.push_back("operator+");
2583 db.names.push_back("operator+=");
2587 db.names.push_back("operator++");
2591 db.names.push_back("operator+");
2595 db.names.push_back("operator->");
2601 if (first[1] == 'u')
2603 db.names.push_back("operator?");
2611 db.names.push_back("operator%");
2615 db.names.push_back("operator%=");
2619 db.names.push_back("operator>>");
2623 db.names.push_back("operator>>=");
2629 if (std::isdigit(first[1]))
2631 const char* t = parse_source_name(first+2, last, db);
2634 if (db.names.empty())
2636 db.names.back().first.insert(0, "operator ");
2648 parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db)
2650 const char* t = parse_number(first, last);
2651 if (t != first && t != last && *t == 'E')
2654 db.names.push_back("(" + lit + ")");
2656 db.names.emplace_back();
2659 db.names.back().first += '-';
2662 db.names.back().first.append(first, t);
2663 if (lit.size() <= 3)
2664 db.names.back().first += lit;
2670 // <expr-primary> ::= L <type> <value number> E # integer literal
2671 // ::= L <type> <value float> E # floating literal
2672 // ::= L <string type> E # string literal
2673 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
2674 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
2675 // ::= L <mangled-name> E # external name
2679 parse_expr_primary(const char* first, const char* last, C& db)
2681 if (last - first >= 4 && *first == 'L')
2687 const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
2693 if (first[3] == 'E')
2698 db.names.push_back("false");
2702 db.names.push_back("true");
2710 const char* t = parse_integer_literal(first+2, last, "char", db);
2717 const char* t = parse_integer_literal(first+2, last, "signed char", db);
2724 const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
2731 const char* t = parse_integer_literal(first+2, last, "short", db);
2738 const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
2745 const char* t = parse_integer_literal(first+2, last, "", db);
2752 const char* t = parse_integer_literal(first+2, last, "u", db);
2759 const char* t = parse_integer_literal(first+2, last, "l", db);
2766 const char* t = parse_integer_literal(first+2, last, "ul", db);
2773 const char* t = parse_integer_literal(first+2, last, "ll", db);
2780 const char* t = parse_integer_literal(first+2, last, "ull", db);
2787 const char* t = parse_integer_literal(first+2, last, "__int128", db);
2794 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
2801 const char* t = parse_floating_number<float>(first+2, last, db);
2808 const char* t = parse_floating_number<double>(first+2, last, db);
2815 const char* t = parse_floating_number<long double>(first+2, last, db);
2821 if (first[2] == 'Z')
2823 const char* t = parse_encoding(first+3, last, db);
2824 if (t != first+3 && t != last && *t == 'E')
2829 // Invalid mangled name per
2830 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2834 // might be named type
2835 const char* t = parse_type(first+1, last, db);
2836 if (t != first+1 && t != last)
2841 for (; n != last && isdigit(*n); ++n)
2843 if (n != t && n != last && *n == 'E')
2845 if (db.names.empty())
2847 db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
2864 template <class String>
2866 base_name(String& s)
2870 if (s == "std::string")
2872 s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2873 return "basic_string";
2875 if (s == "std::istream")
2877 s = "std::basic_istream<char, std::char_traits<char> >";
2878 return "basic_istream";
2880 if (s == "std::ostream")
2882 s = "std::basic_ostream<char, std::char_traits<char> >";
2883 return "basic_ostream";
2885 if (s == "std::iostream")
2887 s = "std::basic_iostream<char, std::char_traits<char> >";
2888 return "basic_iostream";
2890 const char* const pf = s.data();
2891 const char* pe = pf + s.size();
2907 else if (pe[-1] == '>')
2911 const char* p0 = pe - 1;
2912 for (; p0 != pf; --p0)
2920 return String(p0, pe);
2923 // <ctor-dtor-name> ::= C1 # complete object constructor
2924 // ::= C2 # base object constructor
2925 // ::= C3 # complete object allocating constructor
2926 // extension ::= C5 # ?
2927 // ::= D0 # deleting destructor
2928 // ::= D1 # complete object destructor
2929 // ::= D2 # base object destructor
2930 // extension ::= D5 # ?
2934 parse_ctor_dtor_name(const char* first, const char* last, C& db)
2936 if (last-first >= 2 && !db.names.empty())
2947 if (db.names.empty())
2949 db.names.push_back(base_name(db.names.back().first));
2951 db.parsed_ctor_dtor_cv = true;
2962 if (db.names.empty())
2964 db.names.push_back("~" + base_name(db.names.back().first));
2966 db.parsed_ctor_dtor_cv = true;
2975 // <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2976 // ::= <closure-type-name>
2978 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2980 // <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2984 parse_unnamed_type_name(const char* first, const char* last, C& db)
2986 if (last - first > 2 && first[0] == 'U')
2988 char type = first[1];
2993 db.names.push_back(typename C::String("'unnamed"));
2994 const char* t0 = first+2;
2997 db.names.pop_back();
3000 if (std::isdigit(*t0))
3002 const char* t1 = t0 + 1;
3003 while (t1 != last && std::isdigit(*t1))
3005 db.names.back().first.append(t0, t1);
3008 db.names.back().first.push_back('\'');
3009 if (t0 == last || *t0 != '_')
3011 db.names.pop_back();
3019 db.names.push_back(typename C::String("'lambda'("));
3020 const char* t0 = first+2;
3021 if (first[2] == 'v')
3023 db.names.back().first += ')';
3028 const char* t1 = parse_type(t0, last, db);
3031 db.names.pop_back();
3034 if (db.names.size() < 2)
3036 auto tmp = db.names.back().move_full();
3037 db.names.pop_back();
3038 db.names.back().first.append(tmp);
3042 t1 = parse_type(t0, last, db);
3045 if (db.names.size() < 2)
3047 tmp = db.names.back().move_full();
3048 db.names.pop_back();
3051 db.names.back().first.append(", ");
3052 db.names.back().first.append(tmp);
3056 db.names.back().first.append(")");
3058 if (t0 == last || *t0 != 'E')
3060 db.names.pop_back();
3066 db.names.pop_back();
3069 if (std::isdigit(*t0))
3071 const char* t1 = t0 + 1;
3072 while (t1 != last && std::isdigit(*t1))
3074 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
3077 if (t0 == last || *t0 != '_')
3079 db.names.pop_back();
3090 // <unqualified-name> ::= <operator-name>
3091 // ::= <ctor-dtor-name>
3092 // ::= <source-name>
3093 // ::= <unnamed-type-name>
3097 parse_unqualified_name(const char* first, const char* last, C& db)
3106 t = parse_ctor_dtor_name(first, last, db);
3111 t = parse_unnamed_type_name(first, last, db);
3124 t = parse_source_name(first, last, db);
3129 t = parse_operator_name(first, last, db);
3138 // <unscoped-name> ::= <unqualified-name>
3139 // ::= St <unqualified-name> # ::std::
3140 // extension ::= StL<unqualified-name>
3144 parse_unscoped_name(const char* first, const char* last, C& db)
3146 if (last - first >= 2)
3148 const char* t0 = first;
3150 if (first[0] == 'S' && first[1] == 't')
3154 if (t0 != last && *t0 == 'L')
3157 const char* t1 = parse_unqualified_name(t0, last, db);
3162 if (db.names.empty())
3164 db.names.back().first.insert(0, "std::");
3172 // at <type> # alignof (a type)
3176 parse_alignof_type(const char* first, const char* last, C& db)
3178 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
3180 const char* t = parse_type(first+2, last, db);
3183 if (db.names.empty())
3185 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3192 // az <expression> # alignof (a expression)
3196 parse_alignof_expr(const char* first, const char* last, C& db)
3198 if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
3200 const char* t = parse_expression(first+2, last, db);
3203 if (db.names.empty())
3205 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3214 parse_noexcept_expression(const char* first, const char* last, C& db)
3216 const char* t1 = parse_expression(first, last, db);
3219 if (db.names.empty())
3221 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
3229 parse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db)
3231 const char* t1 = parse_expression(first, last, db);
3234 if (db.names.empty())
3236 db.names.back().first = op + "(" + db.names.back().move_full() + ")";
3244 parse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db)
3246 const char* t1 = parse_expression(first, last, db);
3249 const char* t2 = parse_expression(t1, last, db);
3252 if (db.names.size() < 2)
3254 auto op2 = db.names.back().move_full();
3255 db.names.pop_back();
3256 auto op1 = db.names.back().move_full();
3257 auto& nm = db.names.back().first;
3261 nm += "(" + op1 + ") " + op + " (" + op2 + ")";
3267 db.names.pop_back();
3272 // <expression> ::= <unary operator-name> <expression>
3273 // ::= <binary operator-name> <expression> <expression>
3274 // ::= <ternary operator-name> <expression> <expression> <expression>
3275 // ::= cl <expression>+ E # call
3276 // ::= cv <type> <expression> # conversion with one argument
3277 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments
3278 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
3279 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3280 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
3281 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3282 // ::= [gs] dl <expression> # delete expression
3283 // ::= [gs] da <expression> # delete[] expression
3284 // ::= pp_ <expression> # prefix ++
3285 // ::= mm_ <expression> # prefix --
3286 // ::= ti <type> # typeid (type)
3287 // ::= te <expression> # typeid (expression)
3288 // ::= dc <type> <expression> # dynamic_cast<type> (expression)
3289 // ::= sc <type> <expression> # static_cast<type> (expression)
3290 // ::= cc <type> <expression> # const_cast<type> (expression)
3291 // ::= rc <type> <expression> # reinterpret_cast<type> (expression)
3292 // ::= st <type> # sizeof (a type)
3293 // ::= sz <expression> # sizeof (an expression)
3294 // ::= at <type> # alignof (a type)
3295 // ::= az <expression> # alignof (an expression)
3296 // ::= nx <expression> # noexcept (expression)
3297 // ::= <template-param>
3298 // ::= <function-param>
3299 // ::= dt <expression> <unresolved-name> # expr.name
3300 // ::= pt <expression> <unresolved-name> # expr->name
3301 // ::= ds <expression> <expression> # expr.*expr
3302 // ::= sZ <template-param> # size of a parameter pack
3303 // ::= sZ <function-param> # size of a function parameter pack
3304 // ::= sp <expression> # pack expansion
3305 // ::= tw <expression> # throw expression
3306 // ::= tr # throw with no operand (rethrow)
3307 // ::= <unresolved-name> # f(p), N::f(p), ::f(p),
3308 // # freestanding dependent name (e.g., T::x),
3309 // # objectless nonstatic member reference
3310 // ::= <expr-primary>
3314 parse_expression(const char* first, const char* last, C& db)
3316 if (last - first >= 2)
3318 const char* t = first;
3319 bool parsed_gs = false;
3320 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
3328 first = parse_expr_primary(first, last, db);
3331 first = parse_template_param(first, last, db);
3334 first = parse_function_param(first, last, db);
3340 t = parse_binary_expression(first+2, last, "&&", db);
3345 t = parse_prefix_expression(first+2, last, "&", db);
3350 t = parse_binary_expression(first+2, last, "&", db);
3355 t = parse_binary_expression(first+2, last, "&=", db);
3360 t = parse_binary_expression(first+2, last, "=", db);
3365 first = parse_alignof_type(first, last, db);
3368 first = parse_alignof_expr(first, last, db);
3376 first = parse_const_cast_expr(first, last, db);
3379 first = parse_call_expr(first, last, db);
3382 t = parse_binary_expression(first+2, last, ",", db);
3387 t = parse_prefix_expression(first+2, last, "~", db);
3392 first = parse_conversion_expr(first, last, db);
3401 const char* t1 = parse_expression(t+2, last, db);
3404 if (db.names.empty())
3406 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3407 "delete[] " + db.names.back().move_full();
3413 first = parse_dynamic_cast_expr(first, last, db);
3416 t = parse_prefix_expression(first+2, last, "*", db);
3422 const char* t1 = parse_expression(t+2, last, db);
3425 if (db.names.empty())
3427 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3428 "delete " + db.names.back().move_full();
3434 return parse_unresolved_name(first, last, db);
3436 first = parse_dot_star_expr(first, last, db);
3439 first = parse_dot_expr(first, last, db);
3442 t = parse_binary_expression(first+2, last, "/", db);
3447 t = parse_binary_expression(first+2, last, "/=", db);
3457 t = parse_binary_expression(first+2, last, "^", db);
3462 t = parse_binary_expression(first+2, last, "^=", db);
3467 t = parse_binary_expression(first+2, last, "==", db);
3477 t = parse_binary_expression(first+2, last, ">=", db);
3482 t = parse_binary_expression(first+2, last, ">", db);
3491 const char* t1 = parse_expression(first+2, last, db);
3494 const char* t2 = parse_expression(t1, last, db);
3497 if (db.names.size() < 2)
3499 auto op2 = db.names.back().move_full();
3500 db.names.pop_back();
3501 auto op1 = db.names.back().move_full();
3502 db.names.back() = "(" + op1 + ")[" + op2 + "]";
3506 db.names.pop_back();
3514 t = parse_binary_expression(first+2, last, "<=", db);
3519 t = parse_binary_expression(first+2, last, "<<", db);
3524 t = parse_binary_expression(first+2, last, "<<=", db);
3529 t = parse_binary_expression(first+2, last, "<", db);
3539 t = parse_binary_expression(first+2, last, "-", db);
3544 t = parse_binary_expression(first+2, last, "-=", db);
3549 t = parse_binary_expression(first+2, last, "*", db);
3554 t = parse_binary_expression(first+2, last, "*=", db);
3559 if (first+2 != last && first[2] == '_')
3561 t = parse_prefix_expression(first+3, last, "--", db);
3567 const char* t1 = parse_expression(first+2, last, db);
3570 if (db.names.empty())
3572 db.names.back() = "(" + db.names.back().move_full() + ")--";
3584 first = parse_new_expr(first, last, db);
3587 t = parse_binary_expression(first+2, last, "!=", db);
3592 t = parse_prefix_expression(first+2, last, "-", db);
3597 t = parse_prefix_expression(first+2, last, "!", db);
3602 t = parse_noexcept_expression(first+2, last, db);
3612 return parse_unresolved_name(first, last, db);
3614 t = parse_binary_expression(first+2, last, "||", db);
3619 t = parse_binary_expression(first+2, last, "|", db);
3624 t = parse_binary_expression(first+2, last, "|=", db);
3634 t = parse_binary_expression(first+2, last, "->*", db);
3639 t = parse_binary_expression(first+2, last, "+", db);
3644 t = parse_binary_expression(first+2, last, "+=", db);
3649 if (first+2 != last && first[2] == '_')
3651 t = parse_prefix_expression(first+3, last, "++", db);
3657 const char* t1 = parse_expression(first+2, last, db);
3660 if (db.names.empty())
3662 db.names.back() = "(" + db.names.back().move_full() + ")++";
3668 t = parse_prefix_expression(first+2, last, "+", db);
3673 first = parse_arrow_expr(first, last, db);
3680 const char* t1 = parse_expression(first+2, last, db);
3683 const char* t2 = parse_expression(t1, last, db);
3686 const char* t3 = parse_expression(t2, last, db);
3689 if (db.names.size() < 3)
3691 auto op3 = db.names.back().move_full();
3692 db.names.pop_back();
3693 auto op2 = db.names.back().move_full();
3694 db.names.pop_back();
3695 auto op1 = db.names.back().move_full();
3696 db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
3701 db.names.pop_back();
3702 db.names.pop_back();
3706 db.names.pop_back();
3714 first = parse_reinterpret_cast_expr(first, last, db);
3717 t = parse_binary_expression(first+2, last, "%", db);
3722 t = parse_binary_expression(first+2, last, "%=", db);
3727 t = parse_binary_expression(first+2, last, ">>", db);
3732 t = parse_binary_expression(first+2, last, ">>=", db);
3742 first = parse_static_cast_expr(first, last, db);
3745 first = parse_pack_expansion(first, last, db);
3748 return parse_unresolved_name(first, last, db);
3750 first = parse_sizeof_type_expr(first, last, db);
3753 first = parse_sizeof_expr_expr(first, last, db);
3761 first = parse_sizeof_param_pack_expr(first, last, db);
3764 first = parse_sizeof_function_param_pack_expr(first, last, db);
3776 first = parse_typeid_expr(first, last, db);
3779 db.names.push_back("throw");
3783 first = parse_throw_expr(first, last, db);
3796 return parse_unresolved_name(first, last, db);
3802 // <template-arg> ::= <type> # type or template
3803 // ::= X <expression> E # expression
3804 // ::= <expr-primary> # simple expressions
3805 // ::= J <template-arg>* E # argument pack
3806 // ::= LZ <encoding> E # extension
3810 parse_template_arg(const char* first, const char* last, C& db)
3818 t = parse_expression(first+1, last, db);
3821 if (t != last && *t == 'E')
3831 const char* t1 = parse_template_arg(t, last, db);
3839 // <expr-primary> or LZ <encoding> E
3840 if (first+1 != last && first[1] == 'Z')
3842 t = parse_encoding(first+2, last, db);
3843 if (t != first+2 && t != last && *t == 'E')
3847 first = parse_expr_primary(first, last, db);
3851 first = parse_type(first, last, db);
3858 // <template-args> ::= I <template-arg>* E
3859 // extension, the abi says <template-arg>+
3863 parse_template_args(const char* first, const char* last, C& db)
3865 if (last - first >= 2 && *first == 'I')
3867 if (db.tag_templates)
3868 db.template_param.back().clear();
3869 const char* t = first+1;
3870 typename C::String args("<");
3873 if (db.tag_templates)
3874 db.template_param.emplace_back(db.names.get_allocator());
3875 size_t k0 = db.names.size();
3876 const char* t1 = parse_template_arg(t, last, db);
3877 size_t k1 = db.names.size();
3878 if (db.tag_templates)
3879 db.template_param.pop_back();
3880 if (t1 == t || t1 == last)
3882 if (db.tag_templates)
3884 db.template_param.back().emplace_back(db.names.get_allocator());
3885 for (size_t k = k0; k < k1; ++k)
3886 db.template_param.back().back().push_back(db.names[k]);
3888 for (size_t k = k0; k < k1; ++k)
3890 if (args.size() > 1)
3892 args += db.names[k].move_full();
3894 for (; k1 != k0; --k1)
3895 db.names.pop_back();
3899 if (args.back() != '>')
3903 db.names.push_back(std::move(args));
3909 // <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
3910 // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
3912 // <prefix> ::= <prefix> <unqualified-name>
3913 // ::= <template-prefix> <template-args>
3914 // ::= <template-param>
3917 // ::= <substitution>
3918 // ::= <prefix> <data-member-prefix>
3921 // <template-prefix> ::= <prefix> <template unqualified-name>
3922 // ::= <template-param>
3923 // ::= <substitution>
3927 parse_nested_name(const char* first, const char* last, C& db)
3929 if (first != last && *first == 'N')
3932 const char* t0 = parse_cv_qualifiers(first+1, last, cv);
3941 else if (*t0 == 'O')
3946 db.names.emplace_back();
3947 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
3950 db.names.back().first = "std";
3954 db.names.pop_back();
3957 bool pop_subs = false;
3964 if (t0 + 1 != last && t0[1] == 't')
3965 goto do_parse_unqualified_name;
3966 t1 = parse_substitution(t0, last, db);
3967 if (t1 != t0 && t1 != last)
3969 auto name = db.names.back().move_full();
3970 db.names.pop_back();
3971 if (!db.names.back().first.empty())
3973 db.names.back().first += "::" + name;
3974 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3977 db.names.back().first = name;
3985 t1 = parse_template_param(t0, last, db);
3986 if (t1 != t0 && t1 != last)
3988 auto name = db.names.back().move_full();
3989 db.names.pop_back();
3990 if (!db.names.back().first.empty())
3991 db.names.back().first += "::" + name;
3993 db.names.back().first = name;
3994 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4002 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
4003 goto do_parse_unqualified_name;
4004 t1 = parse_decltype(t0, last, db);
4005 if (t1 != t0 && t1 != last)
4007 auto name = db.names.back().move_full();
4008 db.names.pop_back();
4009 if (!db.names.back().first.empty())
4010 db.names.back().first += "::" + name;
4012 db.names.back().first = name;
4013 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4021 t1 = parse_template_args(t0, last, db);
4022 if (t1 != t0 && t1 != last)
4024 auto name = db.names.back().move_full();
4025 db.names.pop_back();
4026 db.names.back().first += name;
4027 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4038 do_parse_unqualified_name:
4039 t1 = parse_unqualified_name(t0, last, db);
4040 if (t1 != t0 && t1 != last)
4042 auto name = db.names.back().move_full();
4043 db.names.pop_back();
4044 if (!db.names.back().first.empty())
4045 db.names.back().first += "::" + name;
4047 db.names.back().first = name;
4048 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4058 if (pop_subs && !db.subs.empty())
4064 // <discriminator> := _ <non-negative number> # when number < 10
4065 // := __ <non-negative number> _ # when number >= 10
4066 // extension := decimal-digit+
4069 parse_discriminator(const char* first, const char* last)
4071 // parse but ignore discriminator
4076 const char* t1 = first+1;
4079 if (std::isdigit(*t1))
4081 else if (*t1 == '_')
4083 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4085 if (t1 != last && *t1 == '_')
4090 else if (std::isdigit(*first))
4092 const char* t1 = first+1;
4093 for (; t1 != last && std::isdigit(*t1); ++t1)
4101 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
4102 // := Z <function encoding> E s [<discriminator>]
4103 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
4107 parse_local_name(const char* first, const char* last, C& db)
4109 if (first != last && *first == 'Z')
4111 const char* t = parse_encoding(first+1, last, db);
4112 if (t != first+1 && t != last && *t == 'E' && ++t != last)
4117 first = parse_discriminator(t+1, last);
4118 if (db.names.empty())
4120 db.names.back().first.append("::string literal");
4125 const char* t1 = parse_number(t, last);
4126 if (t1 != last && *t1 == '_')
4129 t1 = parse_name(t, last, db);
4132 if (db.names.size() < 2)
4134 auto name = db.names.back().move_full();
4135 db.names.pop_back();
4136 db.names.back().first.append("::");
4137 db.names.back().first.append(name);
4141 db.names.pop_back();
4147 const char* t1 = parse_name(t, last, db);
4150 // parse but ignore discriminator
4151 first = parse_discriminator(t1, last);
4152 if (db.names.size() < 2)
4154 auto name = db.names.back().move_full();
4155 db.names.pop_back();
4156 db.names.back().first.append("::");
4157 db.names.back().first.append(name);
4160 db.names.pop_back();
4169 // <name> ::= <nested-name> // N
4170 // ::= <local-name> # See Scope Encoding below // Z
4171 // ::= <unscoped-template-name> <template-args>
4172 // ::= <unscoped-name>
4174 // <unscoped-template-name> ::= <unscoped-name>
4175 // ::= <substitution>
4179 parse_name(const char* first, const char* last, C& db)
4181 if (last - first >= 2)
4183 const char* t0 = first;
4184 // extension: ignore L here
4191 const char* t1 = parse_nested_name(t0, last, db);
4198 const char* t1 = parse_local_name(t0, last, db);
4205 const char* t1 = parse_unscoped_name(t0, last, db);
4208 if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args>
4210 if (db.names.empty())
4212 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4214 t1 = parse_template_args(t0, last, db);
4217 if (db.names.size() < 2)
4219 auto tmp = db.names.back().move_full();
4220 db.names.pop_back();
4221 db.names.back().first += tmp;
4225 else // <unscoped-name>
4229 { // try <substitution> <template-args>
4230 t1 = parse_substitution(t0, last, db);
4231 if (t1 != t0 && t1 != last && *t1 == 'I')
4234 t1 = parse_template_args(t0, last, db);
4237 if (db.names.size() < 2)
4239 auto tmp = db.names.back().move_full();
4240 db.names.pop_back();
4241 db.names.back().first += tmp;
4253 // <call-offset> ::= h <nv-offset> _
4254 // ::= v <v-offset> _
4256 // <nv-offset> ::= <offset number>
4257 // # non-virtual base override
4259 // <v-offset> ::= <offset number> _ <virtual offset number>
4260 // # virtual base override, with vcall offset
4263 parse_call_offset(const char* first, const char* last)
4271 const char* t = parse_number(first + 1, last);
4272 if (t != first + 1 && t != last && *t == '_')
4278 const char* t = parse_number(first + 1, last);
4279 if (t != first + 1 && t != last && *t == '_')
4281 const char* t2 = parse_number(++t, last);
4282 if (t2 != t && t2 != last && *t2 == '_')
4292 // <special-name> ::= TV <type> # virtual table
4293 // ::= TT <type> # VTT structure (construction vtable index)
4294 // ::= TI <type> # typeinfo structure
4295 // ::= TS <type> # typeinfo name (null-terminated byte string)
4296 // ::= Tc <call-offset> <call-offset> <base encoding>
4297 // # base is the nominal target function of thunk
4298 // # first call-offset is 'this' adjustment
4299 // # second call-offset is result adjustment
4300 // ::= T <call-offset> <base encoding>
4301 // # base is the nominal target function of thunk
4302 // ::= GV <object name> # Guard variable for one-time initialization
4304 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4305 // extension ::= GR <object name> # reference temporary for object
4309 parse_special_name(const char* first, const char* last, C& db)
4311 if (last - first > 2)
4320 // TV <type> # virtual table
4321 t = parse_type(first+2, last, db);
4324 if (db.names.empty())
4326 db.names.back().first.insert(0, "vtable for ");
4331 // TT <type> # VTT structure (construction vtable index)
4332 t = parse_type(first+2, last, db);
4335 if (db.names.empty())
4337 db.names.back().first.insert(0, "VTT for ");
4342 // TI <type> # typeinfo structure
4343 t = parse_type(first+2, last, db);
4346 if (db.names.empty())
4348 db.names.back().first.insert(0, "typeinfo for ");
4353 // TS <type> # typeinfo name (null-terminated byte string)
4354 t = parse_type(first+2, last, db);
4357 if (db.names.empty())
4359 db.names.back().first.insert(0, "typeinfo name for ");
4364 // Tc <call-offset> <call-offset> <base encoding>
4366 const char* t0 = parse_call_offset(first+2, last);
4369 const char* t1 = parse_call_offset(t0, last);
4372 t = parse_encoding(t1, last, db);
4375 if (db.names.empty())
4377 db.names.back().first.insert(0, "covariant return thunk to ");
4383 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4384 t = parse_type(first+2, last, db);
4387 const char* t0 = parse_number(t, last);
4388 if (t0 != t && t0 != last && *t0 == '_')
4390 const char* t1 = parse_type(++t0, last, db);
4393 if (db.names.size() < 2)
4395 auto left = db.names.back().move_full();
4396 db.names.pop_back();
4397 db.names.back().first = "construction vtable for " +
4398 std::move(left) + "-in-" +
4399 db.names.back().move_full();
4406 // T <call-offset> <base encoding>
4408 const char* t0 = parse_call_offset(first+1, last);
4411 t = parse_encoding(t0, last, db);
4414 if (db.names.empty())
4416 if (first[2] == 'v')
4418 db.names.back().first.insert(0, "virtual thunk to ");
4423 db.names.back().first.insert(0, "non-virtual thunk to ");
4435 // GV <object name> # Guard variable for one-time initialization
4436 t = parse_name(first+2, last, db);
4439 if (db.names.empty())
4441 db.names.back().first.insert(0, "guard variable for ");
4446 // extension ::= GR <object name> # reference temporary for object
4447 t = parse_name(first+2, last, db);
4450 if (db.names.empty())
4452 db.names.back().first.insert(0, "reference temporary for ");
4469 save_value(T& restore)
4470 : restore_(restore),
4471 original_value_(restore)
4476 restore_ = std::move(original_value_);
4479 save_value(const save_value&) = delete;
4480 save_value& operator=(const save_value&) = delete;
4483 // <encoding> ::= <function name> <bare-function-type>
4485 // ::= <special-name>
4489 parse_encoding(const char* first, const char* last, C& db)
4493 save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4494 ++db.encoding_depth;
4495 save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4496 if (db.encoding_depth > 1)
4497 db.tag_templates = true;
4502 first = parse_special_name(first, last, db);
4506 const char* t = parse_name(first, last, db);
4507 unsigned cv = db.cv;
4508 unsigned ref = db.ref;
4511 if (t != last && *t != 'E' && *t != '.')
4513 save_value<bool> sb2(db.tag_templates);
4514 db.tag_templates = false;
4516 typename C::String ret2;
4517 if (db.names.empty())
4519 const typename C::String& nm = db.names.back().first;
4522 if (!db.parsed_ctor_dtor_cv && nm.back() == '>' && nm[nm.size()-2] != '-'
4523 && nm[nm.size()-2] != '>')
4525 t2 = parse_type(t, last, db);
4528 if (db.names.size() < 2)
4530 auto ret1 = std::move(db.names.back().first);
4531 ret2 = std::move(db.names.back().second);
4534 db.names.pop_back();
4535 db.names.back().first.insert(0, ret1);
4538 db.names.back().first += '(';
4539 if (t != last && *t == 'v')
4545 bool first_arg = true;
4548 size_t k0 = db.names.size();
4549 t2 = parse_type(t, last, db);
4550 size_t k1 = db.names.size();
4555 typename C::String tmp;
4556 for (size_t k = k0; k < k1; ++k)
4560 tmp += db.names[k].move_full();
4562 for (size_t k = k0; k < k1; ++k)
4563 db.names.pop_back();
4566 if (db.names.empty())
4569 db.names.back().first += ", ";
4572 db.names.back().first += tmp;
4578 if (db.names.empty())
4580 db.names.back().first += ')';
4582 db.names.back().first.append(" const");
4584 db.names.back().first.append(" volatile");
4586 db.names.back().first.append(" restrict");
4588 db.names.back().first.append(" &");
4590 db.names.back().first.append(" &&");
4591 db.names.back().first += ret2;
4605 // _block_invoke<decimal-digit>+
4606 // _block_invoke_<decimal-digit>+
4610 parse_block_invoke(const char* first, const char* last, C& db)
4612 if (last - first >= 13)
4614 const char test[] = "_block_invoke";
4615 const char* t = first;
4616 for (int i = 0; i < 13; ++i, ++t)
4625 // must have at least 1 decimal digit
4626 if (++t == last || !std::isdigit(*t))
4630 // parse zero or more digits
4631 while (t != last && isdigit(*t))
4634 if (db.names.empty())
4636 db.names.back().first.insert(0, "invocation function for block in ");
4643 // <dot-suffix> := .<anything and everything>
4647 parse_dot_suffix(const char* first, const char* last, C& db)
4649 if (first != last && *first == '.')
4651 if (db.names.empty())
4653 db.names.back().first += " (" + typename C::String(first, last) + ")";
4659 // <block-involcaton-function> ___Z<encoding>_block_invoke
4660 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
4661 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
4662 // <mangled-name> ::= _Z<encoding>
4667 demangle(const char* first, const char* last, C& db, int& status)
4671 status = invalid_mangled_name;
4676 if (last - first >= 4)
4678 if (first[1] == 'Z')
4680 const char* t = parse_encoding(first+2, last, db);
4681 if (t != first+2 && t != last && *t == '.')
4682 t = parse_dot_suffix(t, last, db);
4684 status = invalid_mangled_name;
4686 else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
4688 const char* t = parse_encoding(first+4, last, db);
4689 if (t != first+4 && t != last)
4691 const char* t1 = parse_block_invoke(t, last, db);
4693 status = invalid_mangled_name;
4696 status = invalid_mangled_name;
4699 status = invalid_mangled_name;
4702 status = invalid_mangled_name;
4706 const char* t = parse_type(first, last, db);
4708 status = invalid_mangled_name;
4710 if (status == success && db.names.empty())
4711 status = invalid_mangled_name;
4714 template <std::size_t N>
4717 static const std::size_t alignment = 16;
4718 alignas(alignment) char buf_[N];
4722 align_up(std::size_t n) noexcept
4723 {return n + (alignment-1) & ~(alignment-1);}
4726 pointer_in_buffer(char* p) noexcept
4727 {return buf_ <= p && p <= buf_ + N;}
4730 arena() noexcept : ptr_(buf_) {}
4731 ~arena() {ptr_ = nullptr;}
4732 arena(const arena&) = delete;
4733 arena& operator=(const arena&) = delete;
4735 char* allocate(std::size_t n);
4736 void deallocate(char* p, std::size_t n) noexcept;
4738 static constexpr std::size_t size() {return N;}
4739 std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);}
4740 void reset() {ptr_ = buf_;}
4743 template <std::size_t N>
4745 arena<N>::allocate(std::size_t n)
4748 if (static_cast<std::size_t>(buf_ + N - ptr_) >= n)
4754 return static_cast<char*>(std::malloc(n));
4757 template <std::size_t N>
4759 arena<N>::deallocate(char* p, std::size_t n) noexcept
4761 if (pointer_in_buffer(p))
4771 template <class T, std::size_t N>
4776 typedef T value_type;
4779 template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;};
4781 short_alloc(arena<N>& a) noexcept : a_(a) {}
4783 short_alloc(const short_alloc<U, N>& a) noexcept
4785 short_alloc(const short_alloc&) = default;
4786 short_alloc& operator=(const short_alloc&) = delete;
4788 T* allocate(std::size_t n)
4790 return reinterpret_cast<T*>(a_.allocate(n*sizeof(T)));
4792 void deallocate(T* p, std::size_t n) noexcept
4794 a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T));
4797 template <class T1, std::size_t N1, class U, std::size_t M>
4800 operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept;
4802 template <class U, std::size_t M> friend class short_alloc;
4805 template <class T, std::size_t N, class U, std::size_t M>
4808 operator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4810 return N == M && &x.a_ == &y.a_;
4813 template <class T, std::size_t N, class U, std::size_t M>
4816 operator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4825 typedef T value_type;
4827 malloc_alloc() = default;
4828 template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
4830 T* allocate(std::size_t n)
4832 return static_cast<T*>(std::malloc(n*sizeof(T)));
4834 void deallocate(T* p, std::size_t) noexcept
4840 template <class T, class U>
4843 operator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept
4848 template <class T, class U>
4851 operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
4856 const size_t bs = 4 * 1024;
4857 template <class T> using Alloc = short_alloc<T, bs>;
4858 template <class T> using Vector = std::vector<T, Alloc<T>>;
4859 using String = std::basic_string<char, std::char_traits<char>, malloc_alloc<char>>;
4866 string_pair() = default;
4867 string_pair(String f) : first(std::move(f)) {}
4868 string_pair(String f, String s)
4869 : first(std::move(f)), second(std::move(s)) {}
4871 string_pair(const char (&s)[N]) : first(s, N-1) {}
4873 size_t size() const {return first.size() + second.size();}
4874 String full() const {return first + second;}
4875 String move_full() {return std::move(first) + std::move(second);}
4880 typedef String String;
4881 typedef Vector<string_pair> sub_type;
4882 typedef Vector<sub_type> template_param_type;
4883 Vector<string_pair> names;
4884 Vector<sub_type> subs;
4885 Vector<template_param_type> template_param;
4888 unsigned encoding_depth;
4889 bool parsed_ctor_dtor_cv;
4891 bool fix_forward_references;
4892 bool try_to_parse_template_args;
4898 template_param(0, subs, ar)
4903 __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
4905 if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
4908 *status = invalid_args;
4911 size_t internal_size = buf != nullptr ? *n : 0;
4916 db.encoding_depth = 0;
4917 db.parsed_ctor_dtor_cv = false;
4918 db.tag_templates = true;
4919 db.template_param.emplace_back(a);
4920 db.fix_forward_references = false;
4921 db.try_to_parse_template_args = true;
4922 int internal_status = success;
4923 size_t len = std::strlen(mangled_name);
4924 demangle(mangled_name, mangled_name + len, db,
4926 if (internal_status == success && db.fix_forward_references &&
4927 !db.template_param.empty() && !db.template_param.front().empty())
4929 db.fix_forward_references = false;
4930 db.tag_templates = false;
4933 demangle(mangled_name, mangled_name + len, db, internal_status);
4934 if (db.fix_forward_references)
4935 internal_status = invalid_mangled_name;
4937 if (internal_status == success)
4939 size_t sz = db.names.back().size() + 1;
4940 if (sz > internal_size)
4942 char* newbuf = static_cast<char*>(std::realloc(buf, sz));
4943 if (newbuf == nullptr)
4945 internal_status = memory_alloc_failure;
4957 db.names.back().first += db.names.back().second;
4958 std::memcpy(buf, db.names.back().first.data(), sz-1);
4959 buf[sz-1] = char(0);
4965 *status = internal_status;
4973 #include "llvm/ADT/DenseMap.h"
4975 #include "lldb/Core/ConstString.h"
4976 #include "lldb/Core/Mangled.h"
4977 #include "lldb/Core/RegularExpression.h"
4978 #include "lldb/Core/Stream.h"
4979 #include "lldb/Core/Timer.h"
4984 using namespace lldb_private;
4987 cstring_is_mangled (const char *s)
4990 return s[0] == '_' && s[1] == 'Z';
4994 #pragma mark Mangled
4995 //----------------------------------------------------------------------
4996 // Default constructor
4997 //----------------------------------------------------------------------
4998 Mangled::Mangled () :
5004 //----------------------------------------------------------------------
5005 // Constructor with an optional string and a boolean indicating if it is
5006 // the mangled version.
5007 //----------------------------------------------------------------------
5008 Mangled::Mangled (const ConstString &s, bool mangled) :
5013 SetValue(s, mangled);
5016 Mangled::Mangled (const ConstString &s) :
5024 //----------------------------------------------------------------------
5026 //----------------------------------------------------------------------
5027 Mangled::~Mangled ()
5031 //----------------------------------------------------------------------
5032 // Convert to pointer operator. This allows code to check any Mangled
5033 // objects to see if they contain anything valid using code such as:
5035 // Mangled mangled(...);
5038 //----------------------------------------------------------------------
5039 Mangled::operator void* () const
5041 return (m_mangled) ? const_cast<Mangled*>(this) : NULL;
5044 //----------------------------------------------------------------------
5045 // Logical NOT operator. This allows code to check any Mangled
5046 // objects to see if they are invalid using code such as:
5048 // Mangled mangled(...);
5051 //----------------------------------------------------------------------
5053 Mangled::operator! () const
5058 //----------------------------------------------------------------------
5059 // Clear the mangled and demangled values.
5060 //----------------------------------------------------------------------
5065 m_demangled.Clear();
5069 //----------------------------------------------------------------------
5070 // Compare the the string values.
5071 //----------------------------------------------------------------------
5073 Mangled::Compare (const Mangled& a, const Mangled& b)
5075 return ConstString::Compare(a.GetName(ePreferMangled), a.GetName(ePreferMangled));
5080 //----------------------------------------------------------------------
5081 // Set the string value in this objects. If "mangled" is true, then
5082 // the mangled named is set with the new value in "s", else the
5083 // demangled name is set.
5084 //----------------------------------------------------------------------
5086 Mangled::SetValue (const ConstString &s, bool mangled)
5092 m_demangled.Clear();
5103 m_demangled.Clear();
5109 Mangled::SetValue (const ConstString &name)
5113 if (cstring_is_mangled(name.GetCString()))
5115 m_demangled.Clear();
5126 m_demangled.Clear();
5132 //----------------------------------------------------------------------
5133 // Generate the demangled name on demand using this accessor. Code in
5134 // this class will need to use this accessor if it wishes to decode
5135 // the demangled name. The result is cached and will be kept until a
5136 // new string value is supplied to this object, or until the end of the
5137 // object's lifetime.
5138 //----------------------------------------------------------------------
5140 Mangled::GetDemangledName () const
5142 // Check to make sure we have a valid mangled name and that we
5143 // haven't already decoded our mangled name.
5144 if (m_mangled && !m_demangled)
5146 // We need to generate and cache the demangled name.
5147 Timer scoped_timer (__PRETTY_FUNCTION__,
5148 "Mangled::GetDemangledName (m_mangled = %s)",
5149 m_mangled.GetCString());
5151 // Don't bother running anything that isn't mangled
5152 const char *mangled_cstr = m_mangled.GetCString();
5153 if (cstring_is_mangled(mangled_cstr))
5155 if (!m_mangled.GetMangledCounterpart(m_demangled))
5157 // We didn't already mangle this name, demangle it and if all goes well
5158 // add it to our map.
5159 #ifdef LLDB_USE_BUILTIN_DEMANGLER
5160 char *demangled_name = __cxa_demangle (mangled_cstr, NULL, NULL, NULL);
5161 #elif defined(_MSC_VER)
5162 // Cannot demangle on msvc.
5163 char *demangled_name = nullptr;
5165 char *demangled_name = abi::__cxa_demangle (mangled_cstr, NULL, NULL, NULL);
5170 m_demangled.SetCStringWithMangledCounterpart(demangled_name, m_mangled);
5171 free (demangled_name);
5177 // Set the demangled string to the empty string to indicate we
5178 // tried to parse it once and failed.
5179 m_demangled.SetCString("");
5188 Mangled::NameMatches (const RegularExpression& regex) const
5190 if (m_mangled && regex.Execute (m_mangled.AsCString()))
5193 if (GetDemangledName() && regex.Execute (m_demangled.AsCString()))
5198 //----------------------------------------------------------------------
5199 // Get the demangled name if there is one, else return the mangled name.
5200 //----------------------------------------------------------------------
5202 Mangled::GetName (Mangled::NamePreference preference) const
5204 if (preference == ePreferDemangled)
5206 // Call the accessor to make sure we get a demangled name in case
5207 // it hasn't been demangled yet...
5208 if (GetDemangledName())
5216 return GetDemangledName();
5220 //----------------------------------------------------------------------
5221 // Dump a Mangled object to stream "s". We don't force our
5222 // demangled name to be computed currently (we don't use the accessor).
5223 //----------------------------------------------------------------------
5225 Mangled::Dump (Stream *s) const
5229 *s << ", mangled = " << m_mangled;
5233 const char * demangled = m_demangled.AsCString();
5234 s->Printf(", demangled = %s", demangled[0] ? demangled : "<error>");
5238 //----------------------------------------------------------------------
5239 // Dumps a debug version of this string with extra object and state
5240 // information to stream "s".
5241 //----------------------------------------------------------------------
5243 Mangled::DumpDebug (Stream *s) const
5245 s->Printf("%*p: Mangled mangled = ", (int)sizeof(void*) * 2, this);
5246 m_mangled.DumpDebug(s);
5247 s->Printf(", demangled = ");
5248 m_demangled.DumpDebug(s);
5251 //----------------------------------------------------------------------
5252 // Return the size in byte that this object takes in memory. The size
5253 // includes the size of the objects it owns, and not the strings that
5254 // it references because they are shared strings.
5255 //----------------------------------------------------------------------
5257 Mangled::MemorySize () const
5259 return m_mangled.MemorySize() + m_demangled.MemorySize();
5262 //----------------------------------------------------------------------
5263 // Dump OBJ to the supplied stream S.
5264 //----------------------------------------------------------------------
5266 operator << (Stream& s, const Mangled& obj)
5268 if (obj.GetMangledName())
5269 s << "mangled = '" << obj.GetMangledName() << "'";
5271 const ConstString& demangled = obj.GetDemangledName();
5273 s << ", demangled = '" << demangled << '\'';
5275 s << ", demangled = <error>";