1 //===-------------------------- cxa_demangle.cpp --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #define _LIBCPP_EXTERN_TEMPLATE(...)
11 #define _LIBCPP_NO_EXCEPTIONS
37 const char* parse_type(const char* first, const char* last, C& db);
39 const char* parse_encoding(const char* first, const char* last, C& db);
41 const char* parse_name(const char* first, const char* last, C& db);
43 const char* parse_expression(const char* first, const char* last, C& db);
45 const char* parse_template_args(const char* first, const char* last, C& db);
47 const char* parse_operator_name(const char* first, const char* last, C& db);
49 const char* parse_unqualified_name(const char* first, const char* last, C& db);
51 const char* parse_decltype(const char* first, const char* last, C& db);
55 print_stack(const C& db)
57 printf("---------\n");
59 for (auto& s : db.names)
60 printf("{%s#%s}\n", s.first.c_str(), s.second.c_str());
63 for (auto& v : db.subs)
66 printf("S%i_ = {", i);
70 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
74 printf("template_param:\n");
75 for (auto& t : db.template_param)
82 printf("T%i_ = {", i);
86 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
91 printf("---------\n\n");
96 print_state(const char* msg, const char* first, const char* last, const C& db)
99 for (; first != last; ++first)
100 printf("%c", *first);
105 // <number> ::= [n] <non-negative decimal integer>
108 parse_number(const char* first, const char* last)
112 const char* t = first;
121 else if ('1' <= *t && *t <= '9')
124 while (first != last && std::isdigit(*first))
132 template <class Float>
136 struct float_data<float>
138 static const size_t mangled_size = 8;
139 static const size_t max_demangled_size = 24;
140 static constexpr const char* spec = "%af";
143 constexpr const char* float_data<float>::spec;
146 struct float_data<double>
148 static const size_t mangled_size = 16;
149 static const size_t max_demangled_size = 32;
150 static constexpr const char* spec = "%a";
153 constexpr const char* float_data<double>::spec;
156 struct float_data<long double>
158 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
159 static const size_t max_demangled_size = 40;
160 static constexpr const char* spec = "%LaL";
163 constexpr const char* float_data<long double>::spec;
165 template <class Float, class C>
167 parse_floating_number(const char* first, const char* last, C& db)
169 const size_t N = float_data<Float>::mangled_size;
170 if (static_cast<std::size_t>(last - first) > N)
176 char buf[sizeof(Float)];
178 const char* t = first;
180 for (; t != last; ++t, ++e)
184 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
185 static_cast<unsigned>(*t - 'a' + 10);
187 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
188 static_cast<unsigned>(*t - 'a' + 10);
189 *e = static_cast<char>((d1 << 4) + d0);
193 #if __LITTLE_ENDIAN__
194 std::reverse(buf, e);
196 char num[float_data<Float>::max_demangled_size] = {0};
197 int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
198 if (static_cast<std::size_t>(n) >= sizeof(num))
200 db.names.push_back(typename C::String(num, static_cast<std::size_t>(n)));
207 // <source-name> ::= <positive length number> <identifier>
211 parse_source_name(const char* first, const char* last, C& db)
216 if (isdigit(c) && first+1 != last)
218 const char* t = first+1;
219 size_t n = static_cast<size_t>(c - '0');
220 for (c = *t; isdigit(c); c = *t)
222 n = n * 10 + static_cast<size_t>(c - '0');
226 if (static_cast<size_t>(last - t) >= n)
228 typename C::String r(t, n);
229 if (r.substr(0, 10) == "_GLOBAL__N")
230 db.names.push_back("(anonymous namespace)");
232 db.names.push_back(std::move(r));
240 // <substitution> ::= S <seq-id> _
242 // <substitution> ::= Sa # ::std::allocator
243 // <substitution> ::= Sb # ::std::basic_string
244 // <substitution> ::= Ss # ::std::basic_string < char,
245 // ::std::char_traits<char>,
246 // ::std::allocator<char> >
247 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
248 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
249 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
253 parse_substitution(const char* first, const char* last, C& db)
255 if (last - first >= 2)
262 db.names.push_back("std::allocator");
266 db.names.push_back("std::basic_string");
270 db.names.push_back("std::string");
274 db.names.push_back("std::istream");
278 db.names.push_back("std::ostream");
282 db.names.push_back("std::iostream");
286 if (!db.subs.empty())
288 for (const auto& n : db.subs.front())
289 db.names.push_back(n);
294 if (std::isdigit(first[1]) || std::isupper(first[1]))
297 const char* t = first+1;
298 if (std::isdigit(*t))
299 sub = static_cast<size_t>(*t - '0');
301 sub = static_cast<size_t>(*t - 'A') + 10;
302 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
305 if (std::isdigit(*t))
306 sub += static_cast<size_t>(*t - '0');
308 sub += static_cast<size_t>(*t - 'A') + 10;
310 if (t == last || *t != '_')
313 if (sub < db.subs.size())
315 for (const auto& n : db.subs[sub])
316 db.names.push_back(n);
327 // <builtin-type> ::= v # void
331 // ::= a # signed char
332 // ::= h # unsigned char
334 // ::= t # unsigned short
336 // ::= j # unsigned int
338 // ::= m # unsigned long
339 // ::= x # long long, __int64
340 // ::= y # unsigned long long, __int64
342 // ::= o # unsigned __int128
345 // ::= e # long double, __float80
346 // ::= g # __float128
348 // ::= Dd # IEEE 754r decimal floating point (64 bits)
349 // ::= De # IEEE 754r decimal floating point (128 bits)
350 // ::= Df # IEEE 754r decimal floating point (32 bits)
351 // ::= Dh # IEEE 754r half-precision floating point (16 bits)
354 // ::= Da # auto (in dependent new-expressions)
355 // ::= Dc # decltype(auto)
356 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
357 // ::= u <source-name> # vendor extended type
361 parse_builtin_type(const char* first, const char* last, C& db)
368 db.names.push_back("void");
372 db.names.push_back("wchar_t");
376 db.names.push_back("bool");
380 db.names.push_back("char");
384 db.names.push_back("signed char");
388 db.names.push_back("unsigned char");
392 db.names.push_back("short");
396 db.names.push_back("unsigned short");
400 db.names.push_back("int");
404 db.names.push_back("unsigned int");
408 db.names.push_back("long");
412 db.names.push_back("unsigned long");
416 db.names.push_back("long long");
420 db.names.push_back("unsigned long long");
424 db.names.push_back("__int128");
428 db.names.push_back("unsigned __int128");
432 db.names.push_back("float");
436 db.names.push_back("double");
440 db.names.push_back("long double");
444 db.names.push_back("__float128");
448 db.names.push_back("...");
453 const char*t = parse_source_name(first+1, last, db);
464 db.names.push_back("decimal64");
468 db.names.push_back("decimal128");
472 db.names.push_back("decimal32");
476 db.names.push_back("decimal16");
480 db.names.push_back("char32_t");
484 db.names.push_back("char16_t");
488 db.names.push_back("auto");
492 db.names.push_back("decltype(auto)");
496 db.names.push_back("std::nullptr_t");
507 // <CV-qualifiers> ::= [r] [V] [K]
510 parse_cv_qualifiers(const char* first, const char* last, unsigned& cv)
534 // <template-param> ::= T_ # first template parameter
535 // ::= T <parameter-2 non-negative number> _
539 parse_template_param(const char* first, const char* last, C& db)
541 if (last - first >= 2)
547 if (db.template_param.empty())
549 if (!db.template_param.back().empty())
551 for (auto& t : db.template_param.back().front())
552 db.names.push_back(t);
557 db.names.push_back("T_");
559 db.fix_forward_references = true;
562 else if (isdigit(first[1]))
564 const char* t = first+1;
565 size_t sub = static_cast<size_t>(*t - '0');
566 for (++t; t != last && isdigit(*t); ++t)
569 sub += static_cast<size_t>(*t - '0');
571 if (t == last || *t != '_' || db.template_param.empty())
574 if (sub < db.template_param.back().size())
576 for (auto& temp : db.template_param.back()[sub])
577 db.names.push_back(temp);
582 db.names.push_back(typename C::String(first, t+1));
584 db.fix_forward_references = true;
592 // cc <type> <expression> # const_cast<type> (expression)
596 parse_const_cast_expr(const char* first, const char* last, C& db)
598 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
600 const char* t = parse_type(first+2, last, db);
603 const char* t1 = parse_expression(t, last, db);
606 if (db.names.size() < 2)
608 auto expr = db.names.back().move_full();
610 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
618 // dc <type> <expression> # dynamic_cast<type> (expression)
622 parse_dynamic_cast_expr(const char* first, const char* last, C& db)
624 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
626 const char* t = parse_type(first+2, last, db);
629 const char* t1 = parse_expression(t, last, db);
632 if (db.names.size() < 2)
634 auto expr = db.names.back().move_full();
636 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
644 // rc <type> <expression> # reinterpret_cast<type> (expression)
648 parse_reinterpret_cast_expr(const char* first, const char* last, C& db)
650 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
652 const char* t = parse_type(first+2, last, db);
655 const char* t1 = parse_expression(t, last, db);
658 if (db.names.size() < 2)
660 auto expr = db.names.back().move_full();
662 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
670 // sc <type> <expression> # static_cast<type> (expression)
674 parse_static_cast_expr(const char* first, const char* last, C& db)
676 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
678 const char* t = parse_type(first+2, last, db);
681 const char* t1 = parse_expression(t, last, db);
684 if (db.names.size() < 2)
686 auto expr = db.names.back().move_full();
688 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
696 // sp <expression> # pack expansion
700 parse_pack_expansion(const char* first, const char* last, C& db)
702 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
704 const char* t = parse_expression(first+2, last, db);
711 // st <type> # sizeof (a type)
715 parse_sizeof_type_expr(const char* first, const char* last, C& db)
717 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
719 const char* t = parse_type(first+2, last, db);
722 if (db.names.empty())
724 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
731 // sz <expr> # sizeof (a expression)
735 parse_sizeof_expr_expr(const char* first, const char* last, C& db)
737 if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
739 const char* t = parse_expression(first+2, last, db);
742 if (db.names.empty())
744 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
751 // sZ <template-param> # size of a parameter pack
755 parse_sizeof_param_pack_expr(const char* first, const char* last, C& db)
757 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
759 size_t k0 = db.names.size();
760 const char* t = parse_template_param(first+2, last, db);
761 size_t k1 = db.names.size();
764 typename C::String tmp("sizeof...(");
768 tmp += db.names[k].move_full();
769 for (++k; k != k1; ++k)
770 tmp += ", " + db.names[k].move_full();
773 for (; k1 != k0; --k1)
775 db.names.push_back(std::move(tmp));
782 // <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
783 // ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
784 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
785 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters
789 parse_function_param(const char* first, const char* last, C& db)
791 if (last - first >= 3 && *first == 'f')
796 const char* t = parse_cv_qualifiers(first+2, last, cv);
797 const char* t1 = parse_number(t, last);
798 if (t1 != last && *t1 == '_')
800 db.names.push_back("fp" + typename C::String(t, t1));
804 else if (first[1] == 'L')
807 const char* t0 = parse_number(first+2, last);
808 if (t0 != last && *t0 == 'p')
811 const char* t = parse_cv_qualifiers(t0, last, cv);
812 const char* t1 = parse_number(t, last);
813 if (t1 != last && *t1 == '_')
815 db.names.push_back("fp" + typename C::String(t, t1));
824 // sZ <function-param> # size of a function parameter pack
828 parse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db)
830 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
832 const char* t = parse_function_param(first+2, last, db);
835 if (db.names.empty())
837 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
844 // te <expression> # typeid (expression)
845 // ti <type> # typeid (type)
849 parse_typeid_expr(const char* first, const char* last, C& db)
851 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
855 t = parse_expression(first+2, last, db);
857 t = parse_type(first+2, last, db);
860 if (db.names.empty())
862 db.names.back() = "typeid(" + db.names.back().move_full() + ")";
869 // tw <expression> # throw expression
873 parse_throw_expr(const char* first, const char* last, C& db)
875 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
877 const char* t = parse_expression(first+2, last, db);
880 if (db.names.empty())
882 db.names.back() = "throw " + db.names.back().move_full();
889 // ds <expression> <expression> # expr.*expr
893 parse_dot_star_expr(const char* first, const char* last, C& db)
895 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
897 const char* t = parse_expression(first+2, last, db);
900 const char* t1 = parse_expression(t, last, db);
903 if (db.names.size() < 2)
905 auto expr = db.names.back().move_full();
907 db.names.back().first += ".*" + expr;
915 // <simple-id> ::= <source-name> [ <template-args> ]
919 parse_simple_id(const char* first, const char* last, C& db)
923 const char* t = parse_source_name(first, last, db);
926 const char* t1 = parse_template_args(t, last, db);
929 if (db.names.size() < 2)
931 auto args = db.names.back().move_full();
933 db.names.back().first += std::move(args);
943 // <unresolved-type> ::= <template-param>
945 // ::= <substitution>
949 parse_unresolved_type(const char* first, const char* last, C& db)
953 const char* t = first;
958 size_t k0 = db.names.size();
959 t = parse_template_param(first, last, db);
960 size_t k1 = db.names.size();
961 if (t != first && k1 == k0 + 1)
963 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
968 for (; k1 != k0; --k1)
974 t = parse_decltype(first, last, db);
977 if (db.names.empty())
979 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
984 t = parse_substitution(first, last, db);
989 if (last - first > 2 && first[1] == 't')
991 t = parse_unqualified_name(first+2, last, db);
994 if (db.names.empty())
996 db.names.back().first.insert(0, "std::");
997 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1008 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
1009 // ::= <simple-id> # e.g., ~A<2*N>
1013 parse_destructor_name(const char* first, const char* last, C& db)
1017 const char* t = parse_unresolved_type(first, last, db);
1019 t = parse_simple_id(first, last, db);
1022 if (db.names.empty())
1024 db.names.back().first.insert(0, "~");
1031 // <base-unresolved-name> ::= <simple-id> # unresolved name
1032 // extension ::= <operator-name> # unresolved operator-function-id
1033 // extension ::= <operator-name> <template-args> # unresolved operator template-id
1034 // ::= on <operator-name> # unresolved operator-function-id
1035 // ::= on <operator-name> <template-args> # unresolved operator template-id
1036 // ::= dn <destructor-name> # destructor or pseudo-destructor;
1037 // # e.g. ~X or ~X<N-1>
1041 parse_base_unresolved_name(const char* first, const char* last, C& db)
1043 if (last - first >= 2)
1045 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
1047 if (first[0] == 'o')
1049 const char* t = parse_operator_name(first+2, last, db);
1052 first = parse_template_args(t, last, db);
1055 if (db.names.size() < 2)
1057 auto args = db.names.back().move_full();
1058 db.names.pop_back();
1059 db.names.back().first += std::move(args);
1065 const char* t = parse_destructor_name(first+2, last, db);
1072 const char* t = parse_simple_id(first, last, db);
1075 t = parse_operator_name(first, last, db);
1078 first = parse_template_args(t, last, db);
1081 if (db.names.size() < 2)
1083 auto args = db.names.back().move_full();
1084 db.names.pop_back();
1085 db.names.back().first += std::move(args);
1096 // <unresolved-qualifier-level> ::= <simple-id>
1100 parse_unresolved_qualifier_level(const char* first, const char* last, C& db)
1102 return parse_simple_id(first, last, db);
1105 // <unresolved-name>
1106 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
1107 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
1108 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
1109 // # A::x, N::y, A<T>::z; "gs" means leading "::"
1110 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
1111 // extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
1112 // # T::N::x /decltype(p)::N::x
1113 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
1117 parse_unresolved_name(const char* first, const char* last, C& db)
1119 if (last - first > 2)
1121 const char* t = first;
1122 bool global = false;
1123 if (t[0] == 'g' && t[1] == 's')
1128 const char* t2 = parse_base_unresolved_name(t, last, db);
1133 if (db.names.empty())
1135 db.names.back().first.insert(0, "::");
1139 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
1144 const char* t1 = parse_unresolved_type(t, last, db);
1145 if (t1 == t || t1 == last)
1148 t1 = parse_template_args(t, last, db);
1151 if (db.names.size() < 2)
1153 auto args = db.names.back().move_full();
1154 db.names.pop_back();
1155 db.names.back().first += std::move(args);
1159 db.names.pop_back();
1165 t1 = parse_unresolved_qualifier_level(t, last, db);
1166 if (t1 == t || t1 == last || db.names.size() < 2)
1168 auto s = db.names.back().move_full();
1169 db.names.pop_back();
1170 db.names.back().first += "::" + std::move(s);
1174 t1 = parse_base_unresolved_name(t, last, db);
1177 if (!db.names.empty())
1178 db.names.pop_back();
1181 if (db.names.size() < 2)
1183 auto s = db.names.back().move_full();
1184 db.names.pop_back();
1185 db.names.back().first += "::" + std::move(s);
1191 const char* t1 = parse_unresolved_type(t, last, db);
1195 t1 = parse_template_args(t, last, db);
1198 if (db.names.size() < 2)
1200 auto args = db.names.back().move_full();
1201 db.names.pop_back();
1202 db.names.back().first += std::move(args);
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);
1221 t1 = parse_unresolved_qualifier_level(t, last, db);
1222 if (t1 == t || t1 == last)
1227 if (db.names.empty())
1229 db.names.back().first.insert(0, "::");
1233 t1 = parse_unresolved_qualifier_level(t, last, db);
1234 if (t1 == t || t1 == last || db.names.size() < 2)
1236 auto s = db.names.back().move_full();
1237 db.names.pop_back();
1238 db.names.back().first += "::" + std::move(s);
1242 t1 = parse_base_unresolved_name(t, last, db);
1245 if (!db.names.empty())
1246 db.names.pop_back();
1249 if (db.names.size() < 2)
1251 auto s = db.names.back().move_full();
1252 db.names.pop_back();
1253 db.names.back().first += "::" + std::move(s);
1262 // dt <expression> <unresolved-name> # expr.name
1266 parse_dot_expr(const char* first, const char* last, C& db)
1268 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
1270 const char* t = parse_expression(first+2, last, db);
1273 const char* t1 = parse_unresolved_name(t, last, db);
1276 if (db.names.size() < 2)
1278 auto name = db.names.back().move_full();
1279 db.names.pop_back();
1280 db.names.back().first += "." + name;
1288 // cl <expression>+ E # call
1292 parse_call_expr(const char* first, const char* last, C& db)
1294 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
1296 const char* t = parse_expression(first+2, last, db);
1301 if (db.names.empty())
1303 db.names.back().first += db.names.back().second;
1304 db.names.back().second = typename C::String();
1305 db.names.back().first.append("(");
1306 bool first_expr = true;
1309 const char* t1 = parse_expression(t, last, db);
1310 if (t1 == t || t1 == last)
1312 if (db.names.empty())
1314 auto tmp = db.names.back().move_full();
1315 db.names.pop_back();
1318 if (db.names.empty())
1322 db.names.back().first.append(", ");
1325 db.names.back().first.append(tmp);
1330 if (db.names.empty())
1332 db.names.back().first.append(")");
1339 // [gs] nw <expression>* _ <type> E # new (expr-list) type
1340 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
1341 // [gs] na <expression>* _ <type> E # new[] (expr-list) type
1342 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
1343 // <initializer> ::= pi <expression>* E # parenthesized initialization
1347 parse_new_expr(const char* first, const char* last, C& db)
1349 if (last - first >= 4)
1351 const char* t = first;
1352 bool parsed_gs = false;
1353 if (t[0] == 'g' && t[1] == 's')
1358 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
1360 bool is_array = t[1] == 'a';
1364 bool has_expr_list = false;
1365 bool first_expr = true;
1368 const char* t1 = parse_expression(t, last, db);
1369 if (t1 == t || t1 == last)
1371 has_expr_list = true;
1374 if (db.names.empty())
1376 auto tmp = db.names.back().move_full();
1377 db.names.pop_back();
1380 if (db.names.empty())
1382 db.names.back().first.append(", ");
1383 db.names.back().first.append(tmp);
1390 const char* t1 = parse_type(t, last, db);
1391 if (t1 == t || t1 == last)
1394 bool has_init = false;
1395 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
1402 t1 = parse_expression(t, last, db);
1403 if (t1 == t || t1 == last)
1407 if (db.names.empty())
1409 auto tmp = db.names.back().move_full();
1410 db.names.pop_back();
1413 if (db.names.empty())
1415 db.names.back().first.append(", ");
1416 db.names.back().first.append(tmp);
1425 typename C::String init_list;
1428 if (db.names.empty())
1430 init_list = db.names.back().move_full();
1431 db.names.pop_back();
1433 if (db.names.empty())
1435 auto type = db.names.back().move_full();
1436 db.names.pop_back();
1437 typename C::String expr_list;
1440 if (db.names.empty())
1442 expr_list = db.names.back().move_full();
1443 db.names.pop_back();
1445 typename C::String r;
1453 r += "(" + expr_list + ") ";
1456 r += " (" + init_list + ")";
1457 db.names.push_back(std::move(r));
1464 // cv <type> <expression> # conversion with one argument
1465 // cv <type> _ <expression>* E # conversion with a different number of arguments
1469 parse_conversion_expr(const char* first, const char* last, C& db)
1471 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
1473 bool try_to_parse_template_args = db.try_to_parse_template_args;
1474 db.try_to_parse_template_args = false;
1475 const char* t = parse_type(first+2, last, db);
1476 db.try_to_parse_template_args = try_to_parse_template_args;
1477 if (t != first+2 && t != last)
1481 const char* t1 = parse_expression(t, last, db);
1492 db.names.emplace_back();
1495 bool first_expr = true;
1498 const char* t1 = parse_expression(t, last, db);
1499 if (t1 == t || t1 == last)
1503 if (db.names.empty())
1505 auto tmp = db.names.back().move_full();
1506 db.names.pop_back();
1509 if (db.names.empty())
1511 db.names.back().first.append(", ");
1512 db.names.back().first.append(tmp);
1521 if (db.names.size() < 2)
1523 auto tmp = db.names.back().move_full();
1524 db.names.pop_back();
1525 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
1532 // pt <expression> <expression> # expr->name
1536 parse_arrow_expr(const char* first, const char* last, C& db)
1538 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
1540 const char* t = parse_expression(first+2, last, db);
1543 const char* t1 = parse_expression(t, last, db);
1546 if (db.names.size() < 2)
1548 auto tmp = db.names.back().move_full();
1549 db.names.pop_back();
1550 db.names.back().first += "->";
1551 db.names.back().first += tmp;
1559 // <ref-qualifier> ::= R # & ref-qualifier
1560 // <ref-qualifier> ::= O # && ref-qualifier
1562 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
1566 parse_function_type(const char* first, const char* last, C& db)
1568 if (first != last && *first == 'F')
1570 const char* t = first+1;
1573 bool externC = false;
1580 const char* t1 = parse_type(t, last, db);
1584 typename C::String sig("(");
1590 db.names.pop_back();
1603 if (*t == 'R' && t+1 != last && t[1] == 'E')
1609 if (*t == 'O' && t+1 != last && t[1] == 'E')
1615 size_t k0 = db.names.size();
1616 t1 = parse_type(t, last, db);
1617 size_t k1 = db.names.size();
1618 if (t1 == t || t1 == last)
1620 for (size_t k = k0; k < k1; ++k)
1624 sig += db.names[k].move_full();
1626 for (size_t k = k0; k < k1; ++k)
1627 db.names.pop_back();
1640 if (db.names.empty())
1642 db.names.back().first += " ";
1643 db.names.back().second.insert(0, sig);
1651 // <pointer-to-member-type> ::= M <class type> <member type>
1655 parse_pointer_to_member_type(const char* first, const char* last, C& db)
1657 if (first != last && *first == 'M')
1659 const char* t = parse_type(first+1, last, db);
1662 const char* t2 = parse_type(t, last, db);
1665 if (db.names.size() < 2)
1667 auto func = std::move(db.names.back());
1668 db.names.pop_back();
1669 auto class_type = std::move(db.names.back());
1670 if (func.second.front() == '(')
1672 db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*";
1673 db.names.back().second = ")" + std::move(func.second);
1677 db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*";
1678 db.names.back().second = std::move(func.second);
1687 // <array-type> ::= A <positive dimension number> _ <element type>
1688 // ::= A [<dimension expression>] _ <element type>
1692 parse_array_type(const char* first, const char* last, C& db)
1694 if (first != last && *first == 'A' && first+1 != last)
1696 if (first[1] == '_')
1698 const char* t = parse_type(first+2, last, db);
1701 if (db.names.empty())
1703 if (db.names.back().second.substr(0, 2) == " [")
1704 db.names.back().second.erase(0, 1);
1705 db.names.back().second.insert(0, " []");
1709 else if ('1' <= first[1] && first[1] <= '9')
1711 const char* t = parse_number(first+1, last);
1712 if (t != last && *t == '_')
1714 const char* t2 = parse_type(t+1, last, db);
1717 if (db.names.empty())
1719 if (db.names.back().second.substr(0, 2) == " [")
1720 db.names.back().second.erase(0, 1);
1721 db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]");
1728 const char* t = parse_expression(first+1, last, db);
1729 if (t != first+1 && t != last && *t == '_')
1731 const char* t2 = parse_type(++t, last, db);
1734 if (db.names.size() < 2)
1736 auto type = std::move(db.names.back());
1737 db.names.pop_back();
1738 auto expr = std::move(db.names.back());
1739 db.names.back().first = std::move(type.first);
1740 if (type.second.substr(0, 2) == " [")
1741 type.second.erase(0, 1);
1742 db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second);
1751 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
1752 // ::= DT <expression> E # decltype of an expression (C++0x)
1756 parse_decltype(const char* first, const char* last, C& db)
1758 if (last - first >= 4 && first[0] == 'D')
1765 const char* t = parse_expression(first+2, last, db);
1766 if (t != first+2 && t != last && *t == 'E')
1768 if (db.names.empty())
1770 db.names.back() = "decltype(" + db.names.back().move_full() + ")";
1781 // <vector-type> ::= Dv <positive dimension number> _
1782 // <extended element type>
1783 // ::= Dv [<dimension expression>] _ <element type>
1784 // <extended element type> ::= <element type>
1785 // ::= p # AltiVec vector pixel
1789 parse_vector_type(const char* first, const char* last, C& db)
1791 if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
1793 if ('1' <= first[2] && first[2] <= '9')
1795 const char* t = parse_number(first+2, last);
1796 if (t == last || *t != '_')
1798 const char* num = first + 2;
1799 size_t sz = static_cast<size_t>(t - num);
1804 const char* t1 = parse_type(t, last, db);
1807 if (db.names.empty())
1809 db.names.back().first += " vector[" + typename C::String(num, sz) + "]";
1816 db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]");
1823 typename C::String num;
1824 const char* t1 = first+2;
1827 const char* t = parse_expression(t1, last, db);
1830 if (db.names.empty())
1832 num = db.names.back().move_full();
1833 db.names.pop_back();
1837 if (t1 != last && *t1 == '_' && ++t1 != last)
1839 const char* t = parse_type(t1, last, db);
1842 if (db.names.empty())
1844 db.names.back().first += " vector[" + num + "]";
1853 // <type> ::= <builtin-type>
1854 // ::= <function-type>
1855 // ::= <class-enum-type>
1857 // ::= <pointer-to-member-type>
1858 // ::= <template-param>
1859 // ::= <template-template-param> <template-args>
1861 // ::= <substitution>
1862 // ::= <CV-qualifiers> <type>
1863 // ::= P <type> # pointer-to
1864 // ::= R <type> # reference-to
1865 // ::= O <type> # rvalue reference-to (C++0x)
1866 // ::= C <type> # complex pair (C 2000)
1867 // ::= G <type> # imaginary (C 2000)
1868 // ::= Dp <type> # pack expansion (C++0x)
1869 // ::= U <source-name> <type> # vendor extended type qualifier
1870 // extension := U <objc-name> <objc-type> # objc-type<identifier>
1871 // extension := <vector-type> # <vector-type> starts with Dv
1873 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
1874 // <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
1878 parse_type(const char* first, const char* last, C& db)
1889 const char* t = parse_cv_qualifiers(first, last, cv);
1892 bool is_function = *t == 'F';
1893 size_t k0 = db.names.size();
1894 const char* t1 = parse_type(t, last, db);
1895 size_t k1 = db.names.size();
1900 db.subs.emplace_back(db.names.get_allocator());
1901 for (size_t k = k0; k < k1; ++k)
1905 size_t p = db.names[k].second.size();
1906 if (db.names[k].second[p-2] == '&')
1908 else if (db.names[k].second.back() == '&')
1912 db.names[k].second.insert(p, " const");
1917 db.names[k].second.insert(p, " volatile");
1921 db.names[k].second.insert(p, " restrict");
1926 db.names[k].first.append(" const");
1928 db.names[k].first.append(" volatile");
1930 db.names[k].first.append(" restrict");
1932 db.subs.back().push_back(db.names[k]);
1941 const char* t = parse_builtin_type(first, last, db);
1951 t = parse_array_type(first, last, db);
1954 if (db.names.empty())
1957 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1961 t = parse_type(first+1, last, db);
1964 if (db.names.empty())
1966 db.names.back().first.append(" complex");
1968 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1972 t = parse_function_type(first, last, db);
1975 if (db.names.empty())
1978 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1982 t = parse_type(first+1, last, db);
1985 if (db.names.empty())
1987 db.names.back().first.append(" imaginary");
1989 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1993 t = parse_pointer_to_member_type(first, last, db);
1996 if (db.names.empty())
1999 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2004 size_t k0 = db.names.size();
2005 t = parse_type(first+1, last, db);
2006 size_t k1 = db.names.size();
2009 db.subs.emplace_back(db.names.get_allocator());
2010 for (size_t k = k0; k < k1; ++k)
2012 if (db.names[k].second.substr(0, 2) == " [")
2014 db.names[k].first += " (";
2015 db.names[k].second.insert(0, ")");
2017 else if (db.names[k].second.front() == '(')
2019 db.names[k].first += "(";
2020 db.names[k].second.insert(0, ")");
2022 db.names[k].first.append("&&");
2023 db.subs.back().push_back(db.names[k]);
2031 size_t k0 = db.names.size();
2032 t = parse_type(first+1, last, db);
2033 size_t k1 = db.names.size();
2036 db.subs.emplace_back(db.names.get_allocator());
2037 for (size_t k = k0; k < k1; ++k)
2039 if (db.names[k].second.substr(0, 2) == " [")
2041 db.names[k].first += " (";
2042 db.names[k].second.insert(0, ")");
2044 else if (db.names[k].second.front() == '(')
2046 db.names[k].first += "(";
2047 db.names[k].second.insert(0, ")");
2049 if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
2051 db.names[k].first.append("*");
2055 db.names[k].first.replace(0, 11, "id");
2057 db.subs.back().push_back(db.names[k]);
2065 size_t k0 = db.names.size();
2066 t = parse_type(first+1, last, db);
2067 size_t k1 = db.names.size();
2070 db.subs.emplace_back(db.names.get_allocator());
2071 for (size_t k = k0; k < k1; ++k)
2073 if (db.names[k].second.substr(0, 2) == " [")
2075 db.names[k].first += " (";
2076 db.names[k].second.insert(0, ")");
2078 else if (db.names[k].second.front() == '(')
2080 db.names[k].first += "(";
2081 db.names[k].second.insert(0, ")");
2083 db.names[k].first.append("&");
2084 db.subs.back().push_back(db.names[k]);
2092 size_t k0 = db.names.size();
2093 t = parse_template_param(first, last, db);
2094 size_t k1 = db.names.size();
2097 db.subs.emplace_back(db.names.get_allocator());
2098 for (size_t k = k0; k < k1; ++k)
2099 db.subs.back().push_back(db.names[k]);
2100 if (db.try_to_parse_template_args && k1 == k0+1)
2102 const char* t1 = parse_template_args(t, last, db);
2105 auto args = db.names.back().move_full();
2106 db.names.pop_back();
2107 db.names.back().first += std::move(args);
2108 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2117 if (first+1 != last)
2119 t = parse_source_name(first+1, last, db);
2122 const char* t2 = parse_type(t, last, db);
2125 if (db.names.size() < 2)
2127 auto type = db.names.back().move_full();
2128 db.names.pop_back();
2129 if (db.names.back().first.substr(0, 9) != "objcproto")
2131 db.names.back() = type + " " + db.names.back().move_full();
2135 auto proto = db.names.back().move_full();
2136 db.names.pop_back();
2137 t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2138 if (t != proto.data() + 9)
2140 db.names.back() = type + "<" + db.names.back().move_full() + ">";
2144 db.names.push_back(type + " " + proto);
2147 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2154 if (first+1 != last && first[1] == 't')
2156 t = parse_name(first, last, db);
2159 if (db.names.empty())
2161 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2167 t = parse_substitution(first, last, db);
2171 // Parsed a substitution. If the substitution is a
2172 // <template-param> it might be followed by <template-args>.
2173 t = parse_template_args(first, last, db);
2176 if (db.names.size() < 2)
2178 auto template_args = db.names.back().move_full();
2179 db.names.pop_back();
2180 db.names.back().first += template_args;
2181 // Need to create substitution for <template-template-param> <template-args>
2182 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2189 if (first+1 != last)
2195 size_t k0 = db.names.size();
2196 t = parse_type(first+2, last, db);
2197 size_t k1 = db.names.size();
2200 db.subs.emplace_back(db.names.get_allocator());
2201 for (size_t k = k0; k < k1; ++k)
2202 db.subs.back().push_back(db.names[k]);
2210 t = parse_decltype(first, last, db);
2213 if (db.names.empty())
2215 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2221 t = parse_vector_type(first, last, db);
2224 if (db.names.empty())
2226 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2235 // must check for builtin-types before class-enum-types to avoid
2236 // ambiguities with operator-names
2237 t = parse_builtin_type(first, last, db);
2244 t = parse_name(first, last, db);
2247 if (db.names.empty())
2249 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2265 // ::= ad # & (unary)
2272 // ::= cv <type> # (cast)
2273 // ::= da # delete[]
2274 // ::= de # * (unary)
2285 // ::= li <source-name> # operator ""
2293 // ::= mm # -- (postfix in <expression> context)
2296 // ::= ng # - (unary)
2305 // ::= pp # ++ (postfix in <expression> context)
2306 // ::= ps # + (unary)
2313 // ::= v <digit> <source-name> # vendor extended operator
2317 parse_operator_name(const char* first, const char* last, C& db)
2319 if (last - first >= 2)
2327 db.names.push_back("operator&&");
2332 db.names.push_back("operator&");
2336 db.names.push_back("operator&=");
2340 db.names.push_back("operator=");
2349 db.names.push_back("operator()");
2353 db.names.push_back("operator,");
2357 db.names.push_back("operator~");
2362 bool try_to_parse_template_args = db.try_to_parse_template_args;
2363 db.try_to_parse_template_args = false;
2364 const char* t = parse_type(first+2, last, db);
2365 db.try_to_parse_template_args = try_to_parse_template_args;
2368 if (db.names.empty())
2370 db.names.back().first.insert(0, "operator ");
2371 db.parsed_ctor_dtor_cv = true;
2382 db.names.push_back("operator delete[]");
2386 db.names.push_back("operator*");
2390 db.names.push_back("operator delete");
2394 db.names.push_back("operator/");
2398 db.names.push_back("operator/=");
2407 db.names.push_back("operator^");
2411 db.names.push_back("operator^=");
2415 db.names.push_back("operator==");
2424 db.names.push_back("operator>=");
2428 db.names.push_back("operator>");
2434 if (first[1] == 'x')
2436 db.names.push_back("operator[]");
2444 db.names.push_back("operator<=");
2449 const char* t = parse_source_name(first+2, last, db);
2452 if (db.names.empty())
2454 db.names.back().first.insert(0, "operator\"\" ");
2460 db.names.push_back("operator<<");
2464 db.names.push_back("operator<<=");
2468 db.names.push_back("operator<");
2477 db.names.push_back("operator-");
2481 db.names.push_back("operator-=");
2485 db.names.push_back("operator*");
2489 db.names.push_back("operator*=");
2493 db.names.push_back("operator--");
2502 db.names.push_back("operator new[]");
2506 db.names.push_back("operator!=");
2510 db.names.push_back("operator-");
2514 db.names.push_back("operator!");
2518 db.names.push_back("operator new");
2527 db.names.push_back("operator||");
2531 db.names.push_back("operator|");
2535 db.names.push_back("operator|=");
2544 db.names.push_back("operator->*");
2548 db.names.push_back("operator+");
2552 db.names.push_back("operator+=");
2556 db.names.push_back("operator++");
2560 db.names.push_back("operator+");
2564 db.names.push_back("operator->");
2570 if (first[1] == 'u')
2572 db.names.push_back("operator?");
2580 db.names.push_back("operator%");
2584 db.names.push_back("operator%=");
2588 db.names.push_back("operator>>");
2592 db.names.push_back("operator>>=");
2598 if (std::isdigit(first[1]))
2600 const char* t = parse_source_name(first+2, last, db);
2603 if (db.names.empty())
2605 db.names.back().first.insert(0, "operator ");
2617 parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db)
2619 const char* t = parse_number(first, last);
2620 if (t != first && t != last && *t == 'E')
2623 db.names.push_back("(" + lit + ")");
2625 db.names.emplace_back();
2628 db.names.back().first += '-';
2631 db.names.back().first.append(first, t);
2632 if (lit.size() <= 3)
2633 db.names.back().first += lit;
2639 // <expr-primary> ::= L <type> <value number> E # integer literal
2640 // ::= L <type> <value float> E # floating literal
2641 // ::= L <string type> E # string literal
2642 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
2643 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
2644 // ::= L <mangled-name> E # external name
2648 parse_expr_primary(const char* first, const char* last, C& db)
2650 if (last - first >= 4 && *first == 'L')
2656 const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
2662 if (first[3] == 'E')
2667 db.names.push_back("false");
2671 db.names.push_back("true");
2679 const char* t = parse_integer_literal(first+2, last, "char", db);
2686 const char* t = parse_integer_literal(first+2, last, "signed char", db);
2693 const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
2700 const char* t = parse_integer_literal(first+2, last, "short", db);
2707 const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
2714 const char* t = parse_integer_literal(first+2, last, "", db);
2721 const char* t = parse_integer_literal(first+2, last, "u", db);
2728 const char* t = parse_integer_literal(first+2, last, "l", db);
2735 const char* t = parse_integer_literal(first+2, last, "ul", db);
2742 const char* t = parse_integer_literal(first+2, last, "ll", db);
2749 const char* t = parse_integer_literal(first+2, last, "ull", db);
2756 const char* t = parse_integer_literal(first+2, last, "__int128", db);
2763 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
2770 const char* t = parse_floating_number<float>(first+2, last, db);
2777 const char* t = parse_floating_number<double>(first+2, last, db);
2784 const char* t = parse_floating_number<long double>(first+2, last, db);
2790 if (first[2] == 'Z')
2792 const char* t = parse_encoding(first+3, last, db);
2793 if (t != first+3 && t != last && *t == 'E')
2798 // Invalid mangled name per
2799 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2803 // might be named type
2804 const char* t = parse_type(first+1, last, db);
2805 if (t != first+1 && t != last)
2810 for (; n != last && isdigit(*n); ++n)
2812 if (n != t && n != last && *n == 'E')
2814 if (db.names.empty())
2816 db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
2833 template <class String>
2835 base_name(String& s)
2839 if (s == "std::string")
2841 s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2842 return "basic_string";
2844 if (s == "std::istream")
2846 s = "std::basic_istream<char, std::char_traits<char> >";
2847 return "basic_istream";
2849 if (s == "std::ostream")
2851 s = "std::basic_ostream<char, std::char_traits<char> >";
2852 return "basic_ostream";
2854 if (s == "std::iostream")
2856 s = "std::basic_iostream<char, std::char_traits<char> >";
2857 return "basic_iostream";
2859 const char* const pf = s.data();
2860 const char* pe = pf + s.size();
2876 else if (pe[-1] == '>')
2880 const char* p0 = pe - 1;
2881 for (; p0 != pf; --p0)
2889 return String(p0, pe);
2892 // <ctor-dtor-name> ::= C1 # complete object constructor
2893 // ::= C2 # base object constructor
2894 // ::= C3 # complete object allocating constructor
2895 // extension ::= C5 # ?
2896 // ::= D0 # deleting destructor
2897 // ::= D1 # complete object destructor
2898 // ::= D2 # base object destructor
2899 // extension ::= D5 # ?
2903 parse_ctor_dtor_name(const char* first, const char* last, C& db)
2905 if (last-first >= 2 && !db.names.empty())
2916 if (db.names.empty())
2918 db.names.push_back(base_name(db.names.back().first));
2920 db.parsed_ctor_dtor_cv = true;
2931 if (db.names.empty())
2933 db.names.push_back("~" + base_name(db.names.back().first));
2935 db.parsed_ctor_dtor_cv = true;
2944 // <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2945 // ::= <closure-type-name>
2947 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2949 // <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2953 parse_unnamed_type_name(const char* first, const char* last, C& db)
2955 if (last - first > 2 && first[0] == 'U')
2957 char type = first[1];
2962 db.names.push_back(typename C::String("'unnamed"));
2963 const char* t0 = first+2;
2966 db.names.pop_back();
2969 if (std::isdigit(*t0))
2971 const char* t1 = t0 + 1;
2972 while (t1 != last && std::isdigit(*t1))
2974 db.names.back().first.append(t0, t1);
2977 db.names.back().first.push_back('\'');
2978 if (t0 == last || *t0 != '_')
2980 db.names.pop_back();
2988 db.names.push_back(typename C::String("'lambda'("));
2989 const char* t0 = first+2;
2990 if (first[2] == 'v')
2992 db.names.back().first += ')';
2997 const char* t1 = parse_type(t0, last, db);
3000 db.names.pop_back();
3003 if (db.names.size() < 2)
3005 auto tmp = db.names.back().move_full();
3006 db.names.pop_back();
3007 db.names.back().first.append(tmp);
3011 t1 = parse_type(t0, last, db);
3014 if (db.names.size() < 2)
3016 tmp = db.names.back().move_full();
3017 db.names.pop_back();
3020 db.names.back().first.append(", ");
3021 db.names.back().first.append(tmp);
3025 db.names.back().first.append(")");
3027 if (t0 == last || *t0 != 'E')
3029 db.names.pop_back();
3035 db.names.pop_back();
3038 if (std::isdigit(*t0))
3040 const char* t1 = t0 + 1;
3041 while (t1 != last && std::isdigit(*t1))
3043 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
3046 if (t0 == last || *t0 != '_')
3048 db.names.pop_back();
3059 // <unqualified-name> ::= <operator-name>
3060 // ::= <ctor-dtor-name>
3061 // ::= <source-name>
3062 // ::= <unnamed-type-name>
3066 parse_unqualified_name(const char* first, const char* last, C& db)
3075 t = parse_ctor_dtor_name(first, last, db);
3080 t = parse_unnamed_type_name(first, last, db);
3093 t = parse_source_name(first, last, db);
3098 t = parse_operator_name(first, last, db);
3107 // <unscoped-name> ::= <unqualified-name>
3108 // ::= St <unqualified-name> # ::std::
3109 // extension ::= StL<unqualified-name>
3113 parse_unscoped_name(const char* first, const char* last, C& db)
3115 if (last - first >= 2)
3117 const char* t0 = first;
3119 if (first[0] == 'S' && first[1] == 't')
3123 if (t0 != last && *t0 == 'L')
3126 const char* t1 = parse_unqualified_name(t0, last, db);
3131 if (db.names.empty())
3133 db.names.back().first.insert(0, "std::");
3141 // at <type> # alignof (a type)
3145 parse_alignof_type(const char* first, const char* last, C& db)
3147 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
3149 const char* t = parse_type(first+2, last, db);
3152 if (db.names.empty())
3154 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3161 // az <expression> # alignof (a expression)
3165 parse_alignof_expr(const char* first, const char* last, C& db)
3167 if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
3169 const char* t = parse_expression(first+2, last, db);
3172 if (db.names.empty())
3174 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3183 parse_noexcept_expression(const char* first, const char* last, C& db)
3185 const char* t1 = parse_expression(first, last, db);
3188 if (db.names.empty())
3190 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
3198 parse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db)
3200 const char* t1 = parse_expression(first, last, db);
3203 if (db.names.empty())
3205 db.names.back().first = op + "(" + db.names.back().move_full() + ")";
3213 parse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db)
3215 const char* t1 = parse_expression(first, last, db);
3218 const char* t2 = parse_expression(t1, last, db);
3221 if (db.names.size() < 2)
3223 auto op2 = db.names.back().move_full();
3224 db.names.pop_back();
3225 auto op1 = db.names.back().move_full();
3226 auto& nm = db.names.back().first;
3230 nm += "(" + op1 + ") " + op + " (" + op2 + ")";
3236 db.names.pop_back();
3241 // <expression> ::= <unary operator-name> <expression>
3242 // ::= <binary operator-name> <expression> <expression>
3243 // ::= <ternary operator-name> <expression> <expression> <expression>
3244 // ::= cl <expression>+ E # call
3245 // ::= cv <type> <expression> # conversion with one argument
3246 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments
3247 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
3248 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3249 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
3250 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3251 // ::= [gs] dl <expression> # delete expression
3252 // ::= [gs] da <expression> # delete[] expression
3253 // ::= pp_ <expression> # prefix ++
3254 // ::= mm_ <expression> # prefix --
3255 // ::= ti <type> # typeid (type)
3256 // ::= te <expression> # typeid (expression)
3257 // ::= dc <type> <expression> # dynamic_cast<type> (expression)
3258 // ::= sc <type> <expression> # static_cast<type> (expression)
3259 // ::= cc <type> <expression> # const_cast<type> (expression)
3260 // ::= rc <type> <expression> # reinterpret_cast<type> (expression)
3261 // ::= st <type> # sizeof (a type)
3262 // ::= sz <expression> # sizeof (an expression)
3263 // ::= at <type> # alignof (a type)
3264 // ::= az <expression> # alignof (an expression)
3265 // ::= nx <expression> # noexcept (expression)
3266 // ::= <template-param>
3267 // ::= <function-param>
3268 // ::= dt <expression> <unresolved-name> # expr.name
3269 // ::= pt <expression> <unresolved-name> # expr->name
3270 // ::= ds <expression> <expression> # expr.*expr
3271 // ::= sZ <template-param> # size of a parameter pack
3272 // ::= sZ <function-param> # size of a function parameter pack
3273 // ::= sp <expression> # pack expansion
3274 // ::= tw <expression> # throw expression
3275 // ::= tr # throw with no operand (rethrow)
3276 // ::= <unresolved-name> # f(p), N::f(p), ::f(p),
3277 // # freestanding dependent name (e.g., T::x),
3278 // # objectless nonstatic member reference
3279 // ::= <expr-primary>
3283 parse_expression(const char* first, const char* last, C& db)
3285 if (last - first >= 2)
3287 const char* t = first;
3288 bool parsed_gs = false;
3289 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
3297 first = parse_expr_primary(first, last, db);
3300 first = parse_template_param(first, last, db);
3303 first = parse_function_param(first, last, db);
3309 t = parse_binary_expression(first+2, last, "&&", db);
3314 t = parse_prefix_expression(first+2, last, "&", db);
3319 t = parse_binary_expression(first+2, last, "&", db);
3324 t = parse_binary_expression(first+2, last, "&=", db);
3329 t = parse_binary_expression(first+2, last, "=", db);
3334 first = parse_alignof_type(first, last, db);
3337 first = parse_alignof_expr(first, last, db);
3345 first = parse_const_cast_expr(first, last, db);
3348 first = parse_call_expr(first, last, db);
3351 t = parse_binary_expression(first+2, last, ",", db);
3356 t = parse_prefix_expression(first+2, last, "~", db);
3361 first = parse_conversion_expr(first, last, db);
3370 const char* t1 = parse_expression(t+2, last, db);
3373 if (db.names.empty())
3375 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3376 "delete[] " + db.names.back().move_full();
3382 first = parse_dynamic_cast_expr(first, last, db);
3385 t = parse_prefix_expression(first+2, last, "*", db);
3391 const char* t1 = parse_expression(t+2, last, db);
3394 if (db.names.empty())
3396 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3397 "delete " + db.names.back().move_full();
3403 return parse_unresolved_name(first, last, db);
3405 first = parse_dot_star_expr(first, last, db);
3408 first = parse_dot_expr(first, last, db);
3411 t = parse_binary_expression(first+2, last, "/", db);
3416 t = parse_binary_expression(first+2, last, "/=", db);
3426 t = parse_binary_expression(first+2, last, "^", db);
3431 t = parse_binary_expression(first+2, last, "^=", db);
3436 t = parse_binary_expression(first+2, last, "==", db);
3446 t = parse_binary_expression(first+2, last, ">=", db);
3451 t = parse_binary_expression(first+2, last, ">", db);
3460 const char* t1 = parse_expression(first+2, last, db);
3463 const char* t2 = parse_expression(t1, last, db);
3466 if (db.names.size() < 2)
3468 auto op2 = db.names.back().move_full();
3469 db.names.pop_back();
3470 auto op1 = db.names.back().move_full();
3471 db.names.back() = "(" + op1 + ")[" + op2 + "]";
3475 db.names.pop_back();
3483 t = parse_binary_expression(first+2, last, "<=", db);
3488 t = parse_binary_expression(first+2, last, "<<", db);
3493 t = parse_binary_expression(first+2, last, "<<=", db);
3498 t = parse_binary_expression(first+2, last, "<", db);
3508 t = parse_binary_expression(first+2, last, "-", db);
3513 t = parse_binary_expression(first+2, last, "-=", db);
3518 t = parse_binary_expression(first+2, last, "*", db);
3523 t = parse_binary_expression(first+2, last, "*=", db);
3528 if (first+2 != last && first[2] == '_')
3530 t = parse_prefix_expression(first+3, last, "--", db);
3536 const char* t1 = parse_expression(first+2, last, db);
3539 if (db.names.empty())
3541 db.names.back() = "(" + db.names.back().move_full() + ")--";
3553 first = parse_new_expr(first, last, db);
3556 t = parse_binary_expression(first+2, last, "!=", db);
3561 t = parse_prefix_expression(first+2, last, "-", db);
3566 t = parse_prefix_expression(first+2, last, "!", db);
3571 t = parse_noexcept_expression(first+2, last, db);
3581 return parse_unresolved_name(first, last, db);
3583 t = parse_binary_expression(first+2, last, "||", db);
3588 t = parse_binary_expression(first+2, last, "|", db);
3593 t = parse_binary_expression(first+2, last, "|=", db);
3603 t = parse_binary_expression(first+2, last, "->*", db);
3608 t = parse_binary_expression(first+2, last, "+", db);
3613 t = parse_binary_expression(first+2, last, "+=", db);
3618 if (first+2 != last && first[2] == '_')
3620 t = parse_prefix_expression(first+3, last, "++", db);
3626 const char* t1 = parse_expression(first+2, last, db);
3629 if (db.names.empty())
3631 db.names.back() = "(" + db.names.back().move_full() + ")++";
3637 t = parse_prefix_expression(first+2, last, "+", db);
3642 first = parse_arrow_expr(first, last, db);
3649 const char* t1 = parse_expression(first+2, last, db);
3652 const char* t2 = parse_expression(t1, last, db);
3655 const char* t3 = parse_expression(t2, last, db);
3658 if (db.names.size() < 3)
3660 auto op3 = db.names.back().move_full();
3661 db.names.pop_back();
3662 auto op2 = db.names.back().move_full();
3663 db.names.pop_back();
3664 auto op1 = db.names.back().move_full();
3665 db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
3670 db.names.pop_back();
3671 db.names.pop_back();
3675 db.names.pop_back();
3683 first = parse_reinterpret_cast_expr(first, last, db);
3686 t = parse_binary_expression(first+2, last, "%", db);
3691 t = parse_binary_expression(first+2, last, "%=", db);
3696 t = parse_binary_expression(first+2, last, ">>", db);
3701 t = parse_binary_expression(first+2, last, ">>=", db);
3711 first = parse_static_cast_expr(first, last, db);
3714 first = parse_pack_expansion(first, last, db);
3717 return parse_unresolved_name(first, last, db);
3719 first = parse_sizeof_type_expr(first, last, db);
3722 first = parse_sizeof_expr_expr(first, last, db);
3730 first = parse_sizeof_param_pack_expr(first, last, db);
3733 first = parse_sizeof_function_param_pack_expr(first, last, db);
3745 first = parse_typeid_expr(first, last, db);
3748 db.names.push_back("throw");
3752 first = parse_throw_expr(first, last, db);
3765 return parse_unresolved_name(first, last, db);
3771 // <template-arg> ::= <type> # type or template
3772 // ::= X <expression> E # expression
3773 // ::= <expr-primary> # simple expressions
3774 // ::= J <template-arg>* E # argument pack
3775 // ::= LZ <encoding> E # extension
3779 parse_template_arg(const char* first, const char* last, C& db)
3787 t = parse_expression(first+1, last, db);
3790 if (t != last && *t == 'E')
3800 const char* t1 = parse_template_arg(t, last, db);
3808 // <expr-primary> or LZ <encoding> E
3809 if (first+1 != last && first[1] == 'Z')
3811 t = parse_encoding(first+2, last, db);
3812 if (t != first+2 && t != last && *t == 'E')
3816 first = parse_expr_primary(first, last, db);
3820 first = parse_type(first, last, db);
3827 // <template-args> ::= I <template-arg>* E
3828 // extension, the abi says <template-arg>+
3832 parse_template_args(const char* first, const char* last, C& db)
3834 if (last - first >= 2 && *first == 'I')
3836 if (db.tag_templates)
3837 db.template_param.back().clear();
3838 const char* t = first+1;
3839 typename C::String args("<");
3842 if (db.tag_templates)
3843 db.template_param.emplace_back(db.names.get_allocator());
3844 size_t k0 = db.names.size();
3845 const char* t1 = parse_template_arg(t, last, db);
3846 size_t k1 = db.names.size();
3847 if (db.tag_templates)
3848 db.template_param.pop_back();
3849 if (t1 == t || t1 == last)
3851 if (db.tag_templates)
3853 db.template_param.back().emplace_back(db.names.get_allocator());
3854 for (size_t k = k0; k < k1; ++k)
3855 db.template_param.back().back().push_back(db.names[k]);
3857 for (size_t k = k0; k < k1; ++k)
3859 if (args.size() > 1)
3861 args += db.names[k].move_full();
3863 for (; k1 != k0; --k1)
3864 db.names.pop_back();
3868 if (args.back() != '>')
3872 db.names.push_back(std::move(args));
3878 // <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
3879 // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
3881 // <prefix> ::= <prefix> <unqualified-name>
3882 // ::= <template-prefix> <template-args>
3883 // ::= <template-param>
3886 // ::= <substitution>
3887 // ::= <prefix> <data-member-prefix>
3890 // <template-prefix> ::= <prefix> <template unqualified-name>
3891 // ::= <template-param>
3892 // ::= <substitution>
3896 parse_nested_name(const char* first, const char* last, C& db)
3898 if (first != last && *first == 'N')
3901 const char* t0 = parse_cv_qualifiers(first+1, last, cv);
3910 else if (*t0 == 'O')
3915 db.names.emplace_back();
3916 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
3919 db.names.back().first = "std";
3923 db.names.pop_back();
3926 bool pop_subs = false;
3933 if (t0 + 1 != last && t0[1] == 't')
3934 goto do_parse_unqualified_name;
3935 t1 = parse_substitution(t0, last, db);
3936 if (t1 != t0 && t1 != last)
3938 auto name = db.names.back().move_full();
3939 db.names.pop_back();
3940 if (!db.names.back().first.empty())
3942 db.names.back().first += "::" + name;
3943 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3946 db.names.back().first = name;
3954 t1 = parse_template_param(t0, last, db);
3955 if (t1 != t0 && t1 != last)
3957 auto name = db.names.back().move_full();
3958 db.names.pop_back();
3959 if (!db.names.back().first.empty())
3960 db.names.back().first += "::" + name;
3962 db.names.back().first = name;
3963 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3971 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
3972 goto do_parse_unqualified_name;
3973 t1 = parse_decltype(t0, last, db);
3974 if (t1 != t0 && t1 != last)
3976 auto name = db.names.back().move_full();
3977 db.names.pop_back();
3978 if (!db.names.back().first.empty())
3979 db.names.back().first += "::" + name;
3981 db.names.back().first = name;
3982 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3990 t1 = parse_template_args(t0, last, db);
3991 if (t1 != t0 && t1 != last)
3993 auto name = db.names.back().move_full();
3994 db.names.pop_back();
3995 db.names.back().first += name;
3996 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4007 do_parse_unqualified_name:
4008 t1 = parse_unqualified_name(t0, last, db);
4009 if (t1 != t0 && t1 != last)
4011 auto name = db.names.back().move_full();
4012 db.names.pop_back();
4013 if (!db.names.back().first.empty())
4014 db.names.back().first += "::" + name;
4016 db.names.back().first = name;
4017 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4027 if (pop_subs && !db.subs.empty())
4033 // <discriminator> := _ <non-negative number> # when number < 10
4034 // := __ <non-negative number> _ # when number >= 10
4035 // extension := decimal-digit+
4038 parse_discriminator(const char* first, const char* last)
4040 // parse but ignore discriminator
4045 const char* t1 = first+1;
4048 if (std::isdigit(*t1))
4050 else if (*t1 == '_')
4052 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4054 if (t1 != last && *t1 == '_')
4059 else if (std::isdigit(*first))
4061 const char* t1 = first+1;
4062 for (; t1 != last && std::isdigit(*t1); ++t1)
4070 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
4071 // := Z <function encoding> E s [<discriminator>]
4072 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
4076 parse_local_name(const char* first, const char* last, C& db)
4078 if (first != last && *first == 'Z')
4080 const char* t = parse_encoding(first+1, last, db);
4081 if (t != first+1 && t != last && *t == 'E' && ++t != last)
4086 first = parse_discriminator(t+1, last);
4087 if (db.names.empty())
4089 db.names.back().first.append("::string literal");
4094 const char* t1 = parse_number(t, last);
4095 if (t1 != last && *t1 == '_')
4098 t1 = parse_name(t, last, db);
4101 if (db.names.size() < 2)
4103 auto name = db.names.back().move_full();
4104 db.names.pop_back();
4105 db.names.back().first.append("::");
4106 db.names.back().first.append(name);
4110 db.names.pop_back();
4116 const char* t1 = parse_name(t, last, db);
4119 // parse but ignore discriminator
4120 first = parse_discriminator(t1, last);
4121 if (db.names.size() < 2)
4123 auto name = db.names.back().move_full();
4124 db.names.pop_back();
4125 db.names.back().first.append("::");
4126 db.names.back().first.append(name);
4129 db.names.pop_back();
4138 // <name> ::= <nested-name> // N
4139 // ::= <local-name> # See Scope Encoding below // Z
4140 // ::= <unscoped-template-name> <template-args>
4141 // ::= <unscoped-name>
4143 // <unscoped-template-name> ::= <unscoped-name>
4144 // ::= <substitution>
4148 parse_name(const char* first, const char* last, C& db)
4150 if (last - first >= 2)
4152 const char* t0 = first;
4153 // extension: ignore L here
4160 const char* t1 = parse_nested_name(t0, last, db);
4167 const char* t1 = parse_local_name(t0, last, db);
4174 const char* t1 = parse_unscoped_name(t0, last, db);
4177 if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args>
4179 if (db.names.empty())
4181 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4183 t1 = parse_template_args(t0, last, db);
4186 if (db.names.size() < 2)
4188 auto tmp = db.names.back().move_full();
4189 db.names.pop_back();
4190 db.names.back().first += tmp;
4194 else // <unscoped-name>
4198 { // try <substitution> <template-args>
4199 t1 = parse_substitution(t0, last, db);
4200 if (t1 != t0 && t1 != last && *t1 == 'I')
4203 t1 = parse_template_args(t0, last, db);
4206 if (db.names.size() < 2)
4208 auto tmp = db.names.back().move_full();
4209 db.names.pop_back();
4210 db.names.back().first += tmp;
4222 // <call-offset> ::= h <nv-offset> _
4223 // ::= v <v-offset> _
4225 // <nv-offset> ::= <offset number>
4226 // # non-virtual base override
4228 // <v-offset> ::= <offset number> _ <virtual offset number>
4229 // # virtual base override, with vcall offset
4232 parse_call_offset(const char* first, const char* last)
4240 const char* t = parse_number(first + 1, last);
4241 if (t != first + 1 && t != last && *t == '_')
4247 const char* t = parse_number(first + 1, last);
4248 if (t != first + 1 && t != last && *t == '_')
4250 const char* t2 = parse_number(++t, last);
4251 if (t2 != t && t2 != last && *t2 == '_')
4261 // <special-name> ::= TV <type> # virtual table
4262 // ::= TT <type> # VTT structure (construction vtable index)
4263 // ::= TI <type> # typeinfo structure
4264 // ::= TS <type> # typeinfo name (null-terminated byte string)
4265 // ::= Tc <call-offset> <call-offset> <base encoding>
4266 // # base is the nominal target function of thunk
4267 // # first call-offset is 'this' adjustment
4268 // # second call-offset is result adjustment
4269 // ::= T <call-offset> <base encoding>
4270 // # base is the nominal target function of thunk
4271 // ::= GV <object name> # Guard variable for one-time initialization
4273 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4274 // extension ::= GR <object name> # reference temporary for object
4278 parse_special_name(const char* first, const char* last, C& db)
4280 if (last - first > 2)
4289 // TV <type> # virtual table
4290 t = parse_type(first+2, last, db);
4293 if (db.names.empty())
4295 db.names.back().first.insert(0, "vtable for ");
4300 // TT <type> # VTT structure (construction vtable index)
4301 t = parse_type(first+2, last, db);
4304 if (db.names.empty())
4306 db.names.back().first.insert(0, "VTT for ");
4311 // TI <type> # typeinfo structure
4312 t = parse_type(first+2, last, db);
4315 if (db.names.empty())
4317 db.names.back().first.insert(0, "typeinfo for ");
4322 // TS <type> # typeinfo name (null-terminated byte string)
4323 t = parse_type(first+2, last, db);
4326 if (db.names.empty())
4328 db.names.back().first.insert(0, "typeinfo name for ");
4333 // Tc <call-offset> <call-offset> <base encoding>
4335 const char* t0 = parse_call_offset(first+2, last);
4338 const char* t1 = parse_call_offset(t0, last);
4341 t = parse_encoding(t1, last, db);
4344 if (db.names.empty())
4346 db.names.back().first.insert(0, "covariant return thunk to ");
4352 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4353 t = parse_type(first+2, last, db);
4356 const char* t0 = parse_number(t, last);
4357 if (t0 != t && t0 != last && *t0 == '_')
4359 const char* t1 = parse_type(++t0, last, db);
4362 if (db.names.size() < 2)
4364 auto left = db.names.back().move_full();
4365 db.names.pop_back();
4366 db.names.back().first = "construction vtable for " +
4367 std::move(left) + "-in-" +
4368 db.names.back().move_full();
4375 // T <call-offset> <base encoding>
4377 const char* t0 = parse_call_offset(first+1, last);
4380 t = parse_encoding(t0, last, db);
4383 if (db.names.empty())
4385 if (first[2] == 'v')
4387 db.names.back().first.insert(0, "virtual thunk to ");
4392 db.names.back().first.insert(0, "non-virtual thunk to ");
4404 // GV <object name> # Guard variable for one-time initialization
4405 t = parse_name(first+2, last, db);
4408 if (db.names.empty())
4410 db.names.back().first.insert(0, "guard variable for ");
4415 // extension ::= GR <object name> # reference temporary for object
4416 t = parse_name(first+2, last, db);
4419 if (db.names.empty())
4421 db.names.back().first.insert(0, "reference temporary for ");
4438 save_value(T& restore)
4439 : restore_(restore),
4440 original_value_(restore)
4445 restore_ = std::move(original_value_);
4448 save_value(const save_value&) = delete;
4449 save_value& operator=(const save_value&) = delete;
4452 // <encoding> ::= <function name> <bare-function-type>
4454 // ::= <special-name>
4458 parse_encoding(const char* first, const char* last, C& db)
4462 save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4463 ++db.encoding_depth;
4464 save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4465 if (db.encoding_depth > 1)
4466 db.tag_templates = true;
4471 first = parse_special_name(first, last, db);
4475 const char* t = parse_name(first, last, db);
4476 unsigned cv = db.cv;
4477 unsigned ref = db.ref;
4480 if (t != last && *t != 'E' && *t != '.')
4482 save_value<bool> sb2(db.tag_templates);
4483 db.tag_templates = false;
4485 typename C::String ret2;
4486 if (db.names.empty())
4488 const typename C::String& nm = db.names.back().first;
4491 if (!db.parsed_ctor_dtor_cv && nm.back() == '>' && nm[nm.size()-2] != '-'
4492 && nm[nm.size()-2] != '>')
4494 t2 = parse_type(t, last, db);
4497 if (db.names.size() < 2)
4499 auto ret1 = std::move(db.names.back().first);
4500 ret2 = std::move(db.names.back().second);
4503 db.names.pop_back();
4504 db.names.back().first.insert(0, ret1);
4507 db.names.back().first += '(';
4508 if (t != last && *t == 'v')
4514 bool first_arg = true;
4517 size_t k0 = db.names.size();
4518 t2 = parse_type(t, last, db);
4519 size_t k1 = db.names.size();
4524 typename C::String tmp;
4525 for (size_t k = k0; k < k1; ++k)
4529 tmp += db.names[k].move_full();
4531 for (size_t k = k0; k < k1; ++k)
4532 db.names.pop_back();
4535 if (db.names.empty())
4538 db.names.back().first += ", ";
4541 db.names.back().first += tmp;
4547 if (db.names.empty())
4549 db.names.back().first += ')';
4551 db.names.back().first.append(" const");
4553 db.names.back().first.append(" volatile");
4555 db.names.back().first.append(" restrict");
4557 db.names.back().first.append(" &");
4559 db.names.back().first.append(" &&");
4560 db.names.back().first += ret2;
4574 // _block_invoke<decimal-digit>+
4575 // _block_invoke_<decimal-digit>+
4579 parse_block_invoke(const char* first, const char* last, C& db)
4581 if (last - first >= 13)
4583 const char test[] = "_block_invoke";
4584 const char* t = first;
4585 for (int i = 0; i < 13; ++i, ++t)
4594 // must have at least 1 decimal digit
4595 if (++t == last || !std::isdigit(*t))
4599 // parse zero or more digits
4600 while (t != last && isdigit(*t))
4603 if (db.names.empty())
4605 db.names.back().first.insert(0, "invocation function for block in ");
4612 // <dot-suffix> := .<anything and everything>
4616 parse_dot_suffix(const char* first, const char* last, C& db)
4618 if (first != last && *first == '.')
4620 if (db.names.empty())
4622 db.names.back().first += " (" + typename C::String(first, last) + ")";
4628 // <block-involcaton-function> ___Z<encoding>_block_invoke
4629 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
4630 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
4631 // <mangled-name> ::= _Z<encoding>
4636 demangle(const char* first, const char* last, C& db, int& status)
4640 status = invalid_mangled_name;
4645 if (last - first >= 4)
4647 if (first[1] == 'Z')
4649 const char* t = parse_encoding(first+2, last, db);
4650 if (t != first+2 && t != last && *t == '.')
4651 t = parse_dot_suffix(t, last, db);
4653 status = invalid_mangled_name;
4655 else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
4657 const char* t = parse_encoding(first+4, last, db);
4658 if (t != first+4 && t != last)
4660 const char* t1 = parse_block_invoke(t, last, db);
4662 status = invalid_mangled_name;
4665 status = invalid_mangled_name;
4668 status = invalid_mangled_name;
4671 status = invalid_mangled_name;
4675 const char* t = parse_type(first, last, db);
4677 status = invalid_mangled_name;
4679 if (status == success && db.names.empty())
4680 status = invalid_mangled_name;
4683 template <std::size_t N>
4686 static const std::size_t alignment = 16;
4687 alignas(alignment) char buf_[N];
4691 align_up(std::size_t n) noexcept
4692 {return n + (alignment-1) & ~(alignment-1);}
4695 pointer_in_buffer(char* p) noexcept
4696 {return buf_ <= p && p <= buf_ + N;}
4699 arena() noexcept : ptr_(buf_) {}
4700 ~arena() {ptr_ = nullptr;}
4701 arena(const arena&) = delete;
4702 arena& operator=(const arena&) = delete;
4704 char* allocate(std::size_t n);
4705 void deallocate(char* p, std::size_t n) noexcept;
4707 static constexpr std::size_t size() {return N;}
4708 std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);}
4709 void reset() {ptr_ = buf_;}
4712 template <std::size_t N>
4714 arena<N>::allocate(std::size_t n)
4717 if (static_cast<std::size_t>(buf_ + N - ptr_) >= n)
4723 return static_cast<char*>(std::malloc(n));
4726 template <std::size_t N>
4728 arena<N>::deallocate(char* p, std::size_t n) noexcept
4730 if (pointer_in_buffer(p))
4740 template <class T, std::size_t N>
4745 typedef T value_type;
4748 template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;};
4750 short_alloc(arena<N>& a) noexcept : a_(a) {}
4752 short_alloc(const short_alloc<U, N>& a) noexcept
4754 short_alloc(const short_alloc&) = default;
4755 short_alloc& operator=(const short_alloc&) = delete;
4757 T* allocate(std::size_t n)
4759 return reinterpret_cast<T*>(a_.allocate(n*sizeof(T)));
4761 void deallocate(T* p, std::size_t n) noexcept
4763 a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T));
4766 template <class T1, std::size_t N1, class U, std::size_t M>
4769 operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept;
4771 template <class U, std::size_t M> friend class short_alloc;
4774 template <class T, std::size_t N, class U, std::size_t M>
4777 operator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4779 return N == M && &x.a_ == &y.a_;
4782 template <class T, std::size_t N, class U, std::size_t M>
4785 operator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4794 typedef T value_type;
4796 malloc_alloc() = default;
4797 template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
4799 T* allocate(std::size_t n)
4801 return static_cast<T*>(std::malloc(n*sizeof(T)));
4803 void deallocate(T* p, std::size_t) noexcept
4809 template <class T, class U>
4812 operator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept
4817 template <class T, class U>
4820 operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
4825 const size_t bs = 4 * 1024;
4826 template <class T> using Alloc = short_alloc<T, bs>;
4827 template <class T> using Vector = std::vector<T, Alloc<T>>;
4828 using String = std::basic_string<char, std::char_traits<char>, malloc_alloc<char>>;
4835 string_pair() = default;
4836 string_pair(String f) : first(std::move(f)) {}
4837 string_pair(String f, String s)
4838 : first(std::move(f)), second(std::move(s)) {}
4840 string_pair(const char (&s)[N]) : first(s, N-1) {}
4842 size_t size() const {return first.size() + second.size();}
4843 String full() const {return first + second;}
4844 String move_full() {return std::move(first) + std::move(second);}
4849 typedef String String;
4850 typedef Vector<string_pair> sub_type;
4851 typedef Vector<sub_type> template_param_type;
4852 Vector<string_pair> names;
4853 Vector<sub_type> subs;
4854 Vector<template_param_type> template_param;
4857 unsigned encoding_depth;
4858 bool parsed_ctor_dtor_cv;
4860 bool fix_forward_references;
4861 bool try_to_parse_template_args;
4867 template_param(0, subs, ar)
4871 } // unnamed namespace
4873 __attribute__ ((__visibility__("default")))
4876 __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
4878 if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
4881 *status = invalid_args;
4884 size_t internal_size = buf != nullptr ? *n : 0;
4889 db.encoding_depth = 0;
4890 db.parsed_ctor_dtor_cv = false;
4891 db.tag_templates = true;
4892 db.template_param.emplace_back(a);
4893 db.fix_forward_references = false;
4894 db.try_to_parse_template_args = true;
4895 int internal_status = success;
4896 size_t len = std::strlen(mangled_name);
4897 demangle(mangled_name, mangled_name + len, db,
4899 if (internal_status == success && db.fix_forward_references &&
4900 !db.template_param.empty() && !db.template_param.front().empty())
4902 db.fix_forward_references = false;
4903 db.tag_templates = false;
4906 demangle(mangled_name, mangled_name + len, db, internal_status);
4907 if (db.fix_forward_references)
4908 internal_status = invalid_mangled_name;
4910 if (internal_status == success)
4912 size_t sz = db.names.back().size() + 1;
4913 if (sz > internal_size)
4915 char* newbuf = static_cast<char*>(std::realloc(buf, sz));
4916 if (newbuf == nullptr)
4918 internal_status = memory_alloc_failure;
4930 db.names.back().first += db.names.back().second;
4931 std::memcpy(buf, db.names.back().first.data(), sz-1);
4932 buf[sz-1] = char(0);
4938 *status = internal_status;