/[llvm-project]/libcxxabi/trunk/src/cxa_demangle.cpp
ViewVC logotype

Contents of /libcxxabi/trunk/src/cxa_demangle.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 293638 - (show annotations)
Tue Jan 31 15:18:56 2017 UTC (3 years, 2 months ago) by davidb
File size: 168715 byte(s)
Add support for demangling C++11 thread_local variables. In clang, the grammar for mangling for these names are "<special-name> ::= TW <object name>" for wrapper variables or "<special-name> ::= TH <object name>" for initialization variables.
1 //===-------------------------- cxa_demangle.cpp --------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #define _LIBCPP_EXTERN_TEMPLATE(...)
11 #define _LIBCPP_NO_EXCEPTIONS
12
13 #include "__cxxabi_config.h"
14
15 #include <vector>
16 #include <algorithm>
17 #include <string>
18 #include <numeric>
19 #include <cstdlib>
20 #include <cstring>
21 #include <cctype>
22
23 #ifdef _MSC_VER
24 // snprintf is implemented in VS 2015
25 #if _MSC_VER < 1900
26 #define snprintf _snprintf_s
27 #endif
28 #endif
29
30 namespace __cxxabiv1
31 {
32
33 namespace
34 {
35
36 enum
37 {
38 unknown_error = -4,
39 invalid_args = -3,
40 invalid_mangled_name,
41 memory_alloc_failure,
42 success
43 };
44
45 template <class C>
46 const char* parse_type(const char* first, const char* last, C& db);
47 template <class C>
48 const char* parse_encoding(const char* first, const char* last, C& db);
49 template <class C>
50 const char* parse_name(const char* first, const char* last, C& db,
51 bool* ends_with_template_args = 0);
52 template <class C>
53 const char* parse_expression(const char* first, const char* last, C& db);
54 template <class C>
55 const char* parse_template_args(const char* first, const char* last, C& db);
56 template <class C>
57 const char* parse_operator_name(const char* first, const char* last, C& db);
58 template <class C>
59 const char* parse_unqualified_name(const char* first, const char* last, C& db);
60 template <class C>
61 const char* parse_decltype(const char* first, const char* last, C& db);
62
63 template <class C>
64 void
65 print_stack(const C& db)
66 {
67 fprintf(stderr, "---------\n");
68 fprintf(stderr, "names:\n");
69 for (auto& s : db.names)
70 fprintf(stderr, "{%s#%s}\n", s.first.c_str(), s.second.c_str());
71 int i = -1;
72 fprintf(stderr, "subs:\n");
73 for (auto& v : db.subs)
74 {
75 if (i >= 0)
76 fprintf(stderr, "S%i_ = {", i);
77 else
78 fprintf(stderr, "S_ = {");
79 for (auto& s : v)
80 fprintf(stderr, "{%s#%s}", s.first.c_str(), s.second.c_str());
81 fprintf(stderr, "}\n");
82 ++i;
83 }
84 fprintf(stderr, "template_param:\n");
85 for (auto& t : db.template_param)
86 {
87 fprintf(stderr, "--\n");
88 i = -1;
89 for (auto& v : t)
90 {
91 if (i >= 0)
92 fprintf(stderr, "T%i_ = {", i);
93 else
94 fprintf(stderr, "T_ = {");
95 for (auto& s : v)
96 fprintf(stderr, "{%s#%s}", s.first.c_str(), s.second.c_str());
97 fprintf(stderr, "}\n");
98 ++i;
99 }
100 }
101 fprintf(stderr, "---------\n\n");
102 }
103
104 template <class C>
105 void
106 print_state(const char* msg, const char* first, const char* last, const C& db)
107 {
108 fprintf(stderr, "%s: ", msg);
109 for (; first != last; ++first)
110 fprintf(stderr, "%c", *first);
111 fprintf(stderr, "\n");
112 print_stack(db);
113 }
114
115 // <number> ::= [n] <non-negative decimal integer>
116
117 const char*
118 parse_number(const char* first, const char* last)
119 {
120 if (first != last)
121 {
122 const char* t = first;
123 if (*t == 'n')
124 ++t;
125 if (t != last)
126 {
127 if (*t == '0')
128 {
129 first = t+1;
130 }
131 else if ('1' <= *t && *t <= '9')
132 {
133 first = t+1;
134 while (first != last && std::isdigit(*first))
135 ++first;
136 }
137 }
138 }
139 return first;
140 }
141
142 template <class Float>
143 struct float_data;
144
145 template <>
146 struct float_data<float>
147 {
148 static const size_t mangled_size = 8;
149 static const size_t max_demangled_size = 24;
150 static constexpr const char* spec = "%af";
151 };
152
153 constexpr const char* float_data<float>::spec;
154
155 template <>
156 struct float_data<double>
157 {
158 static const size_t mangled_size = 16;
159 static const size_t max_demangled_size = 32;
160 static constexpr const char* spec = "%a";
161 };
162
163 constexpr const char* float_data<double>::spec;
164
165 template <>
166 struct float_data<long double>
167 {
168 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
169 defined(__wasm__)
170 static const size_t mangled_size = 32;
171 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
172 static const size_t mangled_size = 16;
173 #else
174 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
175 #endif
176 static const size_t max_demangled_size = 40;
177 static constexpr const char* spec = "%LaL";
178 };
179
180 constexpr const char* float_data<long double>::spec;
181
182 template <class Float, class C>
183 const char*
184 parse_floating_number(const char* first, const char* last, C& db)
185 {
186 const size_t N = float_data<Float>::mangled_size;
187 if (static_cast<std::size_t>(last - first) > N)
188 {
189 last = first + N;
190 union
191 {
192 Float value;
193 char buf[sizeof(Float)];
194 };
195 const char* t = first;
196 char* e = buf;
197 for (; t != last; ++t, ++e)
198 {
199 if (!isxdigit(*t))
200 return first;
201 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
202 static_cast<unsigned>(*t - 'a' + 10);
203 ++t;
204 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
205 static_cast<unsigned>(*t - 'a' + 10);
206 *e = static_cast<char>((d1 << 4) + d0);
207 }
208 if (*t == 'E')
209 {
210 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
211 std::reverse(buf, e);
212 #endif
213 char num[float_data<Float>::max_demangled_size] = {0};
214 int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
215 if (static_cast<std::size_t>(n) >= sizeof(num))
216 return first;
217 db.names.push_back(typename C::String(num, static_cast<std::size_t>(n)));
218 first = t+1;
219 }
220 }
221 return first;
222 }
223
224 // <source-name> ::= <positive length number> <identifier>
225
226 template <class C>
227 const char*
228 parse_source_name(const char* first, const char* last, C& db)
229 {
230 if (first != last)
231 {
232 char c = *first;
233 if (isdigit(c) && first+1 != last)
234 {
235 const char* t = first+1;
236 size_t n = static_cast<size_t>(c - '0');
237 for (c = *t; isdigit(c); c = *t)
238 {
239 n = n * 10 + static_cast<size_t>(c - '0');
240 if (++t == last)
241 return first;
242 }
243 if (static_cast<size_t>(last - t) >= n)
244 {
245 typename C::String r(t, n);
246 if (r.substr(0, 10) == "_GLOBAL__N")
247 db.names.push_back("(anonymous namespace)");
248 else
249 db.names.push_back(std::move(r));
250 first = t + n;
251 }
252 }
253 }
254 return first;
255 }
256
257 // <substitution> ::= S <seq-id> _
258 // ::= S_
259 // <substitution> ::= Sa # ::std::allocator
260 // <substitution> ::= Sb # ::std::basic_string
261 // <substitution> ::= Ss # ::std::basic_string < char,
262 // ::std::char_traits<char>,
263 // ::std::allocator<char> >
264 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
265 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
266 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
267
268 template <class C>
269 const char*
270 parse_substitution(const char* first, const char* last, C& db)
271 {
272 if (last - first >= 2)
273 {
274 if (*first == 'S')
275 {
276 switch (first[1])
277 {
278 case 'a':
279 db.names.push_back("std::allocator");
280 first += 2;
281 break;
282 case 'b':
283 db.names.push_back("std::basic_string");
284 first += 2;
285 break;
286 case 's':
287 db.names.push_back("std::string");
288 first += 2;
289 break;
290 case 'i':
291 db.names.push_back("std::istream");
292 first += 2;
293 break;
294 case 'o':
295 db.names.push_back("std::ostream");
296 first += 2;
297 break;
298 case 'd':
299 db.names.push_back("std::iostream");
300 first += 2;
301 break;
302 case '_':
303 if (!db.subs.empty())
304 {
305 for (const auto& n : db.subs.front())
306 db.names.push_back(n);
307 first += 2;
308 }
309 break;
310 default:
311 if (std::isdigit(first[1]) || std::isupper(first[1]))
312 {
313 size_t sub = 0;
314 const char* t = first+1;
315 if (std::isdigit(*t))
316 sub = static_cast<size_t>(*t - '0');
317 else
318 sub = static_cast<size_t>(*t - 'A') + 10;
319 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
320 {
321 sub *= 36;
322 if (std::isdigit(*t))
323 sub += static_cast<size_t>(*t - '0');
324 else
325 sub += static_cast<size_t>(*t - 'A') + 10;
326 }
327 if (t == last || *t != '_')
328 return first;
329 ++sub;
330 if (sub < db.subs.size())
331 {
332 for (const auto& n : db.subs[sub])
333 db.names.push_back(n);
334 first = t+1;
335 }
336 }
337 break;
338 }
339 }
340 }
341 return first;
342 }
343
344 // <builtin-type> ::= v # void
345 // ::= w # wchar_t
346 // ::= b # bool
347 // ::= c # char
348 // ::= a # signed char
349 // ::= h # unsigned char
350 // ::= s # short
351 // ::= t # unsigned short
352 // ::= i # int
353 // ::= j # unsigned int
354 // ::= l # long
355 // ::= m # unsigned long
356 // ::= x # long long, __int64
357 // ::= y # unsigned long long, __int64
358 // ::= n # __int128
359 // ::= o # unsigned __int128
360 // ::= f # float
361 // ::= d # double
362 // ::= e # long double, __float80
363 // ::= g # __float128
364 // ::= z # ellipsis
365 // ::= Dd # IEEE 754r decimal floating point (64 bits)
366 // ::= De # IEEE 754r decimal floating point (128 bits)
367 // ::= Df # IEEE 754r decimal floating point (32 bits)
368 // ::= Dh # IEEE 754r half-precision floating point (16 bits)
369 // ::= Di # char32_t
370 // ::= Ds # char16_t
371 // ::= Da # auto (in dependent new-expressions)
372 // ::= Dc # decltype(auto)
373 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
374 // ::= u <source-name> # vendor extended type
375
376 template <class C>
377 const char*
378 parse_builtin_type(const char* first, const char* last, C& db)
379 {
380 if (first != last)
381 {
382 switch (*first)
383 {
384 case 'v':
385 db.names.push_back("void");
386 ++first;
387 break;
388 case 'w':
389 db.names.push_back("wchar_t");
390 ++first;
391 break;
392 case 'b':
393 db.names.push_back("bool");
394 ++first;
395 break;
396 case 'c':
397 db.names.push_back("char");
398 ++first;
399 break;
400 case 'a':
401 db.names.push_back("signed char");
402 ++first;
403 break;
404 case 'h':
405 db.names.push_back("unsigned char");
406 ++first;
407 break;
408 case 's':
409 db.names.push_back("short");
410 ++first;
411 break;
412 case 't':
413 db.names.push_back("unsigned short");
414 ++first;
415 break;
416 case 'i':
417 db.names.push_back("int");
418 ++first;
419 break;
420 case 'j':
421 db.names.push_back("unsigned int");
422 ++first;
423 break;
424 case 'l':
425 db.names.push_back("long");
426 ++first;
427 break;
428 case 'm':
429 db.names.push_back("unsigned long");
430 ++first;
431 break;
432 case 'x':
433 db.names.push_back("long long");
434 ++first;
435 break;
436 case 'y':
437 db.names.push_back("unsigned long long");
438 ++first;
439 break;
440 case 'n':
441 db.names.push_back("__int128");
442 ++first;
443 break;
444 case 'o':
445 db.names.push_back("unsigned __int128");
446 ++first;
447 break;
448 case 'f':
449 db.names.push_back("float");
450 ++first;
451 break;
452 case 'd':
453 db.names.push_back("double");
454 ++first;
455 break;
456 case 'e':
457 db.names.push_back("long double");
458 ++first;
459 break;
460 case 'g':
461 db.names.push_back("__float128");
462 ++first;
463 break;
464 case 'z':
465 db.names.push_back("...");
466 ++first;
467 break;
468 case 'u':
469 {
470 const char*t = parse_source_name(first+1, last, db);
471 if (t != first+1)
472 first = t;
473 }
474 break;
475 case 'D':
476 if (first+1 != last)
477 {
478 switch (first[1])
479 {
480 case 'd':
481 db.names.push_back("decimal64");
482 first += 2;
483 break;
484 case 'e':
485 db.names.push_back("decimal128");
486 first += 2;
487 break;
488 case 'f':
489 db.names.push_back("decimal32");
490 first += 2;
491 break;
492 case 'h':
493 db.names.push_back("decimal16");
494 first += 2;
495 break;
496 case 'i':
497 db.names.push_back("char32_t");
498 first += 2;
499 break;
500 case 's':
501 db.names.push_back("char16_t");
502 first += 2;
503 break;
504 case 'a':
505 db.names.push_back("auto");
506 first += 2;
507 break;
508 case 'c':
509 db.names.push_back("decltype(auto)");
510 first += 2;
511 break;
512 case 'n':
513 db.names.push_back("std::nullptr_t");
514 first += 2;
515 break;
516 }
517 }
518 break;
519 }
520 }
521 return first;
522 }
523
524 // <CV-qualifiers> ::= [r] [V] [K]
525
526 const char*
527 parse_cv_qualifiers(const char* first, const char* last, unsigned& cv)
528 {
529 cv = 0;
530 if (first != last)
531 {
532 if (*first == 'r')
533 {
534 cv |= 4;
535 ++first;
536 }
537 if (*first == 'V')
538 {
539 cv |= 2;
540 ++first;
541 }
542 if (*first == 'K')
543 {
544 cv |= 1;
545 ++first;
546 }
547 }
548 return first;
549 }
550
551 // <template-param> ::= T_ # first template parameter
552 // ::= T <parameter-2 non-negative number> _
553
554 template <class C>
555 const char*
556 parse_template_param(const char* first, const char* last, C& db)
557 {
558 if (last - first >= 2)
559 {
560 if (*first == 'T')
561 {
562 if (first[1] == '_')
563 {
564 if (db.template_param.empty())
565 return first;
566 if (!db.template_param.back().empty())
567 {
568 for (auto& t : db.template_param.back().front())
569 db.names.push_back(t);
570 first += 2;
571 }
572 else
573 {
574 db.names.push_back("T_");
575 first += 2;
576 db.fix_forward_references = true;
577 }
578 }
579 else if (isdigit(first[1]))
580 {
581 const char* t = first+1;
582 size_t sub = static_cast<size_t>(*t - '0');
583 for (++t; t != last && isdigit(*t); ++t)
584 {
585 sub *= 10;
586 sub += static_cast<size_t>(*t - '0');
587 }
588 if (t == last || *t != '_' || db.template_param.empty())
589 return first;
590 ++sub;
591 if (sub < db.template_param.back().size())
592 {
593 for (auto& temp : db.template_param.back()[sub])
594 db.names.push_back(temp);
595 first = t+1;
596 }
597 else
598 {
599 db.names.push_back(typename C::String(first, t+1));
600 first = t+1;
601 db.fix_forward_references = true;
602 }
603 }
604 }
605 }
606 return first;
607 }
608
609 // cc <type> <expression> # const_cast<type> (expression)
610
611 template <class C>
612 const char*
613 parse_const_cast_expr(const char* first, const char* last, C& db)
614 {
615 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
616 {
617 const char* t = parse_type(first+2, last, db);
618 if (t != first+2)
619 {
620 const char* t1 = parse_expression(t, last, db);
621 if (t1 != t)
622 {
623 if (db.names.size() < 2)
624 return first;
625 auto expr = db.names.back().move_full();
626 db.names.pop_back();
627 if (db.names.empty())
628 return first;
629 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
630 first = t1;
631 }
632 }
633 }
634 return first;
635 }
636
637 // dc <type> <expression> # dynamic_cast<type> (expression)
638
639 template <class C>
640 const char*
641 parse_dynamic_cast_expr(const char* first, const char* last, C& db)
642 {
643 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
644 {
645 const char* t = parse_type(first+2, last, db);
646 if (t != first+2)
647 {
648 const char* t1 = parse_expression(t, last, db);
649 if (t1 != t)
650 {
651 if (db.names.size() < 2)
652 return first;
653 auto expr = db.names.back().move_full();
654 db.names.pop_back();
655 if (db.names.empty())
656 return first;
657 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
658 first = t1;
659 }
660 }
661 }
662 return first;
663 }
664
665 // rc <type> <expression> # reinterpret_cast<type> (expression)
666
667 template <class C>
668 const char*
669 parse_reinterpret_cast_expr(const char* first, const char* last, C& db)
670 {
671 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
672 {
673 const char* t = parse_type(first+2, last, db);
674 if (t != first+2)
675 {
676 const char* t1 = parse_expression(t, last, db);
677 if (t1 != t)
678 {
679 if (db.names.size() < 2)
680 return first;
681 auto expr = db.names.back().move_full();
682 db.names.pop_back();
683 if (db.names.empty())
684 return first;
685 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
686 first = t1;
687 }
688 }
689 }
690 return first;
691 }
692
693 // sc <type> <expression> # static_cast<type> (expression)
694
695 template <class C>
696 const char*
697 parse_static_cast_expr(const char* first, const char* last, C& db)
698 {
699 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
700 {
701 const char* t = parse_type(first+2, last, db);
702 if (t != first+2)
703 {
704 const char* t1 = parse_expression(t, last, db);
705 if (t1 != t)
706 {
707 if (db.names.size() < 2)
708 return first;
709 auto expr = db.names.back().move_full();
710 db.names.pop_back();
711 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
712 first = t1;
713 }
714 }
715 }
716 return first;
717 }
718
719 // sp <expression> # pack expansion
720
721 template <class C>
722 const char*
723 parse_pack_expansion(const char* first, const char* last, C& db)
724 {
725 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
726 {
727 const char* t = parse_expression(first+2, last, db);
728 if (t != first+2)
729 first = t;
730 }
731 return first;
732 }
733
734 // st <type> # sizeof (a type)
735
736 template <class C>
737 const char*
738 parse_sizeof_type_expr(const char* first, const char* last, C& db)
739 {
740 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
741 {
742 const char* t = parse_type(first+2, last, db);
743 if (t != first+2)
744 {
745 if (db.names.empty())
746 return first;
747 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
748 first = t;
749 }
750 }
751 return first;
752 }
753
754 // sz <expr> # sizeof (a expression)
755
756 template <class C>
757 const char*
758 parse_sizeof_expr_expr(const char* first, const char* last, C& db)
759 {
760 if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
761 {
762 const char* t = parse_expression(first+2, last, db);
763 if (t != first+2)
764 {
765 if (db.names.empty())
766 return first;
767 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
768 first = t;
769 }
770 }
771 return first;
772 }
773
774 // sZ <template-param> # size of a parameter pack
775
776 template <class C>
777 const char*
778 parse_sizeof_param_pack_expr(const char* first, const char* last, C& db)
779 {
780 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
781 {
782 size_t k0 = db.names.size();
783 const char* t = parse_template_param(first+2, last, db);
784 size_t k1 = db.names.size();
785 if (t != first+2)
786 {
787 typename C::String tmp("sizeof...(");
788 size_t k = k0;
789 if (k != k1)
790 {
791 tmp += db.names[k].move_full();
792 for (++k; k != k1; ++k)
793 tmp += ", " + db.names[k].move_full();
794 }
795 tmp += ")";
796 for (; k1 != k0; --k1)
797 db.names.pop_back();
798 db.names.push_back(std::move(tmp));
799 first = t;
800 }
801 }
802 return first;
803 }
804
805 // <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
806 // ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
807 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
808 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters
809
810 template <class C>
811 const char*
812 parse_function_param(const char* first, const char* last, C& db)
813 {
814 if (last - first >= 3 && *first == 'f')
815 {
816 if (first[1] == 'p')
817 {
818 unsigned cv;
819 const char* t = parse_cv_qualifiers(first+2, last, cv);
820 const char* t1 = parse_number(t, last);
821 if (t1 != last && *t1 == '_')
822 {
823 db.names.push_back("fp" + typename C::String(t, t1));
824 first = t1+1;
825 }
826 }
827 else if (first[1] == 'L')
828 {
829 unsigned cv;
830 const char* t0 = parse_number(first+2, last);
831 if (t0 != last && *t0 == 'p')
832 {
833 ++t0;
834 const char* t = parse_cv_qualifiers(t0, last, cv);
835 const char* t1 = parse_number(t, last);
836 if (t1 != last && *t1 == '_')
837 {
838 db.names.push_back("fp" + typename C::String(t, t1));
839 first = t1+1;
840 }
841 }
842 }
843 }
844 return first;
845 }
846
847 // sZ <function-param> # size of a function parameter pack
848
849 template <class C>
850 const char*
851 parse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db)
852 {
853 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
854 {
855 const char* t = parse_function_param(first+2, last, db);
856 if (t != first+2)
857 {
858 if (db.names.empty())
859 return first;
860 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
861 first = t;
862 }
863 }
864 return first;
865 }
866
867 // te <expression> # typeid (expression)
868 // ti <type> # typeid (type)
869
870 template <class C>
871 const char*
872 parse_typeid_expr(const char* first, const char* last, C& db)
873 {
874 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
875 {
876 const char* t;
877 if (first[1] == 'e')
878 t = parse_expression(first+2, last, db);
879 else
880 t = parse_type(first+2, last, db);
881 if (t != first+2)
882 {
883 if (db.names.empty())
884 return first;
885 db.names.back() = "typeid(" + db.names.back().move_full() + ")";
886 first = t;
887 }
888 }
889 return first;
890 }
891
892 // tw <expression> # throw expression
893
894 template <class C>
895 const char*
896 parse_throw_expr(const char* first, const char* last, C& db)
897 {
898 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
899 {
900 const char* t = parse_expression(first+2, last, db);
901 if (t != first+2)
902 {
903 if (db.names.empty())
904 return first;
905 db.names.back() = "throw " + db.names.back().move_full();
906 first = t;
907 }
908 }
909 return first;
910 }
911
912 // ds <expression> <expression> # expr.*expr
913
914 template <class C>
915 const char*
916 parse_dot_star_expr(const char* first, const char* last, C& db)
917 {
918 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
919 {
920 const char* t = parse_expression(first+2, last, db);
921 if (t != first+2)
922 {
923 const char* t1 = parse_expression(t, last, db);
924 if (t1 != t)
925 {
926 if (db.names.size() < 2)
927 return first;
928 auto expr = db.names.back().move_full();
929 db.names.pop_back();
930 db.names.back().first += ".*" + expr;
931 first = t1;
932 }
933 }
934 }
935 return first;
936 }
937
938 // <simple-id> ::= <source-name> [ <template-args> ]
939
940 template <class C>
941 const char*
942 parse_simple_id(const char* first, const char* last, C& db)
943 {
944 if (first != last)
945 {
946 const char* t = parse_source_name(first, last, db);
947 if (t != first)
948 {
949 const char* t1 = parse_template_args(t, last, db);
950 if (t1 != t)
951 {
952 if (db.names.size() < 2)
953 return first;
954 auto args = db.names.back().move_full();
955 db.names.pop_back();
956 db.names.back().first += std::move(args);
957 }
958 first = t1;
959 }
960 else
961 first = t;
962 }
963 return first;
964 }
965
966 // <unresolved-type> ::= <template-param>
967 // ::= <decltype>
968 // ::= <substitution>
969
970 template <class C>
971 const char*
972 parse_unresolved_type(const char* first, const char* last, C& db)
973 {
974 if (first != last)
975 {
976 const char* t = first;
977 switch (*first)
978 {
979 case 'T':
980 {
981 size_t k0 = db.names.size();
982 t = parse_template_param(first, last, db);
983 size_t k1 = db.names.size();
984 if (t != first && k1 == k0 + 1)
985 {
986 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
987 first = t;
988 }
989 else
990 {
991 for (; k1 != k0; --k1)
992 db.names.pop_back();
993 }
994 break;
995 }
996 case 'D':
997 t = parse_decltype(first, last, db);
998 if (t != first)
999 {
1000 if (db.names.empty())
1001 return first;
1002 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1003 first = t;
1004 }
1005 break;
1006 case 'S':
1007 t = parse_substitution(first, last, db);
1008 if (t != first)
1009 first = t;
1010 else
1011 {
1012 if (last - first > 2 && first[1] == 't')
1013 {
1014 t = parse_unqualified_name(first+2, last, db);
1015 if (t != first+2)
1016 {
1017 if (db.names.empty())
1018 return first;
1019 db.names.back().first.insert(0, "std::");
1020 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1021 first = t;
1022 }
1023 }
1024 }
1025 break;
1026 }
1027 }
1028 return first;
1029 }
1030
1031 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
1032 // ::= <simple-id> # e.g., ~A<2*N>
1033
1034 template <class C>
1035 const char*
1036 parse_destructor_name(const char* first, const char* last, C& db)
1037 {
1038 if (first != last)
1039 {
1040 const char* t = parse_unresolved_type(first, last, db);
1041 if (t == first)
1042 t = parse_simple_id(first, last, db);
1043 if (t != first)
1044 {
1045 if (db.names.empty())
1046 return first;
1047 db.names.back().first.insert(0, "~");
1048 first = t;
1049 }
1050 }
1051 return first;
1052 }
1053
1054 // <base-unresolved-name> ::= <simple-id> # unresolved name
1055 // extension ::= <operator-name> # unresolved operator-function-id
1056 // extension ::= <operator-name> <template-args> # unresolved operator template-id
1057 // ::= on <operator-name> # unresolved operator-function-id
1058 // ::= on <operator-name> <template-args> # unresolved operator template-id
1059 // ::= dn <destructor-name> # destructor or pseudo-destructor;
1060 // # e.g. ~X or ~X<N-1>
1061
1062 template <class C>
1063 const char*
1064 parse_base_unresolved_name(const char* first, const char* last, C& db)
1065 {
1066 if (last - first >= 2)
1067 {
1068 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
1069 {
1070 if (first[0] == 'o')
1071 {
1072 const char* t = parse_operator_name(first+2, last, db);
1073 if (t != first+2)
1074 {
1075 first = parse_template_args(t, last, db);
1076 if (first != t)
1077 {
1078 if (db.names.size() < 2)
1079 return first;
1080 auto args = db.names.back().move_full();
1081 db.names.pop_back();
1082 db.names.back().first += std::move(args);
1083 }
1084 }
1085 }
1086 else
1087 {
1088 const char* t = parse_destructor_name(first+2, last, db);
1089 if (t != first+2)
1090 first = t;
1091 }
1092 }
1093 else
1094 {
1095 const char* t = parse_simple_id(first, last, db);
1096 if (t == first)
1097 {
1098 t = parse_operator_name(first, last, db);
1099 if (t != first)
1100 {
1101 first = parse_template_args(t, last, db);
1102 if (first != t)
1103 {
1104 if (db.names.size() < 2)
1105 return first;
1106 auto args = db.names.back().move_full();
1107 db.names.pop_back();
1108 db.names.back().first += std::move(args);
1109 }
1110 }
1111 }
1112 else
1113 first = t;
1114 }
1115 }
1116 return first;
1117 }
1118
1119 // <unresolved-qualifier-level> ::= <simple-id>
1120
1121 template <class C>
1122 const char*
1123 parse_unresolved_qualifier_level(const char* first, const char* last, C& db)
1124 {
1125 return parse_simple_id(first, last, db);
1126 }
1127
1128 // <unresolved-name>
1129 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
1130 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
1131 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
1132 // # A::x, N::y, A<T>::z; "gs" means leading "::"
1133 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
1134 // extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
1135 // # T::N::x /decltype(p)::N::x
1136 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
1137
1138 template <class C>
1139 const char*
1140 parse_unresolved_name(const char* first, const char* last, C& db)
1141 {
1142 if (last - first > 2)
1143 {
1144 const char* t = first;
1145 bool global = false;
1146 if (t[0] == 'g' && t[1] == 's')
1147 {
1148 global = true;
1149 t += 2;
1150 }
1151 const char* t2 = parse_base_unresolved_name(t, last, db);
1152 if (t2 != t)
1153 {
1154 if (global)
1155 {
1156 if (db.names.empty())
1157 return first;
1158 db.names.back().first.insert(0, "::");
1159 }
1160 first = t2;
1161 }
1162 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
1163 {
1164 if (t[2] == 'N')
1165 {
1166 t += 3;
1167 const char* t1 = parse_unresolved_type(t, last, db);
1168 if (t1 == t || t1 == last)
1169 return first;
1170 t = t1;
1171 t1 = parse_template_args(t, last, db);
1172 if (t1 != t)
1173 {
1174 if (db.names.size() < 2)
1175 return first;
1176 auto args = db.names.back().move_full();
1177 db.names.pop_back();
1178 db.names.back().first += std::move(args);
1179 t = t1;
1180 if (t == last)
1181 {
1182 db.names.pop_back();
1183 return first;
1184 }
1185 }
1186 while (*t != 'E')
1187 {
1188 t1 = parse_unresolved_qualifier_level(t, last, db);
1189 if (t1 == t || t1 == last || db.names.size() < 2)
1190 return first;
1191 auto s = db.names.back().move_full();
1192 db.names.pop_back();
1193 db.names.back().first += "::" + std::move(s);
1194 t = t1;
1195 }
1196 ++t;
1197 t1 = parse_base_unresolved_name(t, last, db);
1198 if (t1 == t)
1199 {
1200 if (!db.names.empty())
1201 db.names.pop_back();
1202 return first;
1203 }
1204 if (db.names.size() < 2)
1205 return first;
1206 auto s = db.names.back().move_full();
1207 db.names.pop_back();
1208 db.names.back().first += "::" + std::move(s);
1209 first = t1;
1210 }
1211 else
1212 {
1213 t += 2;
1214 const char* t1 = parse_unresolved_type(t, last, db);
1215 if (t1 != t)
1216 {
1217 t = t1;
1218 t1 = parse_template_args(t, last, db);
1219 if (t1 != t)
1220 {
1221 if (db.names.size() < 2)
1222 return first;
1223 auto args = db.names.back().move_full();
1224 db.names.pop_back();
1225 db.names.back().first += std::move(args);
1226 t = t1;
1227 }
1228 t1 = parse_base_unresolved_name(t, last, db);
1229 if (t1 == t)
1230 {
1231 if (!db.names.empty())
1232 db.names.pop_back();
1233 return first;
1234 }
1235 if (db.names.size() < 2)
1236 return first;
1237 auto s = db.names.back().move_full();
1238 db.names.pop_back();
1239 db.names.back().first += "::" + std::move(s);
1240 first = t1;
1241 }
1242 else
1243 {
1244 t1 = parse_unresolved_qualifier_level(t, last, db);
1245 if (t1 == t || t1 == last)
1246 return first;
1247 t = t1;
1248 if (global)
1249 {
1250 if (db.names.empty())
1251 return first;
1252 db.names.back().first.insert(0, "::");
1253 }
1254 while (*t != 'E')
1255 {
1256 t1 = parse_unresolved_qualifier_level(t, last, db);
1257 if (t1 == t || t1 == last || db.names.size() < 2)
1258 return first;
1259 auto s = db.names.back().move_full();
1260 db.names.pop_back();
1261 db.names.back().first += "::" + std::move(s);
1262 t = t1;
1263 }
1264 ++t;
1265 t1 = parse_base_unresolved_name(t, last, db);
1266 if (t1 == t)
1267 {
1268 if (!db.names.empty())
1269 db.names.pop_back();
1270 return first;
1271 }
1272 if (db.names.size() < 2)
1273 return first;
1274 auto s = db.names.back().move_full();
1275 db.names.pop_back();
1276 db.names.back().first += "::" + std::move(s);
1277 first = t1;
1278 }
1279 }
1280 }
1281 }
1282 return first;
1283 }
1284
1285 // dt <expression> <unresolved-name> # expr.name
1286
1287 template <class C>
1288 const char*
1289 parse_dot_expr(const char* first, const char* last, C& db)
1290 {
1291 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
1292 {
1293 const char* t = parse_expression(first+2, last, db);
1294 if (t != first+2)
1295 {
1296 const char* t1 = parse_unresolved_name(t, last, db);
1297 if (t1 != t)
1298 {
1299 if (db.names.size() < 2)
1300 return first;
1301 auto name = db.names.back().move_full();
1302 db.names.pop_back();
1303 if (db.names.empty())
1304 return first;
1305 db.names.back().first += "." + name;
1306 first = t1;
1307 }
1308 }
1309 }
1310 return first;
1311 }
1312
1313 // cl <expression>+ E # call
1314
1315 template <class C>
1316 const char*
1317 parse_call_expr(const char* first, const char* last, C& db)
1318 {
1319 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
1320 {
1321 const char* t = parse_expression(first+2, last, db);
1322 if (t != first+2)
1323 {
1324 if (t == last)
1325 return first;
1326 if (db.names.empty())
1327 return first;
1328 db.names.back().first += db.names.back().second;
1329 db.names.back().second = typename C::String();
1330 db.names.back().first.append("(");
1331 bool first_expr = true;
1332 while (*t != 'E')
1333 {
1334 const char* t1 = parse_expression(t, last, db);
1335 if (t1 == t || t1 == last)
1336 return first;
1337 if (db.names.empty())
1338 return first;
1339 auto tmp = db.names.back().move_full();
1340 db.names.pop_back();
1341 if (!tmp.empty())
1342 {
1343 if (db.names.empty())
1344 return first;
1345 if (!first_expr)
1346 {
1347 db.names.back().first.append(", ");
1348 first_expr = false;
1349 }
1350 db.names.back().first.append(tmp);
1351 }
1352 t = t1;
1353 }
1354 ++t;
1355 if (db.names.empty())
1356 return first;
1357 db.names.back().first.append(")");
1358 first = t;
1359 }
1360 }
1361 return first;
1362 }
1363
1364 // [gs] nw <expression>* _ <type> E # new (expr-list) type
1365 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
1366 // [gs] na <expression>* _ <type> E # new[] (expr-list) type
1367 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
1368 // <initializer> ::= pi <expression>* E # parenthesized initialization
1369
1370 template <class C>
1371 const char*
1372 parse_new_expr(const char* first, const char* last, C& db)
1373 {
1374 if (last - first >= 4)
1375 {
1376 const char* t = first;
1377 bool parsed_gs = false;
1378 if (t[0] == 'g' && t[1] == 's')
1379 {
1380 t += 2;
1381 parsed_gs = true;
1382 }
1383 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
1384 {
1385 bool is_array = t[1] == 'a';
1386 t += 2;
1387 if (t == last)
1388 return first;
1389 bool has_expr_list = false;
1390 bool first_expr = true;
1391 while (*t != '_')
1392 {
1393 const char* t1 = parse_expression(t, last, db);
1394 if (t1 == t || t1 == last)
1395 return first;
1396 has_expr_list = true;
1397 if (!first_expr)
1398 {
1399 if (db.names.empty())
1400 return first;
1401 auto tmp = db.names.back().move_full();
1402 db.names.pop_back();
1403 if (!tmp.empty())
1404 {
1405 if (db.names.empty())
1406 return first;
1407 db.names.back().first.append(", ");
1408 db.names.back().first.append(tmp);
1409 first_expr = false;
1410 }
1411 }
1412 t = t1;
1413 }
1414 ++t;
1415 const char* t1 = parse_type(t, last, db);
1416 if (t1 == t || t1 == last)
1417 return first;
1418 t = t1;
1419 bool has_init = false;
1420 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
1421 {
1422 t += 2;
1423 has_init = true;
1424 first_expr = true;
1425 while (*t != 'E')
1426 {
1427 t1 = parse_expression(t, last, db);
1428 if (t1 == t || t1 == last)
1429 return first;
1430 if (!first_expr)
1431 {
1432 if (db.names.empty())
1433 return first;
1434 auto tmp = db.names.back().move_full();
1435 db.names.pop_back();
1436 if (!tmp.empty())
1437 {
1438 if (db.names.empty())
1439 return first;
1440 db.names.back().first.append(", ");
1441 db.names.back().first.append(tmp);
1442 first_expr = false;
1443 }
1444 }
1445 t = t1;
1446 }
1447 }
1448 if (*t != 'E')
1449 return first;
1450 typename C::String init_list;
1451 if (has_init)
1452 {
1453 if (db.names.empty())
1454 return first;
1455 init_list = db.names.back().move_full();
1456 db.names.pop_back();
1457 }
1458 if (db.names.empty())
1459 return first;
1460 auto type = db.names.back().move_full();
1461 db.names.pop_back();
1462 typename C::String expr_list;
1463 if (has_expr_list)
1464 {
1465 if (db.names.empty())
1466 return first;
1467 expr_list = db.names.back().move_full();
1468 db.names.pop_back();
1469 }
1470 typename C::String r;
1471 if (parsed_gs)
1472 r = "::";
1473 if (is_array)
1474 r += "[] ";
1475 else
1476 r += " ";
1477 if (has_expr_list)
1478 r += "(" + expr_list + ") ";
1479 r += type;
1480 if (has_init)
1481 r += " (" + init_list + ")";
1482 db.names.push_back(std::move(r));
1483 first = t+1;
1484 }
1485 }
1486 return first;
1487 }
1488
1489 // cv <type> <expression> # conversion with one argument
1490 // cv <type> _ <expression>* E # conversion with a different number of arguments
1491
1492 template <class C>
1493 const char*
1494 parse_conversion_expr(const char* first, const char* last, C& db)
1495 {
1496 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
1497 {
1498 bool try_to_parse_template_args = db.try_to_parse_template_args;
1499 db.try_to_parse_template_args = false;
1500 const char* t = parse_type(first+2, last, db);
1501 db.try_to_parse_template_args = try_to_parse_template_args;
1502 if (t != first+2 && t != last)
1503 {
1504 if (*t != '_')
1505 {
1506 const char* t1 = parse_expression(t, last, db);
1507 if (t1 == t)
1508 return first;
1509 t = t1;
1510 }
1511 else
1512 {
1513 ++t;
1514 if (t == last)
1515 return first;
1516 if (*t == 'E')
1517 db.names.emplace_back();
1518 else
1519 {
1520 bool first_expr = true;
1521 while (*t != 'E')
1522 {
1523 const char* t1 = parse_expression(t, last, db);
1524 if (t1 == t || t1 == last)
1525 return first;
1526 if (!first_expr)
1527 {
1528 if (db.names.empty())
1529 return first;
1530 auto tmp = db.names.back().move_full();
1531 db.names.pop_back();
1532 if (!tmp.empty())
1533 {
1534 if (db.names.empty())
1535 return first;
1536 db.names.back().first.append(", ");
1537 db.names.back().first.append(tmp);
1538 first_expr = false;
1539 }
1540 }
1541 t = t1;
1542 }
1543 }
1544 ++t;
1545 }
1546 if (db.names.size() < 2)
1547 return first;
1548 auto tmp = db.names.back().move_full();
1549 db.names.pop_back();
1550 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
1551 first = t;
1552 }
1553 }
1554 return first;
1555 }
1556
1557 // pt <expression> <expression> # expr->name
1558
1559 template <class C>
1560 const char*
1561 parse_arrow_expr(const char* first, const char* last, C& db)
1562 {
1563 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
1564 {
1565 const char* t = parse_expression(first+2, last, db);
1566 if (t != first+2)
1567 {
1568 const char* t1 = parse_expression(t, last, db);
1569 if (t1 != t)
1570 {
1571 if (db.names.size() < 2)
1572 return first;
1573 auto tmp = db.names.back().move_full();
1574 db.names.pop_back();
1575 db.names.back().first += "->";
1576 db.names.back().first += tmp;
1577 first = t1;
1578 }
1579 }
1580 }
1581 return first;
1582 }
1583
1584 // <ref-qualifier> ::= R # & ref-qualifier
1585 // <ref-qualifier> ::= O # && ref-qualifier
1586
1587 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
1588
1589 template <class C>
1590 const char*
1591 parse_function_type(const char* first, const char* last, C& db)
1592 {
1593 if (first != last && *first == 'F')
1594 {
1595 const char* t = first+1;
1596 if (t != last)
1597 {
1598 if (*t == 'Y')
1599 {
1600 /* extern "C" */
1601 if (++t == last)
1602 return first;
1603 }
1604 const char* t1 = parse_type(t, last, db);
1605 if (t1 != t)
1606 {
1607 t = t1;
1608 typename C::String sig("(");
1609 int ref_qual = 0;
1610 while (true)
1611 {
1612 if (t == last)
1613 {
1614 if (!db.names.empty())
1615 db.names.pop_back();
1616 return first;
1617 }
1618 if (*t == 'E')
1619 {
1620 ++t;
1621 break;
1622 }
1623 if (*t == 'v')
1624 {
1625 ++t;
1626 continue;
1627 }
1628 if (*t == 'R' && t+1 != last && t[1] == 'E')
1629 {
1630 ref_qual = 1;
1631 ++t;
1632 continue;
1633 }
1634 if (*t == 'O' && t+1 != last && t[1] == 'E')
1635 {
1636 ref_qual = 2;
1637 ++t;
1638 continue;
1639 }
1640 size_t k0 = db.names.size();
1641 t1 = parse_type(t, last, db);
1642 size_t k1 = db.names.size();
1643 if (t1 == t || t1 == last)
1644 return first;
1645 for (size_t k = k0; k < k1; ++k)
1646 {
1647 if (sig.size() > 1)
1648 sig += ", ";
1649 sig += db.names[k].move_full();
1650 }
1651 for (size_t k = k0; k < k1; ++k)
1652 db.names.pop_back();
1653 t = t1;
1654 }
1655 sig += ")";
1656 switch (ref_qual)
1657 {
1658 case 1:
1659 sig += " &";
1660 break;
1661 case 2:
1662 sig += " &&";
1663 break;
1664 }
1665 if (db.names.empty())
1666 return first;
1667 db.names.back().first += " ";
1668 db.names.back().second.insert(0, sig);
1669 first = t;
1670 }
1671 }
1672 }
1673 return first;
1674 }
1675
1676 // <pointer-to-member-type> ::= M <class type> <member type>
1677
1678 template <class C>
1679 const char*
1680 parse_pointer_to_member_type(const char* first, const char* last, C& db)
1681 {
1682 if (first != last && *first == 'M')
1683 {
1684 const char* t = parse_type(first+1, last, db);
1685 if (t != first+1)
1686 {
1687 const char* t2 = parse_type(t, last, db);
1688 if (t2 != t)
1689 {
1690 if (db.names.size() < 2)
1691 return first;
1692 auto func = std::move(db.names.back());
1693 db.names.pop_back();
1694 auto class_type = std::move(db.names.back());
1695 if (!func.second.empty() && func.second.front() == '(')
1696 {
1697 db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*";
1698 db.names.back().second = ")" + std::move(func.second);
1699 }
1700 else
1701 {
1702 db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*";
1703 db.names.back().second = std::move(func.second);
1704 }
1705 first = t2;
1706 }
1707 }
1708 }
1709 return first;
1710 }
1711
1712 // <array-type> ::= A <positive dimension number> _ <element type>
1713 // ::= A [<dimension expression>] _ <element type>
1714
1715 template <class C>
1716 const char*
1717 parse_array_type(const char* first, const char* last, C& db)
1718 {
1719 if (first != last && *first == 'A' && first+1 != last)
1720 {
1721 if (first[1] == '_')
1722 {
1723 const char* t = parse_type(first+2, last, db);
1724 if (t != first+2)
1725 {
1726 if (db.names.empty())
1727 return first;
1728 if (db.names.back().second.substr(0, 2) == " [")
1729 db.names.back().second.erase(0, 1);
1730 db.names.back().second.insert(0, " []");
1731 first = t;
1732 }
1733 }
1734 else if ('1' <= first[1] && first[1] <= '9')
1735 {
1736 const char* t = parse_number(first+1, last);
1737 if (t != last && *t == '_')
1738 {
1739 const char* t2 = parse_type(t+1, last, db);
1740 if (t2 != t+1)
1741 {
1742 if (db.names.empty())
1743 return first;
1744 if (db.names.back().second.substr(0, 2) == " [")
1745 db.names.back().second.erase(0, 1);
1746 db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]");
1747 first = t2;
1748 }
1749 }
1750 }
1751 else
1752 {
1753 const char* t = parse_expression(first+1, last, db);
1754 if (t != first+1 && t != last && *t == '_')
1755 {
1756 const char* t2 = parse_type(++t, last, db);
1757 if (t2 != t)
1758 {
1759 if (db.names.size() < 2)
1760 return first;
1761 auto type = std::move(db.names.back());
1762 db.names.pop_back();
1763 auto expr = std::move(db.names.back());
1764 db.names.back().first = std::move(type.first);
1765 if (type.second.substr(0, 2) == " [")
1766 type.second.erase(0, 1);
1767 db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second);
1768 first = t2;
1769 }
1770 }
1771 }
1772 }
1773 return first;
1774 }
1775
1776 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
1777 // ::= DT <expression> E # decltype of an expression (C++0x)
1778
1779 template <class C>
1780 const char*
1781 parse_decltype(const char* first, const char* last, C& db)
1782 {
1783 if (last - first >= 4 && first[0] == 'D')
1784 {
1785 switch (first[1])
1786 {
1787 case 't':
1788 case 'T':
1789 {
1790 const char* t = parse_expression(first+2, last, db);
1791 if (t != first+2 && t != last && *t == 'E')
1792 {
1793 if (db.names.empty())
1794 return first;
1795 db.names.back() = "decltype(" + db.names.back().move_full() + ")";
1796 first = t+1;
1797 }
1798 }
1799 break;
1800 }
1801 }
1802 return first;
1803 }
1804
1805 // extension:
1806 // <vector-type> ::= Dv <positive dimension number> _
1807 // <extended element type>
1808 // ::= Dv [<dimension expression>] _ <element type>
1809 // <extended element type> ::= <element type>
1810 // ::= p # AltiVec vector pixel
1811
1812 template <class C>
1813 const char*
1814 parse_vector_type(const char* first, const char* last, C& db)
1815 {
1816 if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
1817 {
1818 if ('1' <= first[2] && first[2] <= '9')
1819 {
1820 const char* t = parse_number(first+2, last);
1821 if (t == last || *t != '_')
1822 return first;
1823 const char* num = first + 2;
1824 size_t sz = static_cast<size_t>(t - num);
1825 if (++t != last)
1826 {
1827 if (*t != 'p')
1828 {
1829 const char* t1 = parse_type(t, last, db);
1830 if (t1 != t)
1831 {
1832 if (db.names.empty())
1833 return first;
1834 db.names.back().first += " vector[" + typename C::String(num, sz) + "]";
1835 first = t1;
1836 }
1837 }
1838 else
1839 {
1840 ++t;
1841 db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]");
1842 first = t;
1843 }
1844 }
1845 }
1846 else
1847 {
1848 typename C::String num;
1849 const char* t1 = first+2;
1850 if (*t1 != '_')
1851 {
1852 const char* t = parse_expression(t1, last, db);
1853 if (t != t1)
1854 {
1855 if (db.names.empty())
1856 return first;
1857 num = db.names.back().move_full();
1858 db.names.pop_back();
1859 t1 = t;
1860 }
1861 }
1862 if (t1 != last && *t1 == '_' && ++t1 != last)
1863 {
1864 const char* t = parse_type(t1, last, db);
1865 if (t != t1)
1866 {
1867 if (db.names.empty())
1868 return first;
1869 db.names.back().first += " vector[" + num + "]";
1870 first = t;
1871 }
1872 }
1873 }
1874 }
1875 return first;
1876 }
1877
1878 // <type> ::= <builtin-type>
1879 // ::= <function-type>
1880 // ::= <class-enum-type>
1881 // ::= <array-type>
1882 // ::= <pointer-to-member-type>
1883 // ::= <template-param>
1884 // ::= <template-template-param> <template-args>
1885 // ::= <decltype>
1886 // ::= <substitution>
1887 // ::= <CV-qualifiers> <type>
1888 // ::= P <type> # pointer-to
1889 // ::= R <type> # reference-to
1890 // ::= O <type> # rvalue reference-to (C++0x)
1891 // ::= C <type> # complex pair (C 2000)
1892 // ::= G <type> # imaginary (C 2000)
1893 // ::= Dp <type> # pack expansion (C++0x)
1894 // ::= U <source-name> <type> # vendor extended type qualifier
1895 // extension := U <objc-name> <objc-type> # objc-type<identifier>
1896 // extension := <vector-type> # <vector-type> starts with Dv
1897
1898 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
1899 // <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
1900
1901 template <class C>
1902 const char*
1903 parse_type(const char* first, const char* last, C& db)
1904 {
1905 if (first != last)
1906 {
1907 switch (*first)
1908 {
1909 case 'r':
1910 case 'V':
1911 case 'K':
1912 {
1913 unsigned cv = 0;
1914 const char* t = parse_cv_qualifiers(first, last, cv);
1915 if (t != first)
1916 {
1917 bool is_function = *t == 'F';
1918 size_t k0 = db.names.size();
1919 const char* t1 = parse_type(t, last, db);
1920 size_t k1 = db.names.size();
1921 if (t1 != t)
1922 {
1923 if (is_function)
1924 db.subs.pop_back();
1925 db.subs.emplace_back(db.names.get_allocator());
1926 for (size_t k = k0; k < k1; ++k)
1927 {
1928 if (is_function)
1929 {
1930 size_t p = db.names[k].second.size();
1931 if (db.names[k].second[p - 2] == '&' &&
1932 db.names[k].second[p - 1] == '&')
1933 p -= 2;
1934 else if (db.names[k].second.back() == '&')
1935 p -= 1;
1936 if (cv & 1)
1937 {
1938 db.names[k].second.insert(p, " const");
1939 p += 6;
1940 }
1941 if (cv & 2)
1942 {
1943 db.names[k].second.insert(p, " volatile");
1944 p += 9;
1945 }
1946 if (cv & 4)
1947 db.names[k].second.insert(p, " restrict");
1948 }
1949 else
1950 {
1951 if (cv & 1)
1952 db.names[k].first.append(" const");
1953 if (cv & 2)
1954 db.names[k].first.append(" volatile");
1955 if (cv & 4)
1956 db.names[k].first.append(" restrict");
1957 }
1958 db.subs.back().push_back(db.names[k]);
1959 }
1960 first = t1;
1961 }
1962 }
1963 }
1964 break;
1965 default:
1966 {
1967 const char* t = parse_builtin_type(first, last, db);
1968 if (t != first)
1969 {
1970 first = t;
1971 }
1972 else
1973 {
1974 switch (*first)
1975 {
1976 case 'A':
1977 t = parse_array_type(first, last, db);
1978 if (t != first)
1979 {
1980 if (db.names.empty())
1981 return first;
1982 first = t;
1983 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1984 }
1985 break;
1986 case 'C':
1987 t = parse_type(first+1, last, db);
1988 if (t != first+1)
1989 {
1990 if (db.names.empty())
1991 return first;
1992 db.names.back().first.append(" complex");
1993 first = t;
1994 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1995 }
1996 break;
1997 case 'F':
1998 t = parse_function_type(first, last, db);
1999 if (t != first)
2000 {
2001 if (db.names.empty())
2002 return first;
2003 first = t;
2004 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2005 }
2006 break;
2007 case 'G':
2008 t = parse_type(first+1, last, db);
2009 if (t != first+1)
2010 {
2011 if (db.names.empty())
2012 return first;
2013 db.names.back().first.append(" imaginary");
2014 first = t;
2015 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2016 }
2017 break;
2018 case 'M':
2019 t = parse_pointer_to_member_type(first, last, db);
2020 if (t != first)
2021 {
2022 if (db.names.empty())
2023 return first;
2024 first = t;
2025 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2026 }
2027 break;
2028 case 'O':
2029 {
2030 size_t k0 = db.names.size();
2031 t = parse_type(first+1, last, db);
2032 size_t k1 = db.names.size();
2033 if (t != first+1)
2034 {
2035 db.subs.emplace_back(db.names.get_allocator());
2036 for (size_t k = k0; k < k1; ++k)
2037 {
2038 if (db.names[k].second.substr(0, 2) == " [")
2039 {
2040 db.names[k].first += " (";
2041 db.names[k].second.insert(0, ")");
2042 }
2043 else if (!db.names[k].second.empty() &&
2044 db.names[k].second.front() == '(')
2045 {
2046 db.names[k].first += "(";
2047 db.names[k].second.insert(0, ")");
2048 }
2049 db.names[k].first.append("&&");
2050 db.subs.back().push_back(db.names[k]);
2051 }
2052 first = t;
2053 }
2054 break;
2055 }
2056 case 'P':
2057 {
2058 size_t k0 = db.names.size();
2059 t = parse_type(first+1, last, db);
2060 size_t k1 = db.names.size();
2061 if (t != first+1)
2062 {
2063 db.subs.emplace_back(db.names.get_allocator());
2064 for (size_t k = k0; k < k1; ++k)
2065 {
2066 if (db.names[k].second.substr(0, 2) == " [")
2067 {
2068 db.names[k].first += " (";
2069 db.names[k].second.insert(0, ")");
2070 }
2071 else if (!db.names[k].second.empty() &&
2072 db.names[k].second.front() == '(')
2073 {
2074 db.names[k].first += "(";
2075 db.names[k].second.insert(0, ")");
2076 }
2077 if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
2078 {
2079 db.names[k].first.append("*");
2080 }
2081 else
2082 {
2083 db.names[k].first.replace(0, 11, "id");
2084 }
2085 db.subs.back().push_back(db.names[k]);
2086 }
2087 first = t;
2088 }
2089 break;
2090 }
2091 case 'R':
2092 {
2093 size_t k0 = db.names.size();
2094 t = parse_type(first+1, last, db);
2095 size_t k1 = db.names.size();
2096 if (t != first+1)
2097 {
2098 db.subs.emplace_back(db.names.get_allocator());
2099 for (size_t k = k0; k < k1; ++k)
2100 {
2101 if (db.names[k].second.substr(0, 2) == " [")
2102 {
2103 db.names[k].first += " (";
2104 db.names[k].second.insert(0, ")");
2105 }
2106 else if (!db.names[k].second.empty() &&
2107 db.names[k].second.front() == '(')
2108 {
2109 db.names[k].first += "(";
2110 db.names[k].second.insert(0, ")");
2111 }
2112 db.names[k].first.append("&");
2113 db.subs.back().push_back(db.names[k]);
2114 }
2115 first = t;
2116 }
2117 break;
2118 }
2119 case 'T':
2120 {
2121 size_t k0 = db.names.size();
2122 t = parse_template_param(first, last, db);
2123 size_t k1 = db.names.size();
2124 if (t != first)
2125 {
2126 db.subs.emplace_back(db.names.get_allocator());
2127 for (size_t k = k0; k < k1; ++k)
2128 db.subs.back().push_back(db.names[k]);
2129 if (db.try_to_parse_template_args && k1 == k0+1)
2130 {
2131 const char* t1 = parse_template_args(t, last, db);
2132 if (t1 != t)
2133 {
2134 auto args = db.names.back().move_full();
2135 db.names.pop_back();
2136 db.names.back().first += std::move(args);
2137 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2138 t = t1;
2139 }
2140 }
2141 first = t;
2142 }
2143 break;
2144 }
2145 case 'U':
2146 if (first+1 != last)
2147 {
2148 t = parse_source_name(first+1, last, db);
2149 if (t != first+1)
2150 {
2151 const char* t2 = parse_type(t, last, db);
2152 if (t2 != t)
2153 {
2154 if (db.names.size() < 2)
2155 return first;
2156 auto type = db.names.back().move_full();
2157 db.names.pop_back();
2158 if (db.names.back().first.substr(0, 9) != "objcproto")
2159 {
2160 db.names.back() = type + " " + db.names.back().move_full();
2161 }
2162 else
2163 {
2164 auto proto = db.names.back().move_full();
2165 db.names.pop_back();
2166 t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2167 if (t != proto.data() + 9)
2168 {
2169 db.names.back() = type + "<" + db.names.back().move_full() + ">";
2170 }
2171 else
2172 {
2173 db.names.push_back(type + " " + proto);
2174 }
2175 }
2176 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2177 first = t2;
2178 }
2179 }
2180 }
2181 break;
2182 case 'S':
2183 if (first+1 != last && first[1] == 't')
2184 {
2185 t = parse_name(first, last, db);
2186 if (t != first)
2187 {
2188 if (db.names.empty())
2189 return first;
2190 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2191 first = t;
2192 }
2193 }
2194 else
2195 {
2196 t = parse_substitution(first, last, db);
2197 if (t != first)
2198 {
2199 first = t;
2200 // Parsed a substitution. If the substitution is a
2201 // <template-param> it might be followed by <template-args>.
2202 t = parse_template_args(first, last, db);
2203 if (t != first)
2204 {
2205 if (db.names.size() < 2)
2206 return first;
2207 auto template_args = db.names.back().move_full();
2208 db.names.pop_back();
2209 db.names.back().first += template_args;
2210 // Need to create substitution for <template-template-param> <template-args>
2211 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2212 first = t;
2213 }
2214 }
2215 }
2216 break;
2217 case 'D':
2218 if (first+1 != last)
2219 {
2220 switch (first[1])
2221 {
2222 case 'p':
2223 {
2224 size_t k0 = db.names.size();
2225 t = parse_type(first+2, last, db);
2226 size_t k1 = db.names.size();
2227 if (t != first+2)
2228 {
2229 db.subs.emplace_back(db.names.get_allocator());
2230 for (size_t k = k0; k < k1; ++k)
2231 db.subs.back().push_back(db.names[k]);
2232 first = t;
2233 return first;
2234 }
2235 break;
2236 }
2237 case 't':
2238 case 'T':
2239 t = parse_decltype(first, last, db);
2240 if (t != first)
2241 {
2242 if (db.names.empty())
2243 return first;
2244 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2245 first = t;
2246 return first;
2247 }
2248 break;
2249 case 'v':
2250 t = parse_vector_type(first, last, db);
2251 if (t != first)
2252 {
2253 if (db.names.empty())
2254 return first;
2255 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2256 first = t;
2257 return first;
2258 }
2259 break;
2260 }
2261 }
2262 // drop through
2263 default:
2264 // must check for builtin-types before class-enum-types to avoid
2265 // ambiguities with operator-names
2266 t = parse_builtin_type(first, last, db);
2267 if (t != first)
2268 {
2269 first = t;
2270 }
2271 else
2272 {
2273 t = parse_name(first, last, db);
2274 if (t != first)
2275 {
2276 if (db.names.empty())
2277 return first;
2278 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2279 first = t;
2280 }
2281 }
2282 break;
2283 }
2284 }
2285 break;
2286 }
2287 }
2288 }
2289 return first;
2290 }
2291
2292 // <operator-name>
2293 // ::= aa # &&
2294 // ::= ad # & (unary)
2295 // ::= an # &
2296 // ::= aN # &=
2297 // ::= aS # =
2298 // ::= cl # ()
2299 // ::= cm # ,
2300 // ::= co # ~
2301 // ::= cv <type> # (cast)
2302 // ::= da # delete[]
2303 // ::= de # * (unary)
2304 // ::= dl # delete
2305 // ::= dv # /
2306 // ::= dV # /=
2307 // ::= eo # ^
2308 // ::= eO # ^=
2309 // ::= eq # ==
2310 // ::= ge # >=
2311 // ::= gt # >
2312 // ::= ix # []
2313 // ::= le # <=
2314 // ::= li <source-name> # operator ""
2315 // ::= ls # <<
2316 // ::= lS # <<=
2317 // ::= lt # <
2318 // ::= mi # -
2319 // ::= mI # -=
2320 // ::= ml # *
2321 // ::= mL # *=
2322 // ::= mm # -- (postfix in <expression> context)
2323 // ::= na # new[]
2324 // ::= ne # !=
2325 // ::= ng # - (unary)
2326 // ::= nt # !
2327 // ::= nw # new
2328 // ::= oo # ||
2329 // ::= or # |
2330 // ::= oR # |=
2331 // ::= pm # ->*
2332 // ::= pl # +
2333 // ::= pL # +=
2334 // ::= pp # ++ (postfix in <expression> context)
2335 // ::= ps # + (unary)
2336 // ::= pt # ->
2337 // ::= qu # ?
2338 // ::= rm # %
2339 // ::= rM # %=
2340 // ::= rs # >>
2341 // ::= rS # >>=
2342 // ::= v <digit> <source-name> # vendor extended operator
2343
2344 template <class C>
2345 const char*
2346 parse_operator_name(const char* first, const char* last, C& db)
2347 {
2348 if (last - first >= 2)
2349 {
2350 switch (first[0])
2351 {
2352 case 'a':
2353 switch (first[1])
2354 {
2355 case 'a':
2356 db.names.push_back("operator&&");
2357 first += 2;
2358 break;
2359 case 'd':
2360 case 'n':
2361 db.names.push_back("operator&");
2362 first += 2;
2363 break;
2364 case 'N':
2365 db.names.push_back("operator&=");
2366 first += 2;
2367 break;
2368 case 'S':
2369 db.names.push_back("operator=");
2370 first += 2;
2371 break;
2372 }
2373 break;
2374 case 'c':
2375 switch (first[1])
2376 {
2377 case 'l':
2378 db.names.push_back("operator()");
2379 first += 2;
2380 break;
2381 case 'm':
2382 db.names.push_back("operator,");
2383 first += 2;
2384 break;
2385 case 'o':
2386 db.names.push_back("operator~");
2387 first += 2;
2388 break;
2389 case 'v':
2390 {
2391 bool try_to_parse_template_args = db.try_to_parse_template_args;
2392 db.try_to_parse_template_args = false;
2393 const char* t = parse_type(first+2, last, db);
2394 db.try_to_parse_template_args = try_to_parse_template_args;
2395 if (t != first+2)
2396 {
2397 if (db.names.empty())
2398 return first;
2399 db.names.back().first.insert(0, "operator ");
2400 db.parsed_ctor_dtor_cv = true;
2401 first = t;
2402 }
2403 }
2404 break;
2405 }
2406 break;
2407 case 'd':
2408 switch (first[1])
2409 {
2410 case 'a':
2411 db.names.push_back("operator delete[]");
2412 first += 2;
2413 break;
2414 case 'e':
2415 db.names.push_back("operator*");
2416 first += 2;
2417 break;
2418 case 'l':
2419 db.names.push_back("operator delete");
2420 first += 2;
2421 break;
2422 case 'v':
2423 db.names.push_back("operator/");
2424 first += 2;
2425 break;
2426 case 'V':
2427 db.names.push_back("operator/=");
2428 first += 2;
2429 break;
2430 }
2431 break;
2432 case 'e':
2433 switch (first[1])
2434 {
2435 case 'o':
2436 db.names.push_back("operator^");
2437 first += 2;
2438 break;
2439 case 'O':
2440 db.names.push_back("operator^=");
2441 first += 2;
2442 break;
2443 case 'q':
2444 db.names.push_back("operator==");
2445 first += 2;
2446 break;
2447 }
2448 break;
2449 case 'g':
2450 switch (first[1])
2451 {
2452 case 'e':
2453 db.names.push_back("operator>=");
2454 first += 2;
2455 break;
2456 case 't':
2457 db.names.push_back("operator>");
2458 first += 2;
2459 break;
2460 }
2461 break;
2462 case 'i':
2463 if (first[1] == 'x')
2464 {
2465 db.names.push_back("operator[]");
2466 first += 2;
2467 }
2468 break;
2469 case 'l':
2470 switch (first[1])
2471 {
2472 case 'e':
2473 db.names.push_back("operator<=");
2474 first += 2;
2475 break;
2476 case 'i':
2477 {
2478 const char* t = parse_source_name(first+2, last, db);
2479 if (t != first+2)
2480 {
2481 if (db.names.empty())
2482 return first;
2483 db.names.back().first.insert(0, "operator\"\" ");
2484 first = t;
2485 }
2486 }
2487 break;
2488 case 's':
2489 db.names.push_back("operator<<");
2490 first += 2;
2491 break;
2492 case 'S':
2493 db.names.push_back("operator<<=");
2494 first += 2;
2495 break;
2496 case 't':
2497 db.names.push_back("operator<");
2498 first += 2;
2499 break;
2500 }
2501 break;
2502 case 'm':
2503 switch (first[1])
2504 {
2505 case 'i':
2506 db.names.push_back("operator-");
2507 first += 2;
2508 break;
2509 case 'I':
2510 db.names.push_back("operator-=");
2511 first += 2;
2512 break;
2513 case 'l':
2514 db.names.push_back("operator*");
2515 first += 2;
2516 break;
2517 case 'L':
2518 db.names.push_back("operator*=");
2519 first += 2;
2520 break;
2521 case 'm':
2522 db.names.push_back("operator--");
2523 first += 2;
2524 break;
2525 }
2526 break;
2527 case 'n':
2528 switch (first[1])
2529 {
2530 case 'a':
2531 db.names.push_back("operator new[]");
2532 first += 2;
2533 break;
2534 case 'e':
2535 db.names.push_back("operator!=");
2536 first += 2;
2537 break;
2538 case 'g':
2539 db.names.push_back("operator-");
2540 first += 2;
2541 break;
2542 case 't':
2543 db.names.push_back("operator!");
2544 first += 2;
2545 break;
2546 case 'w':
2547 db.names.push_back("operator new");
2548 first += 2;
2549 break;
2550 }
2551 break;
2552 case 'o':
2553 switch (first[1])
2554 {
2555 case 'o':
2556 db.names.push_back("operator||");
2557 first += 2;
2558 break;
2559 case 'r':
2560 db.names.push_back("operator|");
2561 first += 2;
2562 break;
2563 case 'R':
2564 db.names.push_back("operator|=");
2565 first += 2;
2566 break;
2567 }
2568 break;
2569 case 'p':
2570 switch (first[1])
2571 {
2572 case 'm':
2573 db.names.push_back("operator->*");
2574 first += 2;
2575 break;
2576 case 'l':
2577 db.names.push_back("operator+");
2578 first += 2;
2579 break;
2580 case 'L':
2581 db.names.push_back("operator+=");
2582 first += 2;
2583 break;
2584 case 'p':
2585 db.names.push_back("operator++");
2586 first += 2;
2587 break;
2588 case 's':
2589 db.names.push_back("operator+");
2590 first += 2;
2591 break;
2592 case 't':
2593 db.names.push_back("operator->");
2594 first += 2;
2595 break;
2596 }
2597 break;
2598 case 'q':
2599 if (first[1] == 'u')
2600 {
2601 db.names.push_back("operator?");
2602 first += 2;
2603 }
2604 break;
2605 case 'r':
2606 switch (first[1])
2607 {
2608 case 'm':
2609 db.names.push_back("operator%");
2610 first += 2;
2611 break;
2612 case 'M':
2613 db.names.push_back("operator%=");
2614 first += 2;
2615 break;
2616 case 's':
2617 db.names.push_back("operator>>");
2618 first += 2;
2619 break;
2620 case 'S':
2621 db.names.push_back("operator>>=");
2622 first += 2;
2623 break;
2624 }
2625 break;
2626 case 'v':
2627 if (std::isdigit(first[1]))
2628 {
2629 const char* t = parse_source_name(first+2, last, db);
2630 if (t != first+2)
2631 {
2632 if (db.names.empty())
2633 return first;
2634 db.names.back().first.insert(0, "operator ");
2635 first = t;
2636 }
2637 }
2638 break;
2639 }
2640 }
2641 return first;
2642 }
2643
2644 template <class C>
2645 const char*
2646 parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db)
2647 {
2648 const char* t = parse_number(first, last);
2649 if (t != first && t != last && *t == 'E')
2650 {
2651 if (lit.size() > 3)
2652 db.names.push_back("(" + lit + ")");
2653 else
2654 db.names.emplace_back();
2655 if (*first == 'n')
2656 {
2657 db.names.back().first += '-';
2658 ++first;
2659 }
2660 db.names.back().first.append(first, t);
2661 if (lit.size() <= 3)
2662 db.names.back().first += lit;
2663 first = t+1;
2664 }
2665 return first;
2666 }
2667
2668 // <expr-primary> ::= L <type> <value number> E # integer literal
2669 // ::= L <type> <value float> E # floating literal
2670 // ::= L <string type> E # string literal
2671 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
2672 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
2673 // ::= L <mangled-name> E # external name
2674
2675 template <class C>
2676 const char*
2677 parse_expr_primary(const char* first, const char* last, C& db)
2678 {
2679 if (last - first >= 4 && *first == 'L')
2680 {
2681 switch (first[1])
2682 {
2683 case 'w':
2684 {
2685 const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
2686 if (t != first+2)
2687 first = t;
2688 }
2689 break;
2690 case 'b':
2691 if (first[3] == 'E')
2692 {
2693 switch (first[2])
2694 {
2695 case '0':
2696 db.names.push_back("false");
2697 first += 4;
2698 break;
2699 case '1':
2700 db.names.push_back("true");
2701 first += 4;
2702 break;
2703 }
2704 }
2705 break;
2706 case 'c':
2707 {
2708 const char* t = parse_integer_literal(first+2, last, "char", db);
2709 if (t != first+2)
2710 first = t;
2711 }
2712 break;
2713 case 'a':
2714 {
2715 const char* t = parse_integer_literal(first+2, last, "signed char", db);
2716 if (t != first+2)
2717 first = t;
2718 }
2719 break;
2720 case 'h':
2721 {
2722 const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
2723 if (t != first+2)
2724 first = t;
2725 }
2726 break;
2727 case 's':
2728 {
2729 const char* t = parse_integer_literal(first+2, last, "short", db);
2730 if (t != first+2)
2731 first = t;
2732 }
2733 break;
2734 case 't':
2735 {
2736 const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
2737 if (t != first+2)
2738 first = t;
2739 }
2740 break;
2741 case 'i':
2742 {
2743 const char* t = parse_integer_literal(first+2, last, "", db);
2744 if (t != first+2)
2745 first = t;
2746 }
2747 break;
2748 case 'j':
2749 {
2750 const char* t = parse_integer_literal(first+2, last, "u", db);
2751 if (t != first+2)
2752 first = t;
2753 }
2754 break;
2755 case 'l':
2756 {
2757 const char* t = parse_integer_literal(first+2, last, "l", db);
2758 if (t != first+2)
2759 first = t;
2760 }
2761 break;
2762 case 'm':
2763 {
2764 const char* t = parse_integer_literal(first+2, last, "ul", db);
2765 if (t != first+2)
2766 first = t;
2767 }
2768 break;
2769 case 'x':
2770 {
2771 const char* t = parse_integer_literal(first+2, last, "ll", db);
2772 if (t != first+2)
2773 first = t;
2774 }
2775 break;
2776 case 'y':
2777 {
2778 const char* t = parse_integer_literal(first+2, last, "ull", db);
2779 if (t != first+2)
2780 first = t;
2781 }
2782 break;
2783 case 'n':
2784 {
2785 const char* t = parse_integer_literal(first+2, last, "__int128", db);
2786 if (t != first+2)
2787 first = t;
2788 }
2789 break;
2790 case 'o':
2791 {
2792 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
2793 if (t != first+2)
2794 first = t;
2795 }
2796 break;
2797 case 'f':
2798 {
2799 const char* t = parse_floating_number<float>(first+2, last, db);
2800 if (t != first+2)
2801 first = t;
2802 }
2803 break;
2804 case 'd':
2805 {
2806 const char* t = parse_floating_number<double>(first+2, last, db);
2807 if (t != first+2)
2808 first = t;
2809 }
2810 break;
2811 case 'e':
2812 {
2813 const char* t = parse_floating_number<long double>(first+2, last, db);
2814 if (t != first+2)
2815 first = t;
2816 }
2817 break;
2818 case '_':
2819 if (first[2] == 'Z')
2820 {
2821 const char* t = parse_encoding(first+3, last, db);
2822 if (t != first+3 && t != last && *t == 'E')
2823 first = t+1;
2824 }
2825 break;
2826 case 'T':
2827 // Invalid mangled name per
2828 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2829 break;
2830 default:
2831 {
2832 // might be named type
2833 const char* t = parse_type(first+1, last, db);
2834 if (t != first+1 && t != last)
2835 {
2836 if (*t != 'E')
2837 {
2838 const char* n = t;
2839 for (; n != last && isdigit(*n); ++n)
2840 ;
2841 if (n != t && n != last && *n == 'E')
2842 {
2843 if (db.names.empty())
2844 return first;
2845 db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
2846 first = n+1;
2847 break;
2848 }
2849 }
2850 else
2851 {
2852 first = t+1;
2853 break;
2854 }
2855 }
2856 }
2857 }
2858 }
2859 return first;
2860 }
2861
2862 template <class String>
2863 String
2864 base_name(String& s)
2865 {
2866 if (s.empty())
2867 return s;
2868 if (s == "std::string")
2869 {
2870 s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2871 return "basic_string";
2872 }
2873 if (s == "std::istream")
2874 {
2875 s = "std::basic_istream<char, std::char_traits<char> >";
2876 return "basic_istream";
2877 }
2878 if (s == "std::ostream")
2879 {
2880 s = "std::basic_ostream<char, std::char_traits<char> >";
2881 return "basic_ostream";
2882 }
2883 if (s == "std::iostream")
2884 {
2885 s = "std::basic_iostream<char, std::char_traits<char> >";
2886 return "basic_iostream";
2887 }
2888 const char* const pf = s.data();
2889 const char* pe = pf + s.size();
2890 if (pe[-1] == '>')
2891 {
2892 unsigned c = 1;
2893 while (true)
2894 {
2895 if (--pe == pf)
2896 return String();
2897 if (pe[-1] == '<')
2898 {
2899 if (--c == 0)
2900 {
2901 --pe;
2902 break;
2903 }
2904 }
2905 else if (pe[-1] == '>')
2906 ++c;
2907 }
2908 }
2909 if (pe - pf <= 1)
2910 return String();
2911 const char* p0 = pe - 1;
2912 for (; p0 != pf; --p0)
2913 {
2914 if (*p0 == ':')
2915 {
2916 ++p0;
2917 break;
2918 }
2919 }
2920 return String(p0, pe);
2921 }
2922
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 # ?
2931
2932 template <class C>
2933 const char*
2934 parse_ctor_dtor_name(const char* first, const char* last, C& db)
2935 {
2936 if (last-first >= 2 && !db.names.empty())
2937 {
2938 switch (first[0])
2939 {
2940 case 'C':
2941 switch (first[1])
2942 {
2943 case '1':
2944 case '2':
2945 case '3':
2946 case '5':
2947 if (db.names.empty())
2948 return first;
2949 db.names.push_back(base_name(db.names.back().first));
2950 first += 2;
2951 db.parsed_ctor_dtor_cv = true;
2952 break;
2953 }
2954 break;
2955 case 'D':
2956 switch (first[1])
2957 {
2958 case '0':
2959 case '1':
2960 case '2':
2961 case '5':
2962 if (db.names.empty())
2963 return first;
2964 db.names.push_back("~" + base_name(db.names.back().first));
2965 first += 2;
2966 db.parsed_ctor_dtor_cv = true;
2967 break;
2968 }
2969 break;
2970 }
2971 }
2972 return first;
2973 }
2974
2975 // <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2976 // ::= <closure-type-name>
2977 //
2978 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2979 //
2980 // <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2981
2982 template <class C>
2983 const char*
2984 parse_unnamed_type_name(const char* first, const char* last, C& db)
2985 {
2986 if (last - first > 2 && first[0] == 'U')
2987 {
2988 char type = first[1];
2989 switch (type)
2990 {
2991 case 't':
2992 {
2993 db.names.push_back(typename C::String("'unnamed"));
2994 const char* t0 = first+2;
2995 if (t0 == last)
2996 {
2997 db.names.pop_back();
2998 return first;
2999 }
3000 if (std::isdigit(*t0))
3001 {
3002 const char* t1 = t0 + 1;
3003 while (t1 != last && std::isdigit(*t1))
3004 ++t1;
3005 db.names.back().first.append(t0, t1);
3006 t0 = t1;
3007 }
3008 db.names.back().first.push_back('\'');
3009 if (t0 == last || *t0 != '_')
3010 {
3011 db.names.pop_back();
3012 return first;
3013 }
3014 first = t0 + 1;
3015 }
3016 break;
3017 case 'l':
3018 {
3019 db.names.push_back(typename C::String("'lambda'("));
3020 const char* t0 = first+2;
3021 if (first[2] == 'v')
3022 {
3023 db.names.back().first += ')';
3024 ++t0;
3025 }
3026 else
3027 {
3028 const char* t1 = parse_type(t0, last, db);
3029 if (t1 == t0)
3030 {
3031 if(!db.names.empty())
3032 db.names.pop_back();
3033 return first;
3034 }
3035 if (db.names.size() < 2)
3036 return first;
3037 auto tmp = db.names.back().move_full();
3038 db.names.pop_back();
3039 db.names.back().first.append(tmp);
3040 t0 = t1;
3041 while (true)
3042 {
3043 t1 = parse_type(t0, last, db);
3044 if (t1 == t0)
3045 break;
3046 if (db.names.size() < 2)
3047 return first;
3048 tmp = db.names.back().move_full();
3049 db.names.pop_back();
3050 if (!tmp.empty())
3051 {
3052 db.names.back().first.append(", ");
3053 db.names.back().first.append(tmp);
3054 }
3055 t0 = t1;
3056 }
3057 if(db.names.empty())
3058 return first;
3059 db.names.back().first.append(")");
3060 }
3061 if (t0 == last || *t0 != 'E')
3062 {
3063 if (!db.names.empty())
3064 db.names.pop_back();
3065 return first;
3066 }
3067 ++t0;
3068 if (t0 == last)
3069 {
3070 if(!db.names.empty())
3071 db.names.pop_back();
3072 return first;
3073 }
3074 if (std::isdigit(*t0))
3075 {
3076 const char* t1 = t0 + 1;
3077 while (t1 != last && std::isdigit(*t1))
3078 ++t1;
3079 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
3080 t0 = t1;
3081 }
3082 if (t0 == last || *t0 != '_')
3083 {
3084 if(!db.names.empty())
3085 db.names.pop_back();
3086 return first;
3087 }
3088 first = t0 + 1;
3089 }
3090 break;
3091 }
3092 }
3093 return first;
3094 }
3095
3096 // <unqualified-name> ::= <operator-name>
3097 // ::= <ctor-dtor-name>
3098 // ::= <source-name>
3099 // ::= <unnamed-type-name>
3100
3101 template <class C>
3102 const char*
3103 parse_unqualified_name(const char* first, const char* last, C& db)
3104 {
3105 if (first != last)
3106 {
3107 const char* t;
3108 switch (*first)
3109 {
3110 case 'C':
3111 case 'D':
3112 t = parse_ctor_dtor_name(first, last, db);
3113 if (t != first)
3114 first = t;
3115 break;
3116 case 'U':
3117 t = parse_unnamed_type_name(first, last, db);
3118 if (t != first)
3119 first = t;
3120 break;
3121 case '1':
3122 case '2':
3123 case '3':
3124 case '4':
3125 case '5':
3126 case '6':
3127 case '7':
3128 case '8':
3129 case '9':
3130 t = parse_source_name(first, last, db);
3131 if (t != first)
3132 first = t;
3133 break;
3134 default:
3135 t = parse_operator_name(first, last, db);
3136 if (t != first)
3137 first = t;
3138 break;
3139 };
3140 }
3141 return first;
3142 }
3143
3144 // <unscoped-name> ::= <unqualified-name>
3145 // ::= St <unqualified-name> # ::std::
3146 // extension ::= StL<unqualified-name>
3147
3148 template <class C>
3149 const char*
3150 parse_unscoped_name(const char* first, const char* last, C& db)
3151 {
3152 if (last - first >= 2)
3153 {
3154 const char* t0 = first;
3155 bool St = false;
3156 if (first[0] == 'S' && first[1] == 't')
3157 {
3158 t0 += 2;
3159 St = true;
3160 if (t0 != last && *t0 == 'L')
3161 ++t0;
3162 }
3163 const char* t1 = parse_unqualified_name(t0, last, db);
3164 if (t1 != t0)
3165 {
3166 if (St)
3167 {
3168 if (db.names.empty())
3169 return first;
3170 db.names.back().first.insert(0, "std::");
3171 }
3172 first = t1;
3173 }
3174 }
3175 return first;
3176 }
3177
3178 // at <type> # alignof (a type)
3179
3180 template <class C>
3181 const char*
3182 parse_alignof_type(const char* first, const char* last, C& db)
3183 {
3184 if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
3185 {
3186 const char* t = parse_type(first+2, last, db);
3187 if (t != first+2)
3188 {
3189 if (db.names.empty())
3190 return first;
3191 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3192 first = t;
3193 }
3194 }
3195 return first;
3196 }
3197
3198 // az <expression> # alignof (a expression)
3199
3200 template <class C>
3201 const char*
3202 parse_alignof_expr(const char* first, const char* last, C& db)
3203 {
3204 if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
3205 {
3206 const char* t = parse_expression(first+2, last, db);
3207 if (t != first+2)
3208 {
3209 if (db.names.empty())
3210 return first;
3211 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3212 first = t;
3213 }
3214 }
3215 return first;
3216 }
3217
3218 template <class C>
3219 const char*
3220 parse_noexcept_expression(const char* first, const char* last, C& db)
3221 {
3222 const char* t1 = parse_expression(first, last, db);
3223 if (t1 != first)
3224 {
3225 if (db.names.empty())
3226 return first;
3227 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
3228 first = t1;
3229 }
3230 return first;
3231 }
3232
3233 template <class C>
3234 const char*
3235 parse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db)
3236 {
3237 const char* t1 = parse_expression(first, last, db);
3238 if (t1 != first)
3239 {
3240 if (db.names.empty())
3241 return first;
3242 db.names.back().first = op + "(" + db.names.back().move_full() + ")";
3243 first = t1;
3244 }
3245 return first;
3246 }
3247
3248 template <class C>
3249 const char*
3250 parse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db)
3251 {
3252 const char* t1 = parse_expression(first, last, db);
3253 if (t1 != first)
3254 {
3255 const char* t2 = parse_expression(t1, last, db);
3256 if (t2 != t1)
3257 {
3258 if (db.names.size() < 2)
3259 return first;
3260 auto op2 = db.names.back().move_full();
3261 db.names.pop_back();
3262 auto op1 = db.names.back().move_full();
3263 auto& nm = db.names.back().first;
3264 nm.clear();
3265 if (op == ">")
3266 nm += '(';
3267 nm += "(" + op1 + ") " + op + " (" + op2 + ")";
3268 if (op == ">")
3269 nm += ')';
3270 first = t2;
3271 }
3272 else if(!db.names.empty())
3273 db.names.pop_back();
3274 }
3275 return first;
3276 }
3277
3278 // <expression> ::= <unary operator-name> <expression>
3279 // ::= <binary operator-name> <expression> <expression>
3280 // ::= <ternary operator-name> <expression> <expression> <expression>
3281 // ::= cl <expression>+ E # call
3282 // ::= cv <type> <expression> # conversion with one argument
3283 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments
3284 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
3285 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3286 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
3287 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3288 // ::= [gs] dl <expression> # delete expression
3289 // ::= [gs] da <expression> # delete[] expression
3290 // ::= pp_ <expression> # prefix ++
3291 // ::= mm_ <expression> # prefix --
3292 // ::= ti <type> # typeid (type)
3293 // ::= te <expression> # typeid (expression)
3294 // ::= dc <type> <expression> # dynamic_cast<type> (expression)
3295 // ::= sc <type> <expression> # static_cast<type> (expression)
3296 // ::= cc <type> <expression> # const_cast<type> (expression)
3297 // ::= rc <type> <expression> # reinterpret_cast<type> (expression)
3298 // ::= st <type> # sizeof (a type)
3299 // ::= sz <expression> # sizeof (an expression)
3300 // ::= at <type> # alignof (a type)
3301 // ::= az <expression> # alignof (an expression)
3302 // ::= nx <expression> # noexcept (expression)
3303 // ::= <template-param>
3304 // ::= <function-param>
3305 // ::= dt <expression> <unresolved-name> # expr.name
3306 // ::= pt <expression> <unresolved-name> # expr->name
3307 // ::= ds <expression> <expression> # expr.*expr
3308 // ::= sZ <template-param> # size of a parameter pack
3309 // ::= sZ <function-param> # size of a function parameter pack
3310 // ::= sp <expression> # pack expansion
3311 // ::= tw <expression> # throw expression
3312 // ::= tr # throw with no operand (rethrow)
3313 // ::= <unresolved-name> # f(p), N::f(p), ::f(p),
3314 // # freestanding dependent name (e.g., T::x),
3315 // # objectless nonstatic member reference
3316 // ::= <expr-primary>
3317
3318 template <class C>
3319 const char*
3320 parse_expression(const char* first, const char* last, C& db)
3321 {
3322 if (last - first >= 2)
3323 {
3324 const char* t = first;
3325 bool parsed_gs = false;
3326 if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
3327 {
3328 t += 2;
3329 parsed_gs = true;
3330 }
3331 switch (*t)
3332 {
3333 case 'L':
3334 first = parse_expr_primary(first, last, db);
3335 break;
3336 case 'T':
3337 first = parse_template_param(first, last, db);
3338 break;
3339 case 'f':
3340 first = parse_function_param(first, last, db);
3341 break;
3342 case 'a':
3343 switch (t[1])
3344 {
3345 case 'a':
3346 t = parse_binary_expression(first+2, last, "&&", db);
3347 if (t != first+2)
3348 first = t;
3349 break;
3350 case 'd':
3351 t = parse_prefix_expression(first+2, last, "&", db);
3352 if (t != first+2)
3353 first = t;
3354 break;
3355 case 'n':
3356 t = parse_binary_expression(first+2, last, "&", db);
3357 if (t != first+2)
3358 first = t;
3359 break;
3360 case 'N':
3361 t = parse_binary_expression(first+2, last, "&=", db);
3362 if (t != first+2)
3363 first = t;
3364 break;
3365 case 'S':
3366 t = parse_binary_expression(first+2, last, "=", db);
3367 if (t != first+2)
3368 first = t;
3369 break;
3370 case 't':
3371 first = parse_alignof_type(first, last, db);
3372 break;
3373 case 'z':
3374 first = parse_alignof_expr(first, last, db);
3375 break;
3376 }
3377 break;
3378 case 'c':
3379 switch (t[1])
3380 {
3381 case 'c':
3382 first = parse_const_cast_expr(first, last, db);
3383 break;
3384 case 'l':
3385 first = parse_call_expr(first, last, db);
3386 break;
3387 case 'm':
3388 t = parse_binary_expression(first+2, last, ",", db);
3389 if (t != first+2)
3390 first = t;
3391 break;
3392 case 'o':
3393 t = parse_prefix_expression(first+2, last, "~", db);
3394 if (t != first+2)
3395 first = t;
3396 break;
3397 case 'v':
3398 first = parse_conversion_expr(first, last, db);
3399 break;
3400 }
3401 break;
3402 case 'd':
3403 switch (t[1])
3404 {
3405 case 'a':
3406 {
3407 const char* t1 = parse_expression(t+2, last, db);
3408 if (t1 != t+2)
3409 {
3410 if (db.names.empty())
3411 return first;
3412 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3413 "delete[] " + db.names.back().move_full();
3414 first = t1;
3415 }
3416 }
3417 break;
3418 case 'c':
3419 first = parse_dynamic_cast_expr(first, last, db);
3420 break;
3421 case 'e':
3422 t = parse_prefix_expression(first+2, last, "*", db);
3423 if (t != first+2)
3424 first = t;
3425 break;
3426 case 'l':
3427 {
3428 const char* t1 = parse_expression(t+2, last, db);
3429 if (t1 != t+2)
3430 {
3431 if (db.names.empty())
3432 return first;
3433 db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3434 "delete " + db.names.back().move_full();
3435 first = t1;
3436 }
3437 }
3438 break;
3439 case 'n':
3440 return parse_unresolved_name(first, last, db);
3441 case 's':
3442 first = parse_dot_star_expr(first, last, db);
3443 break;
3444 case 't':
3445 first = parse_dot_expr(first, last, db);
3446 break;
3447 case 'v':
3448 t = parse_binary_expression(first+2, last, "/", db);
3449 if (t != first+2)
3450 first = t;
3451 break;
3452 case 'V':
3453 t = parse_binary_expression(first+2, last, "/=", db);
3454 if (t != first+2)
3455 first = t;
3456 break;
3457 }
3458 break;
3459 case 'e':
3460 switch (t[1])
3461 {
3462 case 'o':
3463 t = parse_binary_expression(first+2, last, "^", db);
3464 if (t != first+2)
3465 first = t;
3466 break;
3467 case 'O':
3468 t = parse_binary_expression(first+2, last, "^=", db);
3469 if (t != first+2)
3470 first = t;
3471 break;
3472 case 'q':
3473 t = parse_binary_expression(first+2, last, "==", db);
3474 if (t != first+2)
3475 first = t;
3476 break;
3477 }
3478 break;
3479 case 'g':
3480 switch (t[1])
3481 {
3482 case 'e':
3483 t = parse_binary_expression(first+2, last, ">=", db);
3484 if (t != first+2)
3485 first = t;
3486 break;
3487 case 't':
3488 t = parse_binary_expression(first+2, last, ">", db);
3489 if (t != first+2)
3490 first = t;
3491 break;
3492 }
3493 break;
3494 case 'i':
3495 if (t[1] == 'x')
3496 {
3497 const char* t1 = parse_expression(first+2, last, db);
3498 if (t1 != first+2)
3499 {
3500 const char* t2 = parse_expression(t1, last, db);
3501 if (t2 != t1)
3502 {
3503 if (db.names.size() < 2)
3504 return first;
3505 auto op2 = db.names.back().move_full();
3506 db.names.pop_back();
3507 auto op1 = db.names.back().move_full();
3508 db.names.back() = "(" + op1 + ")[" + op2 + "]";
3509 first = t2;
3510 }
3511 else if (!db.names.empty())
3512 db.names.pop_back();
3513 }
3514 }
3515 break;
3516 case 'l':
3517 switch (t[1])
3518 {
3519 case 'e':
3520 t = parse_binary_expression(first+2, last, "<=", db);
3521 if (t != first+2)
3522 first = t;
3523 break;
3524 case 's':
3525 t = parse_binary_expression(first+2, last, "<<", db);
3526 if (t != first+2)
3527 first = t;
3528 break;
3529 case 'S':
3530 t = parse_binary_expression(first+2, last, "<<=", db);
3531 if (t != first+2)
3532 first = t;
3533 break;
3534 case 't':
3535 t = parse_binary_expression(first+2, last, "<", db);
3536 if (t != first+2)
3537 first = t;
3538 break;
3539 }
3540 break;
3541 case 'm':
3542 switch (t[1])
3543 {
3544 case 'i':
3545 t = parse_binary_expression(first+2, last, "-", db);
3546 if (t != first+2)
3547 first = t;
3548 break;
3549 case 'I':
3550 t = parse_binary_expression(first+2, last, "-=", db);
3551 if (t != first+2)
3552 first = t;
3553 break;
3554 case 'l':
3555 t = parse_binary_expression(first+2, last, "*", db);
3556 if (t != first+2)
3557 first = t;
3558 break;
3559 case 'L':
3560 t = parse_binary_expression(first+2, last, "*=", db);
3561 if (t != first+2)
3562 first = t;
3563 break;
3564 case 'm':
3565 if (first+2 != last && first[2] == '_')
3566 {
3567 t = parse_prefix_expression(first+3, last, "--", db);
3568 if (t != first+3)
3569 first = t;
3570 }
3571 else
3572 {
3573 const char* t1 = parse_expression(first+2, last, db);
3574 if (t1 != first+2)
3575 {
3576 if (db.names.empty())
3577 return first;
3578 db.names.back() = "(" + db.names.back().move_full() + ")--";
3579 first = t1;
3580 }
3581 }
3582 break;
3583 }
3584 break;
3585 case 'n':
3586 switch (t[1])
3587 {
3588 case 'a':
3589 case 'w':
3590 first = parse_new_expr(first, last, db);
3591 break;
3592 case 'e':
3593 t = parse_binary_expression(first+2, last, "!=", db);
3594 if (t != first+2)
3595 first = t;
3596 break;
3597 case 'g':
3598 t = parse_prefix_expression(first+2, last, "-", db);
3599 if (t != first+2)
3600 first = t;
3601 break;
3602 case 't':
3603 t = parse_prefix_expression(first+2, last, "!", db);
3604 if (t != first+2)
3605 first = t;
3606 break;
3607 case 'x':
3608 t = parse_noexcept_expression(first+2, last, db);
3609 if (t != first+2)
3610 first = t;
3611 break;
3612 }
3613 break;
3614 case 'o':
3615 switch (t[1])
3616 {
3617 case 'n':
3618 return parse_unresolved_name(first, last, db);
3619 case 'o':
3620 t = parse_binary_expression(first+2, last, "||", db);
3621 if (t != first+2)
3622 first = t;
3623 break;
3624 case 'r':
3625 t = parse_binary_expression(first+2, last, "|", db);
3626 if (t != first+2)
3627 first = t;
3628 break;
3629 case 'R':
3630 t = parse_binary_expression(first+2, last, "|=", db);
3631 if (t != first+2)
3632 first = t;
3633 break;
3634 }
3635 break;
3636 case 'p':
3637 switch (t[1])
3638 {
3639 case 'm':
3640 t = parse_binary_expression(first+2, last, "->*", db);
3641 if (t != first+2)
3642 first = t;
3643 break;
3644 case 'l':
3645 t = parse_binary_expression(first+2, last, "+", db);
3646 if (t != first+2)
3647 first = t;
3648 break;
3649 case 'L':
3650 t = parse_binary_expression(first+2, last, "+=", db);
3651 if (t != first+2)
3652 first = t;
3653 break;
3654 case 'p':
3655 if (first+2 != last && first[2] == '_')
3656 {
3657 t = parse_prefix_expression(first+3, last, "++", db);
3658 if (t != first+3)
3659 first = t;
3660 }
3661 else
3662 {
3663 const char* t1 = parse_expression(first+2, last, db);
3664 if (t1 != first+2)
3665 {
3666 if (db.names.empty())
3667 return first;
3668 db.names.back() = "(" + db.names.back().move_full() + ")++";
3669 first = t1;
3670 }
3671 }
3672 break;
3673 case 's':
3674 t = parse_prefix_expression(first+2, last, "+", db);
3675 if (t != first+2)
3676 first = t;
3677 break;
3678 case 't':
3679 first = parse_arrow_expr(first, last, db);
3680 break;
3681 }
3682 break;
3683 case 'q':
3684 if (t[1] == 'u')
3685 {
3686 const char* t1 = parse_expression(first+2, last, db);
3687 if (t1 != first+2)
3688 {
3689 const char* t2 = parse_expression(t1, last, db);
3690 if (t2 != t1)
3691 {
3692 const char* t3 = parse_expression(t2, last, db);
3693 if (t3 != t2)
3694 {
3695 if (db.names.size() < 3)
3696 return first;
3697 auto op3 = db.names.back().move_full();
3698 db.names.pop_back();
3699 auto op2 = db.names.back().move_full();
3700 db.names.pop_back();
3701 auto op1 = db.names.back().move_full();
3702 db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
3703 first = t3;
3704 }
3705 else
3706 {
3707 if (db.names.size() < 2)
3708 return first;
3709 db.names.pop_back();
3710 db.names.pop_back();
3711 }
3712 }
3713 else if (!db.names.empty())
3714 db.names.pop_back();
3715 }
3716 }
3717 break;
3718 case 'r':
3719 switch (t[1])
3720 {
3721 case 'c':
3722 first = parse_reinterpret_cast_expr(first, last, db);
3723 break;
3724 case 'm':
3725 t = parse_binary_expression(first+2, last, "%", db);
3726 if (t != first+2)
3727 first = t;
3728 break;
3729 case 'M':
3730 t = parse_binary_expression(first+2, last, "%=", db);
3731 if (t != first+2)
3732 first = t;
3733 break;
3734 case 's':
3735 t = parse_binary_expression(first+2, last, ">>", db);
3736 if (t != first+2)
3737 first = t;
3738 break;
3739 case 'S':
3740 t = parse_binary_expression(first+2, last, ">>=", db);
3741 if (t != first+2)
3742 first = t;
3743 break;
3744 }
3745 break;
3746 case 's':
3747 switch (t[1])
3748 {
3749 case 'c':
3750 first = parse_static_cast_expr(first, last, db);
3751 break;
3752 case 'p':
3753 first = parse_pack_expansion(first, last, db);
3754 break;
3755 case 'r':
3756 return parse_unresolved_name(first, last, db);
3757 case 't':
3758 first = parse_sizeof_type_expr(first, last, db);
3759 break;
3760 case 'z':
3761 first = parse_sizeof_expr_expr(first, last, db);
3762 break;
3763 case 'Z':
3764 if (last - t >= 3)
3765 {
3766 switch (t[2])
3767 {
3768 case 'T':
3769 first = parse_sizeof_param_pack_expr(first, last, db);
3770 break;
3771 case 'f':
3772 first = parse_sizeof_function_param_pack_expr(first, last, db);
3773 break;
3774 }
3775 }
3776 break;
3777 }
3778 break;
3779 case 't':
3780 switch (t[1])
3781 {
3782 case 'e':
3783 case 'i':
3784 first = parse_typeid_expr(first, last, db);
3785 break;
3786 case 'r':
3787 db.names.push_back("throw");
3788 first += 2;
3789 break;
3790 case 'w':
3791 first = parse_throw_expr(first, last, db);
3792 break;
3793 }
3794 break;
3795 case '1':
3796 case '2':
3797 case '3':
3798 case '4':
3799 case '5':
3800 case '6':
3801 case '7':
3802 case '8':
3803 case '9':
3804 return parse_unresolved_name(first, last, db);
3805 }
3806 }
3807 return first;
3808 }
3809
3810 // <template-arg> ::= <type> # type or template
3811 // ::= X <expression> E # expression
3812 // ::= <expr-primary> # simple expressions
3813 // ::= J <template-arg>* E # argument pack
3814 // ::= LZ <encoding> E # extension
3815
3816 template <class C>
3817 const char*
3818 parse_template_arg(const char* first, const char* last, C& db)
3819 {
3820 if (first != last)
3821 {
3822 const char* t;
3823 switch (*first)
3824 {
3825 case 'X':
3826 t = parse_expression(first+1, last, db);
3827 if (t != first+1)
3828 {
3829 if (t != last && *t == 'E')
3830 first = t+1;
3831 }
3832 break;
3833 case 'J':
3834 t = first+1;
3835 if (t == last)
3836 return first;
3837 while (*t != 'E')
3838 {
3839 const char* t1 = parse_template_arg(t, last, db);
3840 if (t1 == t)
3841 return first;
3842 t = t1;
3843 }
3844 first = t+1;
3845 break;
3846 case 'L':
3847 // <expr-primary> or LZ <encoding> E
3848 if (first+1 != last && first[1] == 'Z')
3849 {
3850 t = parse_encoding(first+2, last, db);
3851 if (t != first+2 && t != last && *t == 'E')
3852 first = t+1;
3853 }
3854 else
3855 first = parse_expr_primary(first, last, db);
3856 break;
3857 default:
3858 // <type>
3859 first = parse_type(first, last, db);
3860 break;
3861 }
3862 }
3863 return first;
3864 }
3865
3866 // <template-args> ::= I <template-arg>* E
3867 // extension, the abi says <template-arg>+
3868
3869 template <class C>
3870 const char*
3871 parse_template_args(const char* first, const char* last, C& db)
3872 {
3873 if (last - first >= 2 && *first == 'I')
3874 {
3875 if (db.tag_templates)
3876 db.template_param.back().clear();
3877 const char* t = first+1;
3878 typename C::String args("<");
3879 while (*t != 'E')
3880 {
3881 if (db.tag_templates)
3882 db.template_param.emplace_back(db.names.get_allocator());
3883 size_t k0 = db.names.size();
3884 const char* t1 = parse_template_arg(t, last, db);
3885 size_t k1 = db.names.size();
3886 if (db.tag_templates)
3887 db.template_param.pop_back();
3888 if (t1 == t || t1 == last)
3889 return first;
3890 if (db.tag_templates)
3891 {
3892 db.template_param.back().emplace_back(db.names.get_allocator());
3893 for (size_t k = k0; k < k1; ++k)
3894 db.template_param.back().back().push_back(db.names[k]);
3895 }
3896 for (size_t k = k0; k < k1; ++k)
3897 {
3898 if (args.size() > 1)
3899 args += ", ";
3900 args += db.names[k].move_full();
3901 }
3902 for (; k1 > k0; --k1)
3903 if (!db.names.empty())
3904 db.names.pop_back();
3905 t = t1;
3906 }
3907 first = t + 1;
3908 if (args.back() != '>')
3909 args += ">";
3910 else
3911 args += " >";
3912 db.names.push_back(std::move(args));
3913
3914 }
3915 return first;
3916 }
3917
3918 // <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
3919 // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
3920 //
3921 // <prefix> ::= <prefix> <unqualified-name>
3922 // ::= <template-prefix> <template-args>
3923 // ::= <template-param>
3924 // ::= <decltype>
3925 // ::= # empty
3926 // ::= <substitution>
3927 // ::= <prefix> <data-member-prefix>
3928 // extension ::= L
3929 //
3930 // <template-prefix> ::= <prefix> <template unqualified-name>
3931 // ::= <template-param>
3932 // ::= <substitution>
3933
3934 template <class C>
3935 const char*
3936 parse_nested_name(const char* first, const char* last, C& db,
3937 bool* ends_with_template_args)
3938 {
3939 if (first != last && *first == 'N')
3940 {
3941 unsigned cv;
3942 const char* t0 = parse_cv_qualifiers(first+1, last, cv);
3943 if (t0 == last)
3944 return first;
3945 db.ref = 0;
3946 if (*t0 == 'R')
3947 {
3948 db.ref = 1;
3949 ++t0;
3950 }
3951 else if (*t0 == 'O')
3952 {
3953 db.ref = 2;
3954 ++t0;
3955 }
3956 db.names.emplace_back();
3957 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
3958 {
3959 t0 += 2;
3960 db.names.back().first = "std";
3961 }
3962 if (t0 == last)
3963 {
3964 db.names.pop_back();
3965 return first;
3966 }
3967 bool pop_subs = false;
3968 bool component_ends_with_template_args = false;
3969 while (*t0 != 'E')
3970 {
3971 component_ends_with_template_args = false;
3972 const char* t1;
3973 switch (*t0)
3974 {
3975 case 'S':
3976 if (t0 + 1 != last && t0[1] == 't')
3977 goto do_parse_unqualified_name;
3978 t1 = parse_substitution(t0, last, db);
3979 if (t1 != t0 && t1 != last)
3980 {
3981 auto name = db.names.back().move_full();
3982 db.names.pop_back();
3983 if (db.names.empty())
3984 return first;
3985 if (!db.names.back().first.empty())
3986 {
3987 db.names.back().first += "::" + name;
3988 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3989 }
3990 else
3991 db.names.back().first = name;
3992 pop_subs = true;
3993 t0 = t1;
3994 }
3995 else
3996 return first;
3997 break;
3998 case 'T':
3999 t1 = parse_template_param(t0, last, db);
4000 if (t1 != t0 && t1 != last)
4001 {
4002 auto name = db.names.back().move_full();
4003 db.names.pop_back();
4004 if (db.names.empty())
4005 return first;
4006 if (!db.names.back().first.empty())
4007 db.names.back().first += "::" + name;
4008 else
4009 db.names.back().first = name;
4010 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4011 pop_subs = true;
4012 t0 = t1;
4013 }
4014 else
4015 return first;
4016 break;
4017 case 'D':
4018 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
4019 goto do_parse_unqualified_name;
4020 t1 = parse_decltype(t0, last, db);
4021 if (t1 != t0 && t1 != last)
4022 {
4023 auto name = db.names.back().move_full();
4024 db.names.pop_back();
4025 if (db.names.empty())
4026 return first;
4027 if (!db.names.back().first.empty())
4028 db.names.back().first += "::" + name;
4029 else
4030 db.names.back().first = name;
4031 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4032 pop_subs = true;
4033 t0 = t1;
4034 }
4035 else
4036 return first;
4037 break;
4038 case 'I':
4039 t1 = parse_template_args(t0, last, db);
4040 if (t1 != t0 && t1 != last)
4041 {
4042 auto name = db.names.back().move_full();
4043 db.names.pop_back();
4044 if (db.names.empty())
4045 return first;
4046 db.names.back().first += name;
4047 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4048 t0 = t1;
4049 component_ends_with_template_args = true;
4050 }
4051 else
4052 return first;
4053 break;
4054 case 'L':
4055 if (++t0 == last)
4056 return first;
4057 break;
4058 default:
4059 do_parse_unqualified_name:
4060 t1 = parse_unqualified_name(t0, last, db);
4061 if (t1 != t0 && t1 != last)
4062 {
4063 auto name = db.names.back().move_full();
4064 db.names.pop_back();
4065 if (db.names.empty())
4066 return first;
4067 if (!db.names.back().first.empty())
4068 db.names.back().first += "::" + name;
4069 else
4070 db.names.back().first = name;
4071 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4072 pop_subs = true;
4073 t0 = t1;
4074 }
4075 else
4076 return first;
4077 }
4078 }
4079 first = t0 + 1;
4080 db.cv = cv;
4081 if (pop_subs && !db.subs.empty())
4082 db.subs.pop_back();
4083 if (ends_with_template_args)
4084 *ends_with_template_args = component_ends_with_template_args;
4085 }
4086 return first;
4087 }
4088
4089 // <discriminator> := _ <non-negative number> # when number < 10
4090 // := __ <non-negative number> _ # when number >= 10
4091 // extension := decimal-digit+ # at the end of string
4092
4093 const char*
4094 parse_discriminator(const char* first, const char* last)
4095 {
4096 // parse but ignore discriminator
4097 if (first != last)
4098 {
4099 if (*first == '_')
4100 {
4101 const char* t1 = first+1;
4102 if (t1 != last)
4103 {
4104 if (std::isdigit(*t1))
4105 first = t1+1;
4106 else if (*t1 == '_')
4107 {
4108 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4109 ;
4110 if (t1 != last && *t1 == '_')
4111 first = t1 + 1;
4112 }
4113 }
4114 }
4115 else if (std::isdigit(*first))
4116 {
4117 const char* t1 = first+1;
4118 for (; t1 != last && std::isdigit(*t1); ++t1)
4119 ;
4120 if (t1 == last)
4121 first = last;
4122 }
4123 }
4124 return first;
4125 }
4126
4127 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
4128 // := Z <function encoding> E s [<discriminator>]
4129 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
4130
4131 template <class C>
4132 const char*
4133 parse_local_name(const char* first, const char* last, C& db,
4134 bool* ends_with_template_args)
4135 {
4136 if (first != last && *first == 'Z')
4137 {
4138 const char* t = parse_encoding(first+1, last, db);
4139 if (t != first+1 && t != last && *t == 'E' && ++t != last)
4140 {
4141 switch (*t)
4142 {
4143 case 's':
4144 first = parse_discriminator(t+1, last);
4145 if (db.names.empty())
4146 return first;
4147 db.names.back().first.append("::string literal");
4148 break;
4149 case 'd':
4150 if (++t != last)
4151 {
4152 const char* t1 = parse_number(t, last);
4153 if (t1 != last && *t1 == '_')
4154 {
4155 t = t1 + 1;
4156 t1 = parse_name(t, last, db,
4157 ends_with_template_args);
4158 if (t1 != t)
4159 {
4160 if (db.names.size() < 2)
4161 return first;
4162 auto name = db.names.back().move_full();
4163 db.names.pop_back();
4164 if (db.names.empty())
4165 return first;
4166 db.names.back().first.append("::");
4167 db.names.back().first.append(name);
4168 first = t1;
4169 }
4170 else if (!db.names.empty())
4171 db.names.pop_back();
4172 }
4173 }
4174 break;
4175 default:
4176 {
4177 const char* t1 = parse_name(t, last, db,
4178 ends_with_template_args);
4179 if (t1 != t)
4180 {
4181 // parse but ignore discriminator
4182 first = parse_discriminator(t1, last);
4183 if (db.names.size() < 2)
4184 return first;
4185 auto name = db.names.back().move_full();
4186 db.names.pop_back();
4187 if (db.names.empty())
4188 return first;
4189 db.names.back().first.append("::");
4190 db.names.back().first.append(name);
4191 }
4192 else if (!db.names.empty())
4193 db.names.pop_back();
4194 }
4195 break;
4196 }
4197 }
4198 }
4199 return first;
4200 }
4201
4202 // <name> ::= <nested-name> // N
4203 // ::= <local-name> # See Scope Encoding below // Z
4204 // ::= <unscoped-template-name> <template-args>
4205 // ::= <unscoped-name>
4206
4207 // <unscoped-template-name> ::= <unscoped-name>
4208 // ::= <substitution>
4209
4210 template <class C>
4211 const char*
4212 parse_name(const char* first, const char* last, C& db,
4213 bool* ends_with_template_args)
4214 {
4215 if (last - first >= 2)
4216 {
4217 const char* t0 = first;
4218 // extension: ignore L here
4219 if (*t0 == 'L')
4220 ++t0;
4221 switch (*t0)
4222 {
4223 case 'N':
4224 {
4225 const char* t1 = parse_nested_name(t0, last, db,
4226 ends_with_template_args);
4227 if (t1 != t0)
4228 first = t1;
4229 break;
4230 }
4231 case 'Z':
4232 {
4233 const char* t1 = parse_local_name(t0, last, db,
4234 ends_with_template_args);
4235 if (t1 != t0)
4236 first = t1;
4237 break;
4238 }
4239 default:
4240 {
4241 const char* t1 = parse_unscoped_name(t0, last, db);
4242 if (t1 != t0)
4243 {
4244 if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args>
4245 {
4246 if (db.names.empty())
4247 return first;
4248 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4249 t0 = t1;
4250 t1 = parse_template_args(t0, last, db);
4251 if (t1 != t0)
4252 {
4253 if (db.names.size() < 2)
4254 return first;
4255 auto tmp = db.names.back().move_full();
4256 db.names.pop_back();
4257 if (db.names.empty())
4258 return first;
4259 db.names.back().first += tmp;
4260 first = t1;
4261 if (ends_with_template_args)
4262 *ends_with_template_args = true;
4263 }
4264 }
4265 else // <unscoped-name>
4266 first = t1;
4267 }
4268 else
4269 { // try <substitution> <template-args>
4270 t1 = parse_substitution(t0, last, db);
4271 if (t1 != t0 && t1 != last && *t1 == 'I')
4272 {
4273 t0 = t1;
4274 t1 = parse_template_args(t0, last, db);
4275 if (t1 != t0)
4276 {
4277 if (db.names.size() < 2)
4278 return first;
4279 auto tmp = db.names.back().move_full();
4280 db.names.pop_back();
4281 if (db.names.empty())
4282 return first;
4283 db.names.back().first += tmp;
4284 first = t1;
4285 if (ends_with_template_args)
4286 *ends_with_template_args = true;
4287 }
4288 }
4289 }
4290 break;
4291 }
4292 }
4293 }
4294 return first;
4295 }
4296
4297 // <call-offset> ::= h <nv-offset> _
4298 // ::= v <v-offset> _
4299 //
4300 // <nv-offset> ::= <offset number>
4301 // # non-virtual base override
4302 //
4303 // <v-offset> ::= <offset number> _ <virtual offset number>
4304 // # virtual base override, with vcall offset
4305
4306 const char*
4307 parse_call_offset(const char* first, const char* last)
4308 {
4309 if (first != last)
4310 {
4311 switch (*first)
4312 {
4313 case 'h':
4314 {
4315 const char* t = parse_number(first + 1, last);
4316 if (t != first + 1 && t != last && *t == '_')
4317 first = t + 1;
4318 }
4319 break;
4320 case 'v':
4321 {
4322 const char* t = parse_number(first + 1, last);
4323 if (t != first + 1 && t != last && *t == '_')
4324 {
4325 const char* t2 = parse_number(++t, last);
4326 if (t2 != t && t2 != last && *t2 == '_')
4327 first = t2 + 1;
4328 }
4329 }
4330 break;
4331 }
4332 }
4333 return first;
4334 }
4335
4336 // <special-name> ::= TV <type> # virtual table
4337 // ::= TT <type> # VTT structure (construction vtable index)
4338 // ::= TI <type> # typeinfo structure
4339 // ::= TS <type> # typeinfo name (null-terminated byte string)
4340 // ::= Tc <call-offset> <call-offset> <base encoding>
4341 // # base is the nominal target function of thunk
4342 // # first call-offset is 'this' adjustment
4343 // # second call-offset is result adjustment
4344 // ::= T <call-offset> <base encoding>
4345 // # base is the nominal target function of thunk
4346 // ::= GV <object name> # Guard variable for one-time initialization
4347 // # No <type>
4348 // ::= TW <object name> # Thread-local wrapper
4349 // ::= TH <object name> # Thread-local initialization
4350 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4351 // extension ::= GR <object name> # reference temporary for object
4352
4353 template <class C>
4354 const char*
4355 parse_special_name(const char* first, const char* last, C& db)
4356 {
4357 if (last - first > 2)
4358 {
4359 const char* t;
4360 switch (*first)
4361 {
4362 case 'T':
4363 switch (first[1])
4364 {
4365 case 'V':
4366 // TV <type> # virtual table
4367 t = parse_type(first+2, last, db);
4368 if (t != first+2)
4369 {
4370 if (db.names.empty())
4371 return first;
4372 db.names.back().first.insert(0, "vtable for ");
4373 first = t;
4374 }
4375 break;
4376 case 'T':
4377 // TT <type> # VTT structure (construction vtable index)
4378 t = parse_type(first+2, last, db);
4379 if (t != first+2)
4380 {
4381 if (db.names.empty())
4382 return first;
4383 db.names.back().first.insert(0, "VTT for ");
4384 first = t;
4385 }
4386 break;
4387 case 'I':
4388 // TI <type> # typeinfo structure
4389 t = parse_type(first+2, last, db);
4390 if (t != first+2)
4391 {
4392 if (db.names.empty())
4393 return first;
4394 db.names.back().first.insert(0, "typeinfo for ");
4395 first = t;
4396 }
4397 break;
4398 case 'S':
4399 // TS <type> # typeinfo name (null-terminated byte string)
4400 t = parse_type(first+2, last, db);
4401 if (t != first+2)
4402 {
4403 if (db.names.empty())
4404 return first;
4405 db.names.back().first.insert(0, "typeinfo name for ");
4406 first = t;
4407 }
4408 break;
4409 case 'c':
4410 // Tc <call-offset> <call-offset> <base encoding>
4411 {
4412 const char* t0 = parse_call_offset(first+2, last);
4413 if (t0 == first+2)
4414 break;
4415 const char* t1 = parse_call_offset(t0, last);
4416 if (t1 == t0)
4417 break;
4418 t = parse_encoding(t1, last, db);
4419 if (t != t1)
4420 {
4421 if (db.names.empty())
4422 return first;
4423 db.names.back().first.insert(0, "covariant return thunk to ");
4424 first = t;
4425 }
4426 }
4427 break;
4428 case 'C':
4429 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4430 t = parse_type(first+2, last, db);
4431 if (t != first+2)
4432 {
4433 const char* t0 = parse_number(t, last);
4434 if (t0 != t && t0 != last && *t0 == '_')
4435 {
4436 const char* t1 = parse_type(++t0, last, db);
4437 if (t1 != t0)
4438 {
4439 if (db.names.size() < 2)
4440 return first;
4441 auto left = db.names.back().move_full();
4442 db.names.pop_back();
4443 if (db.names.empty())
4444 return first;
4445 db.names.back().first = "construction vtable for " +
4446 std::move(left) + "-in-" +
4447 db.names.back().move_full();
4448 first = t1;
4449 }
4450 }
4451 }
4452 break;
4453 case 'W':
4454 // TW <object name> # Thread-local wrapper
4455 t = parse_name(first + 2, last, db);
4456 if (t != first + 2)
4457 {
4458 if (db.names.empty())
4459 return first;
4460 db.names.back().first.insert(0, "thread-local wrapper routine for ");
4461 first = t;
4462 }
4463 break;
4464 case 'H':
4465 //TH <object name> # Thread-local initialization
4466 t = parse_name(first + 2, last, db);
4467 if (t != first + 2)
4468 {
4469 if (db.names.empty())
4470 return first;
4471 db.names.back().first.insert(0, "thread-local initialization routine for ");
4472 first = t;
4473 }
4474 break;
4475 default:
4476 // T <call-offset> <base encoding>
4477 {
4478 const char* t0 = parse_call_offset(first+1, last);
4479 if (t0 == first+1)
4480 break;
4481 t = parse_encoding(t0, last, db);
4482 if (t != t0)
4483 {
4484 if (db.names.empty())
4485 return first;
4486 if (first[1] == 'v')
4487 {
4488 db.names.back().first.insert(0, "virtual thunk to ");
4489 first = t;
4490 }
4491 else
4492 {
4493 db.names.back().first.insert(0, "non-virtual thunk to ");
4494 first = t;
4495 }
4496 }
4497 }
4498 break;
4499 }
4500 break;
4501 case 'G':
4502 switch (first[1])
4503 {
4504 case 'V':
4505 // GV <object name> # Guard variable for one-time initialization
4506 t = parse_name(first+2, last, db);
4507 if (t != first+2)
4508 {
4509 if (db.names.empty())
4510 return first;
4511 db.names.back().first.insert(0, "guard variable for ");
4512 first = t;
4513 }
4514 break;
4515 case 'R':
4516 // extension ::= GR <object name> # reference temporary for object
4517 t = parse_name(first+2, last, db);
4518 if (t != first+2)
4519 {
4520 if (db.names.empty())
4521 return first;
4522 db.names.back().first.insert(0, "reference temporary for ");
4523 first = t;
4524 }
4525 break;
4526 }
4527 break;
4528 }
4529 }
4530 return first;
4531 }
4532
4533 template <class T>
4534 class save_value
4535 {
4536 T& restore_;
4537 T original_value_;
4538 public:
4539 save_value(T& restore)
4540 : restore_(restore),
4541 original_value_(restore)
4542 {}
4543
4544 ~save_value()
4545 {
4546 restore_ = std::move(original_value_);
4547 }
4548
4549 save_value(const save_value&) = delete;
4550 save_value& operator=(const save_value&) = delete;
4551 };
4552
4553 // <encoding> ::= <function name> <bare-function-type>
4554 // ::= <data name>
4555 // ::= <special-name>
4556
4557 template <class C>
4558 const char*
4559 parse_encoding(const char* first, const char* last, C& db)
4560 {
4561 if (first != last)
4562 {
4563 save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4564 ++db.encoding_depth;
4565 save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4566 if (db.encoding_depth > 1)
4567 db.tag_templates = true;
4568 switch (*first)
4569 {
4570 case 'G':
4571 case 'T':
4572 first = parse_special_name(first, last, db);
4573 break;
4574 default:
4575 {
4576 bool ends_with_template_args = false;
4577 const char* t = parse_name(first, last, db,
4578 &ends_with_template_args);
4579 unsigned cv = db.cv;
4580 unsigned ref = db.ref;
4581 if (t != first)
4582 {
4583 if (t != last && *t != 'E' && *t != '.')
4584 {
4585 save_value<bool> sb2(db.tag_templates);
4586 db.tag_templates = false;
4587 const char* t2;
4588 typename C::String ret2;
4589 if (db.names.empty())
4590 return first;
4591 const typename C::String& nm = db.names.back().first;
4592 if (nm.empty())
4593 return first;
4594 if (!db.parsed_ctor_dtor_cv && ends_with_template_args)
4595 {
4596 t2 = parse_type(t, last, db);
4597 if (t2 == t)
4598 return first;
4599 if (db.names.size() < 2)
4600 return first;
4601 auto ret1 = std::move(db.names.back().first);
4602 ret2 = std::move(db.names.back().second);
4603 if (ret2.empty())
4604 ret1 += ' ';
4605 db.names.pop_back();
4606 if (db.names.empty())
4607 return first;
4608
4609 db.names.back().first.insert(0, ret1);
4610 t = t2;
4611 }
4612 db.names.back().first += '(';
4613 if (t != last && *t == 'v')
4614 {
4615 ++t;
4616 }
4617 else
4618 {
4619 bool first_arg = true;
4620 while (true)
4621 {
4622 size_t k0 = db.names.size();
4623 t2 = parse_type(t, last, db);
4624 size_t k1 = db.names.size();
4625 if (t2 == t)
4626 break;
4627 if (k1 > k0)
4628 {
4629 typename C::String tmp;
4630 for (size_t k = k0; k < k1; ++k)
4631 {
4632 if (!tmp.empty())
4633 tmp += ", ";
4634 tmp += db.names[k].move_full();
4635 }
4636 for (size_t k = k0; k < k1; ++k) {
4637 if (db.names.empty())
4638 return first;
4639 db.names.pop_back();
4640 }
4641 if (!tmp.empty())
4642 {
4643 if (db.names.empty())
4644 return first;
4645 if (!first_arg)
4646 db.names.back().first += ", ";
4647 else
4648 first_arg = false;
4649 db.names.back().first += tmp;
4650 }
4651 }
4652 t = t2;
4653 }
4654 }
4655 if (db.names.empty())
4656 return first;
4657 db.names.back().first += ')';
4658 if (cv & 1)
4659 db.names.back().first.append(" const");
4660 if (cv & 2)
4661 db.names.back().first.append(" volatile");
4662 if (cv & 4)
4663 db.names.back().first.append(" restrict");
4664 if (ref == 1)
4665 db.names.back().first.append(" &");
4666 else if (ref == 2)
4667 db.names.back().first.append(" &&");
4668 db.names.back().first += ret2;
4669 first = t;
4670 }
4671 else
4672 first = t;
4673 }
4674 break;
4675 }
4676 }
4677 }
4678 return first;
4679 }
4680
4681 // _block_invoke
4682 // _block_invoke<decimal-digit>+
4683 // _block_invoke_<decimal-digit>+
4684
4685 template <class C>
4686 const char*
4687 parse_block_invoke(const char* first, const char* last, C& db)
4688 {
4689 if (last - first >= 13)
4690 {
4691 const char test[] = "_block_invoke";
4692 const char* t = first;
4693 for (int i = 0; i < 13; ++i, ++t)
4694 {
4695 if (*t != test[i])
4696 return first;
4697 }
4698 if (t != last)
4699 {
4700 if (*t == '_')
4701 {
4702 // must have at least 1 decimal digit
4703 if (++t == last || !std::isdigit(*t))
4704 return first;
4705 ++t;
4706 }
4707 // parse zero or more digits
4708 while (t != last && isdigit(*t))
4709 ++t;
4710 }
4711 if (db.names.empty())
4712 return first;
4713 db.names.back().first.insert(0, "invocation function for block in ");
4714 first = t;
4715 }
4716 return first;
4717 }
4718
4719 // extension
4720 // <dot-suffix> := .<anything and everything>
4721
4722 template <class C>
4723 const char*
4724 parse_dot_suffix(const char* first, const char* last, C& db)
4725 {
4726 if (first != last && *first == '.')
4727 {
4728 if (db.names.empty())
4729 return first;
4730 db.names.back().first += " (" + typename C::String(first, last) + ")";
4731 first = last;
4732 }
4733 return first;
4734 }
4735
4736 // <block-involcaton-function> ___Z<encoding>_block_invoke
4737 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
4738 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
4739 // <mangled-name> ::= _Z<encoding>
4740 // ::= <type>
4741
4742 template <class C>
4743 void
4744 demangle(const char* first, const char* last, C& db, int& status)
4745 {
4746 if (first >= last)
4747 {
4748 status = invalid_mangled_name;
4749 return;
4750 }
4751 if (*first == '_')
4752 {
4753 if (last - first >= 4)
4754 {
4755 if (first[1] == 'Z')
4756 {
4757 const char* t = parse_encoding(first+2, last, db);
4758 if (t != first+2 && t != last && *t == '.')
4759 t = parse_dot_suffix(t, last, db);
4760 if (t != last)
4761 status = invalid_mangled_name;
4762 }
4763 else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
4764 {
4765 const char* t = parse_encoding(first+4, last, db);
4766 if (t != first+4 && t != last)
4767 {
4768 const char* t1 = parse_block_invoke(t, last, db);
4769 if (t1 != last)
4770 status = invalid_mangled_name;
4771 }
4772 else
4773 status = invalid_mangled_name;
4774 }
4775 else
4776 status = invalid_mangled_name;
4777 }
4778 else
4779 status = invalid_mangled_name;
4780 }
4781 else
4782 {
4783 const char* t = parse_type(first, last, db);
4784 if (t != last)
4785 status = invalid_mangled_name;
4786 }
4787 if (status == success && db.names.empty())
4788 status = invalid_mangled_name;
4789 }
4790
4791 template <std::size_t N>
4792 class arena
4793 {
4794 static const std::size_t alignment = 16;
4795 alignas(alignment) char buf_[N];
4796 char* ptr_;
4797
4798 std::size_t
4799 align_up(std::size_t n) noexcept
4800 {return (n + (alignment-1)) & ~(alignment-1);}
4801
4802 bool
4803 pointer_in_buffer(char* p) noexcept
4804 {return buf_ <= p && p <= buf_ + N;}
4805
4806 public:
4807 arena() noexcept : ptr_(buf_) {}
4808 ~arena() {ptr_ = nullptr;}
4809 arena(const arena&) = delete;
4810 arena& operator=(const arena&) = delete;
4811
4812 char* allocate(std::size_t n);
4813 void deallocate(char* p, std::size_t n) noexcept;
4814
4815 static constexpr std::size_t size() {return N;}
4816 std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);}
4817 void reset() {ptr_ = buf_;}
4818 };
4819
4820 template <std::size_t N>
4821 char*
4822 arena<N>::allocate(std::size_t n)
4823 {
4824 n = align_up(n);
4825 if (static_cast<std::size_t>(buf_ + N - ptr_) >= n)
4826 {
4827 char* r = ptr_;
4828 ptr_ += n;
4829 return r;
4830 }
4831 return static_cast<char*>(std::malloc(n));
4832 }
4833
4834 template <std::size_t N>
4835 void
4836 arena<N>::deallocate(char* p, std::size_t n) noexcept
4837 {
4838 if (pointer_in_buffer(p))
4839 {
4840 n = align_up(n);
4841 if (p + n == ptr_)
4842 ptr_ = p;
4843 }
4844 else
4845 std::free(p);
4846 }
4847
4848 template <class T, std::size_t N>
4849 class short_alloc
4850 {
4851 arena<N>& a_;
4852 public:
4853 typedef T value_type;
4854
4855 public:
4856 template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;};
4857
4858 short_alloc(arena<N>& a) noexcept : a_(a) {}
4859 template <class U>
4860 short_alloc(const short_alloc<U, N>& a) noexcept
4861 : a_(a.a_) {}
4862 short_alloc(const short_alloc&) = default;
4863 short_alloc& operator=(const short_alloc&) = delete;
4864
4865 T* allocate(std::size_t n)
4866 {
4867 return reinterpret_cast<T*>(a_.allocate(n*sizeof(T)));
4868 }
4869 void deallocate(T* p, std::size_t n) noexcept
4870 {
4871 a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T));
4872 }
4873
4874 template <class T1, std::size_t N1, class U, std::size_t M>
4875 friend
4876 bool
4877 operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept;
4878
4879 template <class U, std::size_t M> friend class short_alloc;
4880 };
4881
4882 template <class T, std::size_t N, class U, std::size_t M>
4883 inline
4884 bool
4885 operator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4886 {
4887 return N == M && &x.a_ == &y.a_;
4888 }
4889
4890 template <class T, std::size_t N, class U, std::size_t M>
4891 inline
4892 bool
4893 operator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4894 {
4895 return !(x == y);
4896 }
4897
4898 template <class T>
4899 class malloc_alloc
4900 {
4901 public:
4902 typedef T value_type;
4903 typedef T& reference;
4904 typedef const T& const_reference;
4905 typedef T* pointer;
4906 typedef const T* const_pointer;
4907 typedef std::size_t size_type;
4908 typedef std::ptrdiff_t difference_type;
4909
4910 malloc_alloc() = default;
4911 template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
4912
4913 T* allocate(std::size_t n)
4914 {
4915 return static_cast<T*>(std::malloc(n*sizeof(T)));
4916 }
4917 void deallocate(T* p, std::size_t) noexcept
4918 {
4919 std::free(p);
4920 }
4921
4922 template <class U> struct rebind { using other = malloc_alloc<U>; };
4923 template <class U, class... Args>
4924 void construct(U* p, Args&&... args)
4925 {
4926 ::new ((void*)p) U(std::forward<Args>(args)...);
4927 }
4928 void destroy(T* p)
4929 {
4930 p->~T();
4931 }
4932 };
4933
4934 template <class T, class U>
4935 inline
4936 bool
4937 operator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept
4938 {
4939 return true;
4940 }
4941
4942 template <class T, class U>
4943 inline
4944 bool
4945 operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
4946 {
4947 return !(x == y);
4948 }
4949
4950 const size_t bs = 4 * 1024;
4951 template <class T> using Alloc = short_alloc<T, bs>;
4952 template <class T> using Vector = std::vector<T, Alloc<T>>;
4953
4954 template <class StrT>
4955 struct string_pair
4956 {
4957 StrT first;
4958 StrT second;
4959
4960 string_pair() = default;
4961 string_pair(StrT f) : first(std::move(f)) {}
4962 string_pair(StrT f, StrT s)
4963 : first(std::move(f)), second(std::move(s)) {}
4964 template <size_t N>
4965 string_pair(const char (&s)[N]) : first(s, N-1) {}
4966
4967 size_t size() const {return first.size() + second.size();}
4968 StrT full() const {return first + second;}
4969 StrT move_full() {return std::move(first) + std::move(second);}
4970 };
4971
4972 struct Db
4973 {
4974 typedef std::basic_string<char, std::char_traits<char>,
4975 malloc_alloc<char>> String;
4976 typedef Vector<string_pair<String>> sub_type;
4977 typedef Vector<sub_type> template_param_type;
4978 sub_type names;
4979 template_param_type subs;
4980 Vector<template_param_type> template_param;
4981 unsigned cv = 0;
4982 unsigned ref = 0;
4983 unsigned encoding_depth = 0;
4984 bool parsed_ctor_dtor_cv = false;
4985 bool tag_templates = true;
4986 bool fix_forward_references = false;
4987 bool try_to_parse_template_args = true;
4988
4989 template <size_t N>
4990 Db(arena<N>& ar) :
4991 names(ar),
4992 subs(0, names, ar),
4993 template_param(0, subs, ar)
4994 {}
4995 };
4996
4997 } // unnamed namespace
4998
4999 extern "C" _LIBCXXABI_FUNC_VIS char *
5000 __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) {
5001 if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
5002 {
5003 if (status)
5004 *status = invalid_args;
5005 return nullptr;
5006 }
5007
5008 size_t internal_size = buf != nullptr ? *n : 0;
5009 arena<bs> a;
5010 Db db(a);
5011 db.template_param.emplace_back(a);
5012 int internal_status = success;
5013 size_t len = std::strlen(mangled_name);
5014 demangle(mangled_name, mangled_name + len, db,
5015 internal_status);
5016 if (internal_status == success && db.fix_forward_references &&
5017 !db.template_param.empty() && !db.template_param.front().empty())
5018 {
5019 db.fix_forward_references = false;
5020 db.tag_templates = false;
5021 db.names.clear();
5022 db.subs.clear();
5023 demangle(mangled_name, mangled_name + len, db, internal_status);
5024 if (db.fix_forward_references)
5025 internal_status = invalid_mangled_name;
5026 }
5027 if (internal_status == success)
5028 {
5029 size_t sz = db.names.back().size() + 1;
5030 if (sz > internal_size)
5031 {
5032 char* newbuf = static_cast<char*>(std::realloc(buf, sz));
5033 if (newbuf == nullptr)
5034 {
5035 internal_status = memory_alloc_failure;
5036 buf = nullptr;
5037 }
5038 else
5039 {
5040 buf = newbuf;
5041 if (n != nullptr)
5042 *n = sz;
5043 }
5044 }
5045 if (buf != nullptr)
5046 {
5047 db.names.back().first += db.names.back().second;
5048 std::memcpy(buf, db.names.back().first.data(), sz-1);
5049 buf[sz-1] = char(0);
5050 }
5051 }
5052 else
5053 buf = nullptr;
5054 if (status)
5055 *status = internal_status;
5056 return buf;
5057 }
5058
5059 } // __cxxabiv1

llvm-admin@lists.llvm.org
ViewVC Help
Powered by ViewVC 1.1.5