blob: 3da10e5192b2c79dfbef705cea94215ae337013d [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Mangled.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Greg Claytone9982672012-08-06 15:55:38 +000010
Filipe Cabecinhasdd393952012-09-11 18:11:12 +000011// FreeBSD9-STABLE requires this to know about size_t in cxxabi.h
12#include <cstddef>
Colin Riley61979cc2013-11-20 15:19:08 +000013#if defined(_MSC_VER)
Virgile Bello8250ebd2014-04-08 14:46:44 +000014#define LLDB_USE_BUILTIN_DEMANGLER
15// MSVC doesn't support constexpr, alignas, __attribute__ and noexcept yet
16#define constexpr
17#define alignas(X)
18#define __attribute__(X)
19#define noexcept
20#define snprintf _snprintf
Colin Riley61979cc2013-11-20 15:19:08 +000021#elif defined (__FreeBSD__)
Greg Clayton19c8e782013-10-30 18:42:59 +000022#define LLDB_USE_BUILTIN_DEMANGLER
23#else
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include <cxxabi.h>
Virgile Bellod0c5c772013-09-18 08:09:31 +000025#endif
Greg Claytone9982672012-08-06 15:55:38 +000026
Greg Clayton19c8e782013-10-30 18:42:59 +000027#ifdef LLDB_USE_BUILTIN_DEMANGLER
28
Greg Claytona1e03182013-10-31 18:41:50 +000029//----------------------------------------------------------------------
30// Inlined copy of:
31// http://llvm.org/svn/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp
Greg Clayton146b7b12014-01-23 22:12:54 +000032// revision 199944.
Greg Claytona1e03182013-10-31 18:41:50 +000033//
34// Changes include:
35// - remove the "__cxxabiv1" namespace
36// - stripped GCC attributes()
37// - removed extern "C" from the cxa_demangle function
38// - Changed the scope of the unnamed namespace to include cxa_demangle
39// function.
Greg Claytonb73a31e2013-12-12 17:39:39 +000040// - Added "#undef _LIBCPP_EXTERN_TEMPLATE" to avoid warning
Greg Claytona1e03182013-10-31 18:41:50 +000041//----------------------------------------------------------------------
Greg Clayton19c8e782013-10-30 18:42:59 +000042
Greg Claytonb73a31e2013-12-12 17:39:39 +000043#undef _LIBCPP_EXTERN_TEMPLATE // Avoid warning below
44
45//===-------------------------- cxa_demangle.cpp --------------------------===//
46//
47// The LLVM Compiler Infrastructure
48//
49// This file is dual licensed under the MIT and the University of Illinois Open
50// Source Licenses. See LICENSE.TXT for details.
51//
52//===----------------------------------------------------------------------===//
53
54#define _LIBCPP_EXTERN_TEMPLATE(...)
55#define _LIBCPP_NO_EXCEPTIONS
56
57#include <vector>
58#include <algorithm>
59#include <string>
60#include <numeric>
61#include <cstdlib>
62#include <cstring>
63#include <cctype>
64
65
Greg Clayton19c8e782013-10-30 18:42:59 +000066namespace
67{
68
69enum
70{
71 unknown_error = -4,
72 invalid_args = -3,
73 invalid_mangled_name,
74 memory_alloc_failure,
75 success
76};
77
78template <class C>
79 const char* parse_type(const char* first, const char* last, C& db);
80template <class C>
81 const char* parse_encoding(const char* first, const char* last, C& db);
82template <class C>
83 const char* parse_name(const char* first, const char* last, C& db);
84template <class C>
85 const char* parse_expression(const char* first, const char* last, C& db);
86template <class C>
87 const char* parse_template_args(const char* first, const char* last, C& db);
88template <class C>
89 const char* parse_operator_name(const char* first, const char* last, C& db);
90template <class C>
91 const char* parse_unqualified_name(const char* first, const char* last, C& db);
92template <class C>
93 const char* parse_decltype(const char* first, const char* last, C& db);
94
95template <class C>
96void
97print_stack(const C& db)
98{
99 printf("---------\n");
100 printf("names:\n");
101 for (auto& s : db.names)
102 printf("{%s#%s}\n", s.first.c_str(), s.second.c_str());
103 int i = -1;
104 printf("subs:\n");
105 for (auto& v : db.subs)
106 {
107 if (i >= 0)
108 printf("S%i_ = {", i);
109 else
110 printf("S_ = {");
111 for (auto& s : v)
112 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
113 printf("}\n");
114 ++i;
115 }
116 printf("template_param:\n");
117 for (auto& t : db.template_param)
118 {
119 printf("--\n");
120 i = -1;
121 for (auto& v : t)
122 {
123 if (i >= 0)
124 printf("T%i_ = {", i);
125 else
126 printf("T_ = {");
127 for (auto& s : v)
128 printf("{%s#%s}", s.first.c_str(), s.second.c_str());
129 printf("}\n");
130 ++i;
131 }
132 }
133 printf("---------\n\n");
134}
135
136template <class C>
137void
138print_state(const char* msg, const char* first, const char* last, const C& db)
139{
140 printf("%s: ", msg);
141 for (; first != last; ++first)
142 printf("%c", *first);
143 printf("\n");
144 print_stack(db);
145}
146
147// <number> ::= [n] <non-negative decimal integer>
148
149const char*
150parse_number(const char* first, const char* last)
151{
152 if (first != last)
153 {
154 const char* t = first;
155 if (*t == 'n')
156 ++t;
157 if (t != last)
158 {
159 if (*t == '0')
160 {
161 first = t+1;
162 }
163 else if ('1' <= *t && *t <= '9')
164 {
165 first = t+1;
166 while (first != last && std::isdigit(*first))
167 ++first;
168 }
169 }
170 }
171 return first;
172}
173
174template <class Float>
175struct float_data;
176
177template <>
178struct float_data<float>
179{
180 static const size_t mangled_size = 8;
181 static const size_t max_demangled_size = 24;
Virgile Bello8250ebd2014-04-08 14:46:44 +0000182 static constexpr const char* spec;
Greg Clayton19c8e782013-10-30 18:42:59 +0000183};
184
Virgile Bello8250ebd2014-04-08 14:46:44 +0000185constexpr const char* float_data<float>::spec = "%af";
Greg Clayton19c8e782013-10-30 18:42:59 +0000186
187template <>
188struct float_data<double>
189{
190 static const size_t mangled_size = 16;
191 static const size_t max_demangled_size = 32;
Virgile Bello8250ebd2014-04-08 14:46:44 +0000192 static constexpr const char* spec;
Greg Clayton19c8e782013-10-30 18:42:59 +0000193};
194
Virgile Bello8250ebd2014-04-08 14:46:44 +0000195constexpr const char* float_data<double>::spec = "%a";
Greg Clayton19c8e782013-10-30 18:42:59 +0000196
197template <>
198struct float_data<long double>
199{
200 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
201 static const size_t max_demangled_size = 40;
Virgile Bello8250ebd2014-04-08 14:46:44 +0000202 static constexpr const char* spec;
Greg Clayton19c8e782013-10-30 18:42:59 +0000203};
204
Virgile Bello8250ebd2014-04-08 14:46:44 +0000205constexpr const char* float_data<long double>::spec = "%LaL";
Greg Clayton19c8e782013-10-30 18:42:59 +0000206
207template <class Float, class C>
208const char*
209parse_floating_number(const char* first, const char* last, C& db)
210{
211 const size_t N = float_data<Float>::mangled_size;
212 if (static_cast<std::size_t>(last - first) > N)
213 {
214 last = first + N;
215 union
216 {
217 Float value;
218 char buf[sizeof(Float)];
219 };
220 const char* t = first;
221 char* e = buf;
222 for (; t != last; ++t, ++e)
223 {
224 if (!isxdigit(*t))
225 return first;
226 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
227 static_cast<unsigned>(*t - 'a' + 10);
228 ++t;
229 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
230 static_cast<unsigned>(*t - 'a' + 10);
231 *e = static_cast<char>((d1 << 4) + d0);
232 }
233 if (*t == 'E')
234 {
235#if __LITTLE_ENDIAN__
236 std::reverse(buf, e);
237#endif
238 char num[float_data<Float>::max_demangled_size] = {0};
239 int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
240 if (static_cast<std::size_t>(n) >= sizeof(num))
241 return first;
242 db.names.push_back(typename C::String(num, static_cast<std::size_t>(n)));
243 first = t+1;
244 }
245 }
246 return first;
247}
248
249// <source-name> ::= <positive length number> <identifier>
250
251template <class C>
252const char*
253parse_source_name(const char* first, const char* last, C& db)
254{
255 if (first != last)
256 {
257 char c = *first;
258 if (isdigit(c) && first+1 != last)
259 {
260 const char* t = first+1;
261 size_t n = static_cast<size_t>(c - '0');
262 for (c = *t; isdigit(c); c = *t)
263 {
264 n = n * 10 + static_cast<size_t>(c - '0');
265 if (++t == last)
266 return first;
267 }
268 if (static_cast<size_t>(last - t) >= n)
269 {
270 typename C::String r(t, n);
271 if (r.substr(0, 10) == "_GLOBAL__N")
272 db.names.push_back("(anonymous namespace)");
273 else
274 db.names.push_back(std::move(r));
275 first = t + n;
276 }
277 }
278 }
279 return first;
280}
281
282// <substitution> ::= S <seq-id> _
283// ::= S_
284// <substitution> ::= Sa # ::std::allocator
285// <substitution> ::= Sb # ::std::basic_string
286// <substitution> ::= Ss # ::std::basic_string < char,
287// ::std::char_traits<char>,
288// ::std::allocator<char> >
289// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
290// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
291// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
292
293template <class C>
294const char*
295parse_substitution(const char* first, const char* last, C& db)
296{
297 if (last - first >= 2)
298 {
299 if (*first == 'S')
300 {
301 switch (first[1])
302 {
303 case 'a':
304 db.names.push_back("std::allocator");
305 first += 2;
306 break;
307 case 'b':
308 db.names.push_back("std::basic_string");
309 first += 2;
310 break;
311 case 's':
312 db.names.push_back("std::string");
313 first += 2;
314 break;
315 case 'i':
316 db.names.push_back("std::istream");
317 first += 2;
318 break;
319 case 'o':
320 db.names.push_back("std::ostream");
321 first += 2;
322 break;
323 case 'd':
324 db.names.push_back("std::iostream");
325 first += 2;
326 break;
327 case '_':
328 if (!db.subs.empty())
329 {
330 for (const auto& n : db.subs.front())
331 db.names.push_back(n);
332 first += 2;
333 }
334 break;
335 default:
336 if (std::isdigit(first[1]) || std::isupper(first[1]))
337 {
338 size_t sub = 0;
339 const char* t = first+1;
340 if (std::isdigit(*t))
341 sub = static_cast<size_t>(*t - '0');
342 else
343 sub = static_cast<size_t>(*t - 'A') + 10;
344 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
345 {
346 sub *= 36;
347 if (std::isdigit(*t))
348 sub += static_cast<size_t>(*t - '0');
349 else
350 sub += static_cast<size_t>(*t - 'A') + 10;
351 }
352 if (t == last || *t != '_')
353 return first;
354 ++sub;
355 if (sub < db.subs.size())
356 {
357 for (const auto& n : db.subs[sub])
358 db.names.push_back(n);
359 first = t+1;
360 }
361 }
362 break;
363 }
364 }
365 }
366 return first;
367}
368
369// <builtin-type> ::= v # void
370// ::= w # wchar_t
371// ::= b # bool
372// ::= c # char
373// ::= a # signed char
374// ::= h # unsigned char
375// ::= s # short
376// ::= t # unsigned short
377// ::= i # int
378// ::= j # unsigned int
379// ::= l # long
380// ::= m # unsigned long
381// ::= x # long long, __int64
382// ::= y # unsigned long long, __int64
383// ::= n # __int128
384// ::= o # unsigned __int128
385// ::= f # float
386// ::= d # double
387// ::= e # long double, __float80
388// ::= g # __float128
389// ::= z # ellipsis
390// ::= Dd # IEEE 754r decimal floating point (64 bits)
391// ::= De # IEEE 754r decimal floating point (128 bits)
392// ::= Df # IEEE 754r decimal floating point (32 bits)
393// ::= Dh # IEEE 754r half-precision floating point (16 bits)
394// ::= Di # char32_t
395// ::= Ds # char16_t
396// ::= Da # auto (in dependent new-expressions)
397// ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
398// ::= u <source-name> # vendor extended type
399
400template <class C>
401const char*
402parse_builtin_type(const char* first, const char* last, C& db)
403{
404 if (first != last)
405 {
406 switch (*first)
407 {
408 case 'v':
409 db.names.push_back("void");
410 ++first;
411 break;
412 case 'w':
413 db.names.push_back("wchar_t");
414 ++first;
415 break;
416 case 'b':
417 db.names.push_back("bool");
418 ++first;
419 break;
420 case 'c':
421 db.names.push_back("char");
422 ++first;
423 break;
424 case 'a':
425 db.names.push_back("signed char");
426 ++first;
427 break;
428 case 'h':
429 db.names.push_back("unsigned char");
430 ++first;
431 break;
432 case 's':
433 db.names.push_back("short");
434 ++first;
435 break;
436 case 't':
437 db.names.push_back("unsigned short");
438 ++first;
439 break;
440 case 'i':
441 db.names.push_back("int");
442 ++first;
443 break;
444 case 'j':
445 db.names.push_back("unsigned int");
446 ++first;
447 break;
448 case 'l':
449 db.names.push_back("long");
450 ++first;
451 break;
452 case 'm':
453 db.names.push_back("unsigned long");
454 ++first;
455 break;
456 case 'x':
457 db.names.push_back("long long");
458 ++first;
459 break;
460 case 'y':
461 db.names.push_back("unsigned long long");
462 ++first;
463 break;
464 case 'n':
465 db.names.push_back("__int128");
466 ++first;
467 break;
468 case 'o':
469 db.names.push_back("unsigned __int128");
470 ++first;
471 break;
472 case 'f':
473 db.names.push_back("float");
474 ++first;
475 break;
476 case 'd':
477 db.names.push_back("double");
478 ++first;
479 break;
480 case 'e':
481 db.names.push_back("long double");
482 ++first;
483 break;
484 case 'g':
485 db.names.push_back("__float128");
486 ++first;
487 break;
488 case 'z':
489 db.names.push_back("...");
490 ++first;
491 break;
492 case 'u':
493 {
494 const char*t = parse_source_name(first+1, last, db);
495 if (t != first+1)
496 first = t;
497 }
498 break;
499 case 'D':
500 if (first+1 != last)
501 {
502 switch (first[1])
503 {
504 case 'd':
505 db.names.push_back("decimal64");
506 first += 2;
507 break;
508 case 'e':
509 db.names.push_back("decimal128");
510 first += 2;
511 break;
512 case 'f':
513 db.names.push_back("decimal32");
514 first += 2;
515 break;
516 case 'h':
517 db.names.push_back("decimal16");
518 first += 2;
519 break;
520 case 'i':
521 db.names.push_back("char32_t");
522 first += 2;
523 break;
524 case 's':
525 db.names.push_back("char16_t");
526 first += 2;
527 break;
528 case 'a':
529 db.names.push_back("auto");
530 first += 2;
531 break;
532 case 'n':
533 db.names.push_back("std::nullptr_t");
534 first += 2;
535 break;
536 }
537 }
538 break;
539 }
540 }
541 return first;
542}
543
544// <CV-qualifiers> ::= [r] [V] [K]
545
546const char*
547parse_cv_qualifiers(const char* first, const char* last, unsigned& cv)
548{
549 cv = 0;
550 if (first != last)
551 {
552 if (*first == 'r')
553 {
554 cv |= 4;
555 ++first;
556 }
557 if (*first == 'V')
558 {
559 cv |= 2;
560 ++first;
561 }
562 if (*first == 'K')
563 {
564 cv |= 1;
565 ++first;
566 }
567 }
568 return first;
569}
570
571// <template-param> ::= T_ # first template parameter
572// ::= T <parameter-2 non-negative number> _
573
574template <class C>
575const char*
576parse_template_param(const char* first, const char* last, C& db)
577{
578 if (last - first >= 2)
579 {
580 if (*first == 'T')
581 {
582 if (first[1] == '_')
583 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000584 if (db.template_param.empty())
585 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000586 if (!db.template_param.back().empty())
587 {
588 for (auto& t : db.template_param.back().front())
589 db.names.push_back(t);
590 first += 2;
591 }
592 else
593 {
594 db.names.push_back("T_");
595 first += 2;
596 db.fix_forward_references = true;
597 }
598 }
599 else if (isdigit(first[1]))
600 {
601 const char* t = first+1;
602 size_t sub = static_cast<size_t>(*t - '0');
603 for (++t; t != last && isdigit(*t); ++t)
604 {
605 sub *= 10;
606 sub += static_cast<size_t>(*t - '0');
607 }
Greg Claytonb73a31e2013-12-12 17:39:39 +0000608 if (t == last || *t != '_' || db.template_param.empty())
Greg Clayton19c8e782013-10-30 18:42:59 +0000609 return first;
610 ++sub;
611 if (sub < db.template_param.back().size())
612 {
613 for (auto& temp : db.template_param.back()[sub])
614 db.names.push_back(temp);
615 first = t+1;
616 }
617 else
618 {
619 db.names.push_back(typename C::String(first, t+1));
620 first = t+1;
621 db.fix_forward_references = true;
622 }
623 }
624 }
625 }
626 return first;
627}
628
629// cc <type> <expression> # const_cast<type> (expression)
630
631template <class C>
632const char*
633parse_const_cast_expr(const char* first, const char* last, C& db)
634{
635 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c')
636 {
637 const char* t = parse_type(first+2, last, db);
638 if (t != first+2)
639 {
640 const char* t1 = parse_expression(t, last, db);
641 if (t1 != t)
642 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000643 if (db.names.size() < 2)
644 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000645 auto expr = db.names.back().move_full();
646 db.names.pop_back();
647 db.names.back() = "const_cast<" + db.names.back().move_full() + ">(" + expr + ")";
648 first = t1;
649 }
650 }
651 }
652 return first;
653}
654
655// dc <type> <expression> # dynamic_cast<type> (expression)
656
657template <class C>
658const char*
659parse_dynamic_cast_expr(const char* first, const char* last, C& db)
660{
661 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c')
662 {
663 const char* t = parse_type(first+2, last, db);
664 if (t != first+2)
665 {
666 const char* t1 = parse_expression(t, last, db);
667 if (t1 != t)
668 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000669 if (db.names.size() < 2)
670 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000671 auto expr = db.names.back().move_full();
672 db.names.pop_back();
673 db.names.back() = "dynamic_cast<" + db.names.back().move_full() + ">(" + expr + ")";
674 first = t1;
675 }
676 }
677 }
678 return first;
679}
680
681// rc <type> <expression> # reinterpret_cast<type> (expression)
682
683template <class C>
684const char*
685parse_reinterpret_cast_expr(const char* first, const char* last, C& db)
686{
687 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c')
688 {
689 const char* t = parse_type(first+2, last, db);
690 if (t != first+2)
691 {
692 const char* t1 = parse_expression(t, last, db);
693 if (t1 != t)
694 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000695 if (db.names.size() < 2)
696 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000697 auto expr = db.names.back().move_full();
698 db.names.pop_back();
699 db.names.back() = "reinterpret_cast<" + db.names.back().move_full() + ">(" + expr + ")";
700 first = t1;
701 }
702 }
703 }
704 return first;
705}
706
707// sc <type> <expression> # static_cast<type> (expression)
708
709template <class C>
710const char*
711parse_static_cast_expr(const char* first, const char* last, C& db)
712{
713 if (last - first >= 3 && first[0] == 's' && first[1] == 'c')
714 {
715 const char* t = parse_type(first+2, last, db);
716 if (t != first+2)
717 {
718 const char* t1 = parse_expression(t, last, db);
719 if (t1 != t)
720 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000721 if (db.names.size() < 2)
722 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000723 auto expr = db.names.back().move_full();
724 db.names.pop_back();
725 db.names.back() = "static_cast<" + db.names.back().move_full() + ">(" + expr + ")";
726 first = t1;
727 }
728 }
729 }
730 return first;
731}
732
733// sp <expression> # pack expansion
734
735template <class C>
736const char*
737parse_pack_expansion(const char* first, const char* last, C& db)
738{
739 if (last - first >= 3 && first[0] == 's' && first[1] == 'p')
740 {
741 const char* t = parse_expression(first+2, last, db);
742 if (t != first+2)
743 first = t;
744 }
745 return first;
746}
747
748// st <type> # sizeof (a type)
749
750template <class C>
751const char*
752parse_sizeof_type_expr(const char* first, const char* last, C& db)
753{
754 if (last - first >= 3 && first[0] == 's' && first[1] == 't')
755 {
756 const char* t = parse_type(first+2, last, db);
757 if (t != first+2)
758 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000759 if (db.names.empty())
760 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000761 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
762 first = t;
763 }
764 }
765 return first;
766}
767
768// sz <expr> # sizeof (a expression)
769
770template <class C>
771const char*
772parse_sizeof_expr_expr(const char* first, const char* last, C& db)
773{
774 if (last - first >= 3 && first[0] == 's' && first[1] == 'z')
775 {
776 const char* t = parse_expression(first+2, last, db);
777 if (t != first+2)
778 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000779 if (db.names.empty())
780 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000781 db.names.back() = "sizeof (" + db.names.back().move_full() + ")";
782 first = t;
783 }
784 }
785 return first;
786}
787
788// sZ <template-param> # size of a parameter pack
789
790template <class C>
791const char*
792parse_sizeof_param_pack_expr(const char* first, const char* last, C& db)
793{
794 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T')
795 {
796 size_t k0 = db.names.size();
797 const char* t = parse_template_param(first+2, last, db);
798 size_t k1 = db.names.size();
799 if (t != first+2)
800 {
801 typename C::String tmp("sizeof...(");
802 size_t k = k0;
803 if (k != k1)
804 {
805 tmp += db.names[k].move_full();
806 for (++k; k != k1; ++k)
807 tmp += ", " + db.names[k].move_full();
808 }
809 tmp += ")";
810 for (; k1 != k0; --k1)
811 db.names.pop_back();
812 db.names.push_back(std::move(tmp));
813 first = t;
814 }
815 }
816 return first;
817}
818
819// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter
820// ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
821// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter
822// ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters
823
824template <class C>
825const char*
826parse_function_param(const char* first, const char* last, C& db)
827{
828 if (last - first >= 3 && *first == 'f')
829 {
830 if (first[1] == 'p')
831 {
832 unsigned cv;
833 const char* t = parse_cv_qualifiers(first+2, last, cv);
834 const char* t1 = parse_number(t, last);
835 if (t1 != last && *t1 == '_')
836 {
837 db.names.push_back("fp" + typename C::String(t, t1));
838 first = t1+1;
839 }
840 }
841 else if (first[1] == 'L')
842 {
843 unsigned cv;
844 const char* t0 = parse_number(first+2, last);
845 if (t0 != last && *t0 == 'p')
846 {
847 ++t0;
848 const char* t = parse_cv_qualifiers(t0, last, cv);
849 const char* t1 = parse_number(t, last);
850 if (t1 != last && *t1 == '_')
851 {
852 db.names.push_back("fp" + typename C::String(t, t1));
853 first = t1+1;
854 }
855 }
856 }
857 }
858 return first;
859}
860
861// sZ <function-param> # size of a function parameter pack
862
863template <class C>
864const char*
865parse_sizeof_function_param_pack_expr(const char* first, const char* last, C& db)
866{
867 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f')
868 {
869 const char* t = parse_function_param(first+2, last, db);
870 if (t != first+2)
871 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000872 if (db.names.empty())
873 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000874 db.names.back() = "sizeof...(" + db.names.back().move_full() + ")";
875 first = t;
876 }
877 }
878 return first;
879}
880
881// te <expression> # typeid (expression)
882// ti <type> # typeid (type)
883
884template <class C>
885const char*
886parse_typeid_expr(const char* first, const char* last, C& db)
887{
888 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i'))
889 {
890 const char* t;
891 if (first[1] == 'e')
892 t = parse_expression(first+2, last, db);
893 else
894 t = parse_type(first+2, last, db);
895 if (t != first+2)
896 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000897 if (db.names.empty())
898 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000899 db.names.back() = "typeid(" + db.names.back().move_full() + ")";
900 first = t;
901 }
902 }
903 return first;
904}
905
906// tw <expression> # throw expression
907
908template <class C>
909const char*
910parse_throw_expr(const char* first, const char* last, C& db)
911{
912 if (last - first >= 3 && first[0] == 't' && first[1] == 'w')
913 {
914 const char* t = parse_expression(first+2, last, db);
915 if (t != first+2)
916 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000917 if (db.names.empty())
918 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000919 db.names.back() = "throw " + db.names.back().move_full();
920 first = t;
921 }
922 }
923 return first;
924}
925
926// ds <expression> <expression> # expr.*expr
927
928template <class C>
929const char*
930parse_dot_star_expr(const char* first, const char* last, C& db)
931{
932 if (last - first >= 3 && first[0] == 'd' && first[1] == 's')
933 {
934 const char* t = parse_expression(first+2, last, db);
935 if (t != first+2)
936 {
937 const char* t1 = parse_expression(t, last, db);
938 if (t1 != t)
939 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000940 if (db.names.size() < 2)
941 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000942 auto expr = db.names.back().move_full();
943 db.names.pop_back();
944 db.names.back().first += ".*" + expr;
945 first = t1;
946 }
947 }
948 }
949 return first;
950}
951
952// <simple-id> ::= <source-name> [ <template-args> ]
953
954template <class C>
955const char*
956parse_simple_id(const char* first, const char* last, C& db)
957{
958 if (first != last)
959 {
960 const char* t = parse_source_name(first, last, db);
961 if (t != first)
962 {
963 const char* t1 = parse_template_args(t, last, db);
964 if (t1 != t)
965 {
Greg Claytonb73a31e2013-12-12 17:39:39 +0000966 if (db.names.size() < 2)
967 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +0000968 auto args = db.names.back().move_full();
969 db.names.pop_back();
970 db.names.back().first += std::move(args);
971 }
972 first = t1;
973 }
974 else
975 first = t;
976 }
977 return first;
978}
979
980// <unresolved-type> ::= <template-param>
981// ::= <decltype>
982// ::= <substitution>
983
984template <class C>
985const char*
986parse_unresolved_type(const char* first, const char* last, C& db)
987{
988 if (first != last)
989 {
990 const char* t = first;
991 switch (*first)
992 {
993 case 'T':
994 {
995 size_t k0 = db.names.size();
996 t = parse_template_param(first, last, db);
997 size_t k1 = db.names.size();
998 if (t != first && k1 == k0 + 1)
999 {
1000 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1001 first = t;
1002 }
1003 else
1004 {
1005 for (; k1 != k0; --k1)
1006 db.names.pop_back();
1007 }
1008 break;
1009 }
1010 case 'D':
1011 t = parse_decltype(first, last, db);
1012 if (t != first)
1013 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001014 if (db.names.empty())
1015 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001016 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1017 first = t;
1018 }
1019 break;
1020 case 'S':
1021 t = parse_substitution(first, last, db);
1022 if (t != first)
1023 first = t;
1024 else
1025 {
1026 if (last - first > 2 && first[1] == 't')
1027 {
1028 t = parse_unqualified_name(first+2, last, db);
1029 if (t != first+2)
1030 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001031 if (db.names.empty())
1032 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001033 db.names.back().first.insert(0, "std::");
1034 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1035 first = t;
1036 }
1037 }
1038 }
1039 break;
1040 }
1041 }
1042 return first;
1043}
1044
1045// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
1046// ::= <simple-id> # e.g., ~A<2*N>
1047
1048template <class C>
1049const char*
1050parse_destructor_name(const char* first, const char* last, C& db)
1051{
1052 if (first != last)
1053 {
1054 const char* t = parse_unresolved_type(first, last, db);
1055 if (t == first)
1056 t = parse_simple_id(first, last, db);
1057 if (t != first)
1058 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001059 if (db.names.empty())
1060 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001061 db.names.back().first.insert(0, "~");
1062 first = t;
1063 }
1064 }
1065 return first;
1066}
1067
1068// <base-unresolved-name> ::= <simple-id> # unresolved name
1069// extension ::= <operator-name> # unresolved operator-function-id
1070// extension ::= <operator-name> <template-args> # unresolved operator template-id
1071// ::= on <operator-name> # unresolved operator-function-id
1072// ::= on <operator-name> <template-args> # unresolved operator template-id
1073// ::= dn <destructor-name> # destructor or pseudo-destructor;
1074// # e.g. ~X or ~X<N-1>
1075
1076template <class C>
1077const char*
1078parse_base_unresolved_name(const char* first, const char* last, C& db)
1079{
1080 if (last - first >= 2)
1081 {
1082 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n')
1083 {
1084 if (first[0] == 'o')
1085 {
1086 const char* t = parse_operator_name(first+2, last, db);
1087 if (t != first+2)
1088 {
1089 first = parse_template_args(t, last, db);
1090 if (first != t)
1091 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001092 if (db.names.size() < 2)
1093 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001094 auto args = db.names.back().move_full();
1095 db.names.pop_back();
1096 db.names.back().first += std::move(args);
1097 }
1098 }
1099 }
1100 else
1101 {
1102 const char* t = parse_destructor_name(first+2, last, db);
1103 if (t != first+2)
1104 first = t;
1105 }
1106 }
1107 else
1108 {
1109 const char* t = parse_simple_id(first, last, db);
1110 if (t == first)
1111 {
1112 t = parse_operator_name(first, last, db);
1113 if (t != first)
1114 {
1115 first = parse_template_args(t, last, db);
1116 if (first != t)
1117 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001118 if (db.names.size() < 2)
1119 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001120 auto args = db.names.back().move_full();
1121 db.names.pop_back();
1122 db.names.back().first += std::move(args);
1123 }
1124 }
1125 }
1126 else
1127 first = t;
1128 }
1129 }
1130 return first;
1131}
1132
1133// <unresolved-qualifier-level> ::= <simple-id>
1134
1135template <class C>
1136const char*
1137parse_unresolved_qualifier_level(const char* first, const char* last, C& db)
1138{
1139 return parse_simple_id(first, last, db);
1140}
1141
1142// <unresolved-name>
1143// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
1144// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
1145// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
1146// # A::x, N::y, A<T>::z; "gs" means leading "::"
1147// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
1148// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
1149// # T::N::x /decltype(p)::N::x
1150// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
1151
1152template <class C>
1153const char*
1154parse_unresolved_name(const char* first, const char* last, C& db)
1155{
1156 if (last - first > 2)
1157 {
1158 const char* t = first;
1159 bool global = false;
1160 if (t[0] == 'g' && t[1] == 's')
1161 {
1162 global = true;
1163 t += 2;
1164 }
1165 const char* t2 = parse_base_unresolved_name(t, last, db);
1166 if (t2 != t)
1167 {
1168 if (global)
Greg Claytonb73a31e2013-12-12 17:39:39 +00001169 {
1170 if (db.names.empty())
1171 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001172 db.names.back().first.insert(0, "::");
Greg Claytonb73a31e2013-12-12 17:39:39 +00001173 }
Greg Clayton19c8e782013-10-30 18:42:59 +00001174 first = t2;
1175 }
1176 else if (last - t > 2 && t[0] == 's' && t[1] == 'r')
1177 {
1178 if (t[2] == 'N')
1179 {
1180 t += 3;
1181 const char* t1 = parse_unresolved_type(t, last, db);
1182 if (t1 == t || t1 == last)
1183 return first;
1184 t = t1;
1185 t1 = parse_template_args(t, last, db);
1186 if (t1 != t)
1187 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001188 if (db.names.size() < 2)
1189 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001190 auto args = db.names.back().move_full();
1191 db.names.pop_back();
1192 db.names.back().first += std::move(args);
1193 t = t1;
1194 if (t == last)
1195 {
1196 db.names.pop_back();
1197 return first;
1198 }
1199 }
1200 while (*t != 'E')
1201 {
1202 t1 = parse_unresolved_qualifier_level(t, last, db);
Greg Claytonb73a31e2013-12-12 17:39:39 +00001203 if (t1 == t || t1 == last || db.names.size() < 2)
Greg Clayton19c8e782013-10-30 18:42:59 +00001204 return first;
1205 auto s = db.names.back().move_full();
1206 db.names.pop_back();
1207 db.names.back().first += "::" + std::move(s);
1208 t = t1;
1209 }
1210 ++t;
1211 t1 = parse_base_unresolved_name(t, last, db);
1212 if (t1 == t)
1213 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001214 if (!db.names.empty())
1215 db.names.pop_back();
Greg Clayton19c8e782013-10-30 18:42:59 +00001216 return first;
1217 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001218 if (db.names.size() < 2)
1219 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001220 auto s = db.names.back().move_full();
1221 db.names.pop_back();
1222 db.names.back().first += "::" + std::move(s);
1223 first = t1;
1224 }
1225 else
1226 {
1227 t += 2;
1228 const char* t1 = parse_unresolved_type(t, last, db);
1229 if (t1 != t)
1230 {
1231 t = t1;
1232 t1 = parse_template_args(t, last, db);
1233 if (t1 != t)
1234 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001235 if (db.names.size() < 2)
1236 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001237 auto args = db.names.back().move_full();
1238 db.names.pop_back();
1239 db.names.back().first += std::move(args);
1240 t = t1;
1241 }
1242 t1 = parse_base_unresolved_name(t, last, db);
1243 if (t1 == t)
1244 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001245 if (!db.names.empty())
1246 db.names.pop_back();
Greg Clayton19c8e782013-10-30 18:42:59 +00001247 return first;
1248 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001249 if (db.names.size() < 2)
1250 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001251 auto s = db.names.back().move_full();
1252 db.names.pop_back();
1253 db.names.back().first += "::" + std::move(s);
1254 first = t1;
1255 }
1256 else
1257 {
1258 t1 = parse_unresolved_qualifier_level(t, last, db);
1259 if (t1 == t || t1 == last)
1260 return first;
1261 t = t1;
1262 if (global)
Greg Claytonb73a31e2013-12-12 17:39:39 +00001263 {
1264 if (db.names.empty())
1265 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001266 db.names.back().first.insert(0, "::");
Greg Claytonb73a31e2013-12-12 17:39:39 +00001267 }
Greg Clayton19c8e782013-10-30 18:42:59 +00001268 while (*t != 'E')
1269 {
1270 t1 = parse_unresolved_qualifier_level(t, last, db);
Greg Claytonb73a31e2013-12-12 17:39:39 +00001271 if (t1 == t || t1 == last || db.names.size() < 2)
Greg Clayton19c8e782013-10-30 18:42:59 +00001272 return first;
1273 auto s = db.names.back().move_full();
1274 db.names.pop_back();
1275 db.names.back().first += "::" + std::move(s);
1276 t = t1;
1277 }
1278 ++t;
1279 t1 = parse_base_unresolved_name(t, last, db);
1280 if (t1 == t)
1281 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001282 if (!db.names.empty())
1283 db.names.pop_back();
Greg Clayton19c8e782013-10-30 18:42:59 +00001284 return first;
1285 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001286 if (db.names.size() < 2)
1287 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001288 auto s = db.names.back().move_full();
1289 db.names.pop_back();
1290 db.names.back().first += "::" + std::move(s);
1291 first = t1;
1292 }
1293 }
1294 }
1295 }
1296 return first;
1297}
1298
1299// dt <expression> <unresolved-name> # expr.name
1300
1301template <class C>
1302const char*
1303parse_dot_expr(const char* first, const char* last, C& db)
1304{
1305 if (last - first >= 3 && first[0] == 'd' && first[1] == 't')
1306 {
1307 const char* t = parse_expression(first+2, last, db);
1308 if (t != first+2)
1309 {
1310 const char* t1 = parse_unresolved_name(t, last, db);
1311 if (t1 != t)
1312 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001313 if (db.names.size() < 2)
1314 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001315 auto name = db.names.back().move_full();
1316 db.names.pop_back();
1317 db.names.back().first += "." + name;
1318 first = t1;
1319 }
1320 }
1321 }
1322 return first;
1323}
1324
1325// cl <expression>+ E # call
1326
1327template <class C>
1328const char*
1329parse_call_expr(const char* first, const char* last, C& db)
1330{
1331 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l')
1332 {
1333 const char* t = parse_expression(first+2, last, db);
1334 if (t != first+2)
1335 {
1336 if (t == last)
1337 return first;
Greg Claytonb73a31e2013-12-12 17:39:39 +00001338 if (db.names.empty())
1339 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001340 db.names.back().first += db.names.back().second;
1341 db.names.back().second = typename C::String();
1342 db.names.back().first.append("(");
1343 bool first_expr = true;
1344 while (*t != 'E')
1345 {
1346 const char* t1 = parse_expression(t, last, db);
1347 if (t1 == t || t1 == last)
1348 return first;
Greg Claytonb73a31e2013-12-12 17:39:39 +00001349 if (db.names.empty())
1350 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001351 auto tmp = db.names.back().move_full();
1352 db.names.pop_back();
1353 if (!tmp.empty())
1354 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001355 if (db.names.empty())
1356 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001357 if (!first_expr)
1358 {
1359 db.names.back().first.append(", ");
1360 first_expr = false;
1361 }
1362 db.names.back().first.append(tmp);
1363 }
1364 t = t1;
1365 }
1366 ++t;
Greg Claytonb73a31e2013-12-12 17:39:39 +00001367 if (db.names.empty())
1368 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001369 db.names.back().first.append(")");
1370 first = t;
1371 }
1372 }
1373 return first;
1374}
1375
1376// [gs] nw <expression>* _ <type> E # new (expr-list) type
1377// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
1378// [gs] na <expression>* _ <type> E # new[] (expr-list) type
1379// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
1380// <initializer> ::= pi <expression>* E # parenthesized initialization
1381
1382template <class C>
1383const char*
1384parse_new_expr(const char* first, const char* last, C& db)
1385{
1386 if (last - first >= 4)
1387 {
1388 const char* t = first;
1389 bool parsed_gs = false;
1390 if (t[0] == 'g' && t[1] == 's')
1391 {
1392 t += 2;
1393 parsed_gs = true;
1394 }
1395 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a'))
1396 {
1397 bool is_array = t[1] == 'a';
1398 t += 2;
1399 if (t == last)
1400 return first;
1401 bool has_expr_list = false;
1402 bool first_expr = true;
1403 while (*t != '_')
1404 {
1405 const char* t1 = parse_expression(t, last, db);
1406 if (t1 == t || t1 == last)
1407 return first;
1408 has_expr_list = true;
1409 if (!first_expr)
1410 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001411 if (db.names.empty())
1412 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001413 auto tmp = db.names.back().move_full();
1414 db.names.pop_back();
1415 if (!tmp.empty())
1416 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001417 if (db.names.empty())
1418 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001419 db.names.back().first.append(", ");
1420 db.names.back().first.append(tmp);
1421 first_expr = false;
1422 }
1423 }
1424 t = t1;
1425 }
1426 ++t;
1427 const char* t1 = parse_type(t, last, db);
1428 if (t1 == t || t1 == last)
1429 return first;
1430 t = t1;
1431 bool has_init = false;
1432 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i')
1433 {
1434 t += 2;
1435 has_init = true;
1436 first_expr = true;
1437 while (*t != 'E')
1438 {
1439 t1 = parse_expression(t, last, db);
1440 if (t1 == t || t1 == last)
1441 return first;
1442 if (!first_expr)
1443 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001444 if (db.names.empty())
1445 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001446 auto tmp = db.names.back().move_full();
1447 db.names.pop_back();
1448 if (!tmp.empty())
1449 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001450 if (db.names.empty())
1451 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001452 db.names.back().first.append(", ");
1453 db.names.back().first.append(tmp);
1454 first_expr = false;
1455 }
1456 }
1457 t = t1;
1458 }
1459 }
1460 if (*t != 'E')
1461 return first;
1462 typename C::String init_list;
1463 if (has_init)
1464 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001465 if (db.names.empty())
1466 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001467 init_list = db.names.back().move_full();
1468 db.names.pop_back();
1469 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001470 if (db.names.empty())
1471 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001472 auto type = db.names.back().move_full();
1473 db.names.pop_back();
1474 typename C::String expr_list;
1475 if (has_expr_list)
1476 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001477 if (db.names.empty())
1478 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001479 expr_list = db.names.back().move_full();
1480 db.names.pop_back();
1481 }
1482 typename C::String r;
1483 if (parsed_gs)
1484 r = "::";
1485 if (is_array)
1486 r += "[] ";
1487 else
1488 r += " ";
1489 if (has_expr_list)
1490 r += "(" + expr_list + ") ";
1491 r += type;
1492 if (has_init)
1493 r += " (" + init_list + ")";
1494 db.names.push_back(std::move(r));
1495 first = t+1;
1496 }
1497 }
1498 return first;
1499}
1500
1501// cv <type> <expression> # conversion with one argument
1502// cv <type> _ <expression>* E # conversion with a different number of arguments
1503
1504template <class C>
1505const char*
1506parse_conversion_expr(const char* first, const char* last, C& db)
1507{
1508 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v')
1509 {
1510 bool try_to_parse_template_args = db.try_to_parse_template_args;
1511 db.try_to_parse_template_args = false;
1512 const char* t = parse_type(first+2, last, db);
1513 db.try_to_parse_template_args = try_to_parse_template_args;
1514 if (t != first+2 && t != last)
1515 {
1516 if (*t != '_')
1517 {
1518 const char* t1 = parse_expression(t, last, db);
1519 if (t1 == t)
1520 return first;
1521 t = t1;
1522 }
1523 else
1524 {
1525 ++t;
1526 if (t == last)
1527 return first;
1528 if (*t == 'E')
1529 db.names.emplace_back();
1530 else
1531 {
1532 bool first_expr = true;
1533 while (*t != 'E')
1534 {
1535 const char* t1 = parse_expression(t, last, db);
1536 if (t1 == t || t1 == last)
1537 return first;
1538 if (!first_expr)
1539 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001540 if (db.names.empty())
1541 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001542 auto tmp = db.names.back().move_full();
1543 db.names.pop_back();
1544 if (!tmp.empty())
1545 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001546 if (db.names.empty())
1547 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001548 db.names.back().first.append(", ");
1549 db.names.back().first.append(tmp);
1550 first_expr = false;
1551 }
1552 }
1553 t = t1;
1554 }
1555 }
1556 ++t;
1557 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001558 if (db.names.size() < 2)
1559 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001560 auto tmp = db.names.back().move_full();
1561 db.names.pop_back();
1562 db.names.back() = "(" + db.names.back().move_full() + ")(" + tmp + ")";
1563 first = t;
1564 }
1565 }
1566 return first;
1567}
1568
1569// pt <expression> <expression> # expr->name
1570
1571template <class C>
1572const char*
1573parse_arrow_expr(const char* first, const char* last, C& db)
1574{
1575 if (last - first >= 3 && first[0] == 'p' && first[1] == 't')
1576 {
1577 const char* t = parse_expression(first+2, last, db);
1578 if (t != first+2)
1579 {
1580 const char* t1 = parse_expression(t, last, db);
1581 if (t1 != t)
1582 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001583 if (db.names.size() < 2)
1584 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001585 auto tmp = db.names.back().move_full();
1586 db.names.pop_back();
1587 db.names.back().first += "->";
1588 db.names.back().first += tmp;
1589 first = t1;
1590 }
1591 }
1592 }
1593 return first;
1594}
1595
1596// <ref-qualifier> ::= R # & ref-qualifier
1597// <ref-qualifier> ::= O # && ref-qualifier
1598
1599// <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E
1600
1601template <class C>
1602const char*
1603parse_function_type(const char* first, const char* last, C& db)
1604{
1605 if (first != last && *first == 'F')
1606 {
1607 const char* t = first+1;
1608 if (t != last)
1609 {
1610 bool externC = false;
1611 if (*t == 'Y')
1612 {
1613 externC = true;
1614 if (++t == last)
1615 return first;
1616 }
1617 const char* t1 = parse_type(t, last, db);
1618 if (t1 != t)
1619 {
1620 t = t1;
1621 typename C::String sig("(");
1622 int ref_qual = 0;
1623 while (true)
1624 {
1625 if (t == last)
1626 {
1627 db.names.pop_back();
1628 return first;
1629 }
1630 if (*t == 'E')
1631 {
1632 ++t;
1633 break;
1634 }
1635 if (*t == 'v')
1636 {
1637 ++t;
1638 continue;
1639 }
1640 if (*t == 'R' && t+1 != last && t[1] == 'E')
1641 {
1642 ref_qual = 1;
1643 ++t;
1644 continue;
1645 }
1646 if (*t == 'O' && t+1 != last && t[1] == 'E')
1647 {
1648 ref_qual = 2;
1649 ++t;
1650 continue;
1651 }
1652 size_t k0 = db.names.size();
1653 t1 = parse_type(t, last, db);
1654 size_t k1 = db.names.size();
1655 if (t1 == t || t1 == last)
1656 return first;
1657 for (size_t k = k0; k < k1; ++k)
1658 {
1659 if (sig.size() > 1)
1660 sig += ", ";
1661 sig += db.names[k].move_full();
1662 }
1663 for (size_t k = k0; k < k1; ++k)
1664 db.names.pop_back();
1665 t = t1;
1666 }
1667 sig += ")";
1668 switch (ref_qual)
1669 {
1670 case 1:
1671 sig += " &";
1672 break;
1673 case 2:
1674 sig += " &&";
1675 break;
1676 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00001677 if (db.names.empty())
1678 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001679 db.names.back().first += " ";
1680 db.names.back().second.insert(0, sig);
1681 first = t;
1682 }
1683 }
1684 }
1685 return first;
1686}
1687
1688// <pointer-to-member-type> ::= M <class type> <member type>
1689
1690template <class C>
1691const char*
1692parse_pointer_to_member_type(const char* first, const char* last, C& db)
1693{
1694 if (first != last && *first == 'M')
1695 {
1696 const char* t = parse_type(first+1, last, db);
1697 if (t != first+1)
1698 {
1699 const char* t2 = parse_type(t, last, db);
1700 if (t2 != t)
1701 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001702 if (db.names.size() < 2)
1703 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001704 auto func = std::move(db.names.back());
1705 db.names.pop_back();
1706 auto class_type = std::move(db.names.back());
1707 if (func.second.front() == '(')
1708 {
1709 db.names.back().first = std::move(func.first) + "(" + class_type.move_full() + "::*";
1710 db.names.back().second = ")" + std::move(func.second);
1711 }
1712 else
1713 {
1714 db.names.back().first = std::move(func.first) + " " + class_type.move_full() + "::*";
1715 db.names.back().second = std::move(func.second);
1716 }
1717 first = t2;
1718 }
1719 }
1720 }
1721 return first;
1722}
1723
1724// <array-type> ::= A <positive dimension number> _ <element type>
1725// ::= A [<dimension expression>] _ <element type>
1726
1727template <class C>
1728const char*
1729parse_array_type(const char* first, const char* last, C& db)
1730{
1731 if (first != last && *first == 'A' && first+1 != last)
1732 {
1733 if (first[1] == '_')
1734 {
1735 const char* t = parse_type(first+2, last, db);
1736 if (t != first+2)
1737 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001738 if (db.names.empty())
1739 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001740 if (db.names.back().second.substr(0, 2) == " [")
1741 db.names.back().second.erase(0, 1);
1742 db.names.back().second.insert(0, " []");
1743 first = t;
1744 }
1745 }
1746 else if ('1' <= first[1] && first[1] <= '9')
1747 {
1748 const char* t = parse_number(first+1, last);
1749 if (t != last && *t == '_')
1750 {
1751 const char* t2 = parse_type(t+1, last, db);
1752 if (t2 != t+1)
1753 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001754 if (db.names.empty())
1755 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001756 if (db.names.back().second.substr(0, 2) == " [")
1757 db.names.back().second.erase(0, 1);
1758 db.names.back().second.insert(0, " [" + typename C::String(first+1, t) + "]");
1759 first = t2;
1760 }
1761 }
1762 }
1763 else
1764 {
1765 const char* t = parse_expression(first+1, last, db);
1766 if (t != first+1 && t != last && *t == '_')
1767 {
1768 const char* t2 = parse_type(++t, last, db);
1769 if (t2 != t)
1770 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001771 if (db.names.size() < 2)
1772 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001773 auto type = std::move(db.names.back());
1774 db.names.pop_back();
1775 auto expr = std::move(db.names.back());
1776 db.names.back().first = std::move(type.first);
1777 if (type.second.substr(0, 2) == " [")
1778 type.second.erase(0, 1);
1779 db.names.back().second = " [" + expr.move_full() + "]" + std::move(type.second);
1780 first = t2;
1781 }
1782 }
1783 }
1784 }
1785 return first;
1786}
1787
1788// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
1789// ::= DT <expression> E # decltype of an expression (C++0x)
1790
1791template <class C>
1792const char*
1793parse_decltype(const char* first, const char* last, C& db)
1794{
1795 if (last - first >= 4 && first[0] == 'D')
1796 {
1797 switch (first[1])
1798 {
1799 case 't':
1800 case 'T':
1801 {
1802 const char* t = parse_expression(first+2, last, db);
1803 if (t != first+2 && t != last && *t == 'E')
1804 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001805 if (db.names.empty())
1806 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001807 db.names.back() = "decltype(" + db.names.back().move_full() + ")";
1808 first = t+1;
1809 }
1810 }
1811 break;
1812 }
1813 }
1814 return first;
1815}
1816
1817// extension:
1818// <vector-type> ::= Dv <positive dimension number> _
1819// <extended element type>
1820// ::= Dv [<dimension expression>] _ <element type>
1821// <extended element type> ::= <element type>
1822// ::= p # AltiVec vector pixel
1823
1824template <class C>
1825const char*
1826parse_vector_type(const char* first, const char* last, C& db)
1827{
1828 if (last - first > 3 && first[0] == 'D' && first[1] == 'v')
1829 {
1830 if ('1' <= first[2] && first[2] <= '9')
1831 {
1832 const char* t = parse_number(first+2, last);
1833 if (t == last || *t != '_')
1834 return first;
1835 const char* num = first + 2;
1836 size_t sz = static_cast<size_t>(t - num);
1837 if (++t != last)
1838 {
1839 if (*t != 'p')
1840 {
1841 const char* t1 = parse_type(t, last, db);
1842 if (t1 != t)
1843 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001844 if (db.names.empty())
1845 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001846 db.names.back().first += " vector[" + typename C::String(num, sz) + "]";
1847 first = t1;
1848 }
1849 }
1850 else
1851 {
1852 ++t;
1853 db.names.push_back("pixel vector[" + typename C::String(num, sz) + "]");
1854 first = t;
1855 }
1856 }
1857 }
1858 else
1859 {
1860 typename C::String num;
1861 const char* t1 = first+2;
1862 if (*t1 != '_')
1863 {
1864 const char* t = parse_expression(t1, last, db);
1865 if (t != t1)
1866 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001867 if (db.names.empty())
1868 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001869 num = db.names.back().move_full();
1870 db.names.pop_back();
1871 t1 = t;
1872 }
1873 }
1874 if (t1 != last && *t1 == '_' && ++t1 != last)
1875 {
1876 const char* t = parse_type(t1, last, db);
1877 if (t != t1)
1878 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001879 if (db.names.empty())
1880 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001881 db.names.back().first += " vector[" + num + "]";
1882 first = t;
1883 }
1884 }
1885 }
1886 }
1887 return first;
1888}
1889
1890// <type> ::= <builtin-type>
1891// ::= <function-type>
1892// ::= <class-enum-type>
1893// ::= <array-type>
1894// ::= <pointer-to-member-type>
1895// ::= <template-param>
1896// ::= <template-template-param> <template-args>
1897// ::= <decltype>
1898// ::= <substitution>
1899// ::= <CV-qualifiers> <type>
1900// ::= P <type> # pointer-to
1901// ::= R <type> # reference-to
1902// ::= O <type> # rvalue reference-to (C++0x)
1903// ::= C <type> # complex pair (C 2000)
1904// ::= G <type> # imaginary (C 2000)
1905// ::= Dp <type> # pack expansion (C++0x)
1906// ::= U <source-name> <type> # vendor extended type qualifier
1907// extension := U <objc-name> <objc-type> # objc-type<identifier>
1908// extension := <vector-type> # <vector-type> starts with Dv
1909
1910// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
1911// <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
1912
1913template <class C>
1914const char*
1915parse_type(const char* first, const char* last, C& db)
1916{
1917 if (first != last)
1918 {
1919 switch (*first)
1920 {
1921 case 'r':
1922 case 'V':
1923 case 'K':
1924 {
1925 unsigned cv = 0;
1926 const char* t = parse_cv_qualifiers(first, last, cv);
1927 if (t != first)
1928 {
1929 bool is_function = *t == 'F';
1930 size_t k0 = db.names.size();
1931 const char* t1 = parse_type(t, last, db);
1932 size_t k1 = db.names.size();
1933 if (t1 != t)
1934 {
1935 if (is_function)
1936 db.subs.pop_back();
1937 db.subs.emplace_back(db.names.get_allocator());
1938 for (size_t k = k0; k < k1; ++k)
1939 {
1940 if (is_function)
1941 {
1942 size_t p = db.names[k].second.size();
1943 if (db.names[k].second[p-2] == '&')
1944 p -= 3;
1945 else if (db.names[k].second.back() == '&')
1946 p -= 2;
1947 if (cv & 1)
1948 {
1949 db.names[k].second.insert(p, " const");
1950 p += 6;
1951 }
1952 if (cv & 2)
1953 {
1954 db.names[k].second.insert(p, " volatile");
1955 p += 9;
1956 }
1957 if (cv & 4)
1958 db.names[k].second.insert(p, " restrict");
1959 }
1960 else
1961 {
1962 if (cv & 1)
1963 db.names[k].first.append(" const");
1964 if (cv & 2)
1965 db.names[k].first.append(" volatile");
1966 if (cv & 4)
1967 db.names[k].first.append(" restrict");
1968 }
1969 db.subs.back().push_back(db.names[k]);
1970 }
1971 first = t1;
1972 }
1973 }
1974 }
1975 break;
1976 default:
1977 {
1978 const char* t = parse_builtin_type(first, last, db);
1979 if (t != first)
1980 {
1981 first = t;
1982 }
1983 else
1984 {
1985 switch (*first)
1986 {
1987 case 'A':
1988 t = parse_array_type(first, last, db);
1989 if (t != first)
1990 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00001991 if (db.names.empty())
1992 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00001993 first = t;
1994 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1995 }
1996 break;
1997 case 'C':
1998 t = parse_type(first+1, last, db);
1999 if (t != first+1)
2000 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002001 if (db.names.empty())
2002 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002003 db.names.back().first.append(" complex");
2004 first = t;
2005 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2006 }
2007 break;
2008 case 'F':
2009 t = parse_function_type(first, last, db);
2010 if (t != first)
2011 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002012 if (db.names.empty())
2013 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002014 first = t;
2015 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2016 }
2017 break;
2018 case 'G':
2019 t = parse_type(first+1, last, db);
2020 if (t != first+1)
2021 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002022 if (db.names.empty())
2023 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002024 db.names.back().first.append(" imaginary");
2025 first = t;
2026 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2027 }
2028 break;
2029 case 'M':
2030 t = parse_pointer_to_member_type(first, last, db);
2031 if (t != first)
2032 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002033 if (db.names.empty())
2034 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002035 first = t;
2036 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2037 }
2038 break;
2039 case 'O':
2040 {
2041 size_t k0 = db.names.size();
2042 t = parse_type(first+1, last, db);
2043 size_t k1 = db.names.size();
2044 if (t != first+1)
2045 {
2046 db.subs.emplace_back(db.names.get_allocator());
2047 for (size_t k = k0; k < k1; ++k)
2048 {
2049 if (db.names[k].second.substr(0, 2) == " [")
2050 {
2051 db.names[k].first += " (";
2052 db.names[k].second.insert(0, ")");
2053 }
2054 else if (db.names[k].second.front() == '(')
2055 {
2056 db.names[k].first += "(";
2057 db.names[k].second.insert(0, ")");
2058 }
2059 db.names[k].first.append("&&");
2060 db.subs.back().push_back(db.names[k]);
2061 }
2062 first = t;
2063 }
2064 break;
2065 }
2066 case 'P':
2067 {
2068 size_t k0 = db.names.size();
2069 t = parse_type(first+1, last, db);
2070 size_t k1 = db.names.size();
2071 if (t != first+1)
2072 {
2073 db.subs.emplace_back(db.names.get_allocator());
2074 for (size_t k = k0; k < k1; ++k)
2075 {
2076 if (db.names[k].second.substr(0, 2) == " [")
2077 {
2078 db.names[k].first += " (";
2079 db.names[k].second.insert(0, ")");
2080 }
2081 else if (db.names[k].second.front() == '(')
2082 {
2083 db.names[k].first += "(";
2084 db.names[k].second.insert(0, ")");
2085 }
2086 if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
2087 {
2088 db.names[k].first.append("*");
2089 }
2090 else
2091 {
2092 db.names[k].first.replace(0, 11, "id");
2093 }
2094 db.subs.back().push_back(db.names[k]);
2095 }
2096 first = t;
2097 }
2098 break;
2099 }
2100 case 'R':
2101 {
2102 size_t k0 = db.names.size();
2103 t = parse_type(first+1, last, db);
2104 size_t k1 = db.names.size();
2105 if (t != first+1)
2106 {
2107 db.subs.emplace_back(db.names.get_allocator());
2108 for (size_t k = k0; k < k1; ++k)
2109 {
2110 if (db.names[k].second.substr(0, 2) == " [")
2111 {
2112 db.names[k].first += " (";
2113 db.names[k].second.insert(0, ")");
2114 }
2115 else if (db.names[k].second.front() == '(')
2116 {
2117 db.names[k].first += "(";
2118 db.names[k].second.insert(0, ")");
2119 }
2120 db.names[k].first.append("&");
2121 db.subs.back().push_back(db.names[k]);
2122 }
2123 first = t;
2124 }
2125 break;
2126 }
2127 case 'T':
2128 {
2129 size_t k0 = db.names.size();
2130 t = parse_template_param(first, last, db);
2131 size_t k1 = db.names.size();
2132 if (t != first)
2133 {
2134 db.subs.emplace_back(db.names.get_allocator());
2135 for (size_t k = k0; k < k1; ++k)
2136 db.subs.back().push_back(db.names[k]);
2137 if (db.try_to_parse_template_args && k1 == k0+1)
2138 {
2139 const char* t1 = parse_template_args(t, last, db);
2140 if (t1 != t)
2141 {
2142 auto args = db.names.back().move_full();
2143 db.names.pop_back();
2144 db.names.back().first += std::move(args);
2145 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2146 t = t1;
2147 }
2148 }
2149 first = t;
2150 }
2151 break;
2152 }
2153 case 'U':
2154 if (first+1 != last)
2155 {
2156 t = parse_source_name(first+1, last, db);
2157 if (t != first+1)
2158 {
2159 const char* t2 = parse_type(t, last, db);
2160 if (t2 != t)
2161 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002162 if (db.names.size() < 2)
2163 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002164 auto type = db.names.back().move_full();
2165 db.names.pop_back();
2166 if (db.names.back().first.substr(0, 9) != "objcproto")
2167 {
2168 db.names.back() = type + " " + db.names.back().move_full();
2169 }
2170 else
2171 {
2172 auto proto = db.names.back().move_full();
2173 db.names.pop_back();
2174 t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2175 if (t != proto.data() + 9)
2176 {
2177 db.names.back() = type + "<" + db.names.back().move_full() + ">";
2178 }
2179 else
2180 {
2181 db.names.push_back(type + " " + proto);
2182 }
2183 }
2184 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2185 first = t2;
2186 }
2187 }
2188 }
2189 break;
2190 case 'S':
2191 if (first+1 != last && first[1] == 't')
2192 {
2193 t = parse_name(first, last, db);
2194 if (t != first)
2195 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002196 if (db.names.empty())
2197 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002198 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2199 first = t;
2200 }
2201 }
2202 else
2203 {
2204 t = parse_substitution(first, last, db);
2205 if (t != first)
2206 {
2207 first = t;
2208 // Parsed a substitution. If the substitution is a
2209 // <template-param> it might be followed by <template-args>.
2210 t = parse_template_args(first, last, db);
2211 if (t != first)
2212 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002213 if (db.names.size() < 2)
2214 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002215 auto template_args = db.names.back().move_full();
2216 db.names.pop_back();
2217 db.names.back().first += template_args;
2218 // Need to create substitution for <template-template-param> <template-args>
2219 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2220 first = t;
2221 }
2222 }
2223 }
2224 break;
2225 case 'D':
2226 if (first+1 != last)
2227 {
2228 switch (first[1])
2229 {
2230 case 'p':
2231 {
2232 size_t k0 = db.names.size();
2233 t = parse_type(first+2, last, db);
2234 size_t k1 = db.names.size();
2235 if (t != first+2)
2236 {
2237 db.subs.emplace_back(db.names.get_allocator());
2238 for (size_t k = k0; k < k1; ++k)
2239 db.subs.back().push_back(db.names[k]);
2240 first = t;
2241 return first;
2242 }
2243 break;
2244 }
2245 case 't':
2246 case 'T':
2247 t = parse_decltype(first, last, db);
2248 if (t != first)
2249 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002250 if (db.names.empty())
2251 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002252 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2253 first = t;
2254 return first;
2255 }
2256 break;
2257 case 'v':
2258 t = parse_vector_type(first, last, db);
2259 if (t != first)
2260 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002261 if (db.names.empty())
2262 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002263 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2264 first = t;
2265 return first;
2266 }
2267 break;
2268 }
2269 }
2270 // drop through
2271 default:
2272 // must check for builtin-types before class-enum-types to avoid
2273 // ambiguities with operator-names
2274 t = parse_builtin_type(first, last, db);
2275 if (t != first)
2276 {
2277 first = t;
2278 }
2279 else
2280 {
2281 t = parse_name(first, last, db);
2282 if (t != first)
2283 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002284 if (db.names.empty())
2285 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002286 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2287 first = t;
2288 }
2289 }
2290 break;
2291 }
2292 }
2293 break;
2294 }
2295 }
2296 }
2297 return first;
2298}
2299
2300// <operator-name>
2301// ::= aa # &&
2302// ::= ad # & (unary)
2303// ::= an # &
2304// ::= aN # &=
2305// ::= aS # =
2306// ::= cl # ()
2307// ::= cm # ,
2308// ::= co # ~
2309// ::= cv <type> # (cast)
2310// ::= da # delete[]
2311// ::= de # * (unary)
2312// ::= dl # delete
2313// ::= dv # /
2314// ::= dV # /=
2315// ::= eo # ^
2316// ::= eO # ^=
2317// ::= eq # ==
2318// ::= ge # >=
2319// ::= gt # >
2320// ::= ix # []
2321// ::= le # <=
Greg Clayton146b7b12014-01-23 22:12:54 +00002322// ::= li <source-name> # operator ""
Greg Clayton19c8e782013-10-30 18:42:59 +00002323// ::= ls # <<
2324// ::= lS # <<=
2325// ::= lt # <
2326// ::= mi # -
2327// ::= mI # -=
2328// ::= ml # *
2329// ::= mL # *=
2330// ::= mm # -- (postfix in <expression> context)
2331// ::= na # new[]
2332// ::= ne # !=
2333// ::= ng # - (unary)
2334// ::= nt # !
2335// ::= nw # new
2336// ::= oo # ||
2337// ::= or # |
2338// ::= oR # |=
2339// ::= pm # ->*
2340// ::= pl # +
2341// ::= pL # +=
2342// ::= pp # ++ (postfix in <expression> context)
2343// ::= ps # + (unary)
2344// ::= pt # ->
2345// ::= qu # ?
2346// ::= rm # %
2347// ::= rM # %=
2348// ::= rs # >>
2349// ::= rS # >>=
2350// ::= v <digit> <source-name> # vendor extended operator
2351
2352template <class C>
2353const char*
2354parse_operator_name(const char* first, const char* last, C& db)
2355{
2356 if (last - first >= 2)
2357 {
2358 switch (first[0])
2359 {
2360 case 'a':
2361 switch (first[1])
2362 {
2363 case 'a':
2364 db.names.push_back("operator&&");
2365 first += 2;
2366 break;
2367 case 'd':
2368 case 'n':
2369 db.names.push_back("operator&");
2370 first += 2;
2371 break;
2372 case 'N':
2373 db.names.push_back("operator&=");
2374 first += 2;
2375 break;
2376 case 'S':
2377 db.names.push_back("operator=");
2378 first += 2;
2379 break;
2380 }
2381 break;
2382 case 'c':
2383 switch (first[1])
2384 {
2385 case 'l':
2386 db.names.push_back("operator()");
2387 first += 2;
2388 break;
2389 case 'm':
2390 db.names.push_back("operator,");
2391 first += 2;
2392 break;
2393 case 'o':
2394 db.names.push_back("operator~");
2395 first += 2;
2396 break;
2397 case 'v':
2398 {
2399 bool try_to_parse_template_args = db.try_to_parse_template_args;
2400 db.try_to_parse_template_args = false;
2401 const char* t = parse_type(first+2, last, db);
2402 db.try_to_parse_template_args = try_to_parse_template_args;
2403 if (t != first+2)
2404 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002405 if (db.names.empty())
2406 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002407 db.names.back().first.insert(0, "operator ");
2408 db.parsed_ctor_dtor_cv = true;
2409 first = t;
2410 }
2411 }
2412 break;
2413 }
2414 break;
2415 case 'd':
2416 switch (first[1])
2417 {
2418 case 'a':
2419 db.names.push_back("operator delete[]");
2420 first += 2;
2421 break;
2422 case 'e':
2423 db.names.push_back("operator*");
2424 first += 2;
2425 break;
2426 case 'l':
2427 db.names.push_back("operator delete");
2428 first += 2;
2429 break;
2430 case 'v':
2431 db.names.push_back("operator/");
2432 first += 2;
2433 break;
2434 case 'V':
2435 db.names.push_back("operator/=");
2436 first += 2;
2437 break;
2438 }
2439 break;
2440 case 'e':
2441 switch (first[1])
2442 {
2443 case 'o':
2444 db.names.push_back("operator^");
2445 first += 2;
2446 break;
2447 case 'O':
2448 db.names.push_back("operator^=");
2449 first += 2;
2450 break;
2451 case 'q':
2452 db.names.push_back("operator==");
2453 first += 2;
2454 break;
2455 }
2456 break;
2457 case 'g':
2458 switch (first[1])
2459 {
2460 case 'e':
2461 db.names.push_back("operator>=");
2462 first += 2;
2463 break;
2464 case 't':
2465 db.names.push_back("operator>");
2466 first += 2;
2467 break;
2468 }
2469 break;
2470 case 'i':
2471 if (first[1] == 'x')
2472 {
2473 db.names.push_back("operator[]");
2474 first += 2;
2475 }
2476 break;
2477 case 'l':
2478 switch (first[1])
2479 {
2480 case 'e':
2481 db.names.push_back("operator<=");
2482 first += 2;
2483 break;
Greg Clayton146b7b12014-01-23 22:12:54 +00002484 case 'i':
2485 {
2486 const char* t = parse_source_name(first+2, last, db);
2487 if (t != first+2)
2488 {
2489 if (db.names.empty())
2490 return first;
2491 db.names.back().first.insert(0, "operator\"\" ");
2492 first = t;
2493 }
2494 }
2495 break;
Greg Clayton19c8e782013-10-30 18:42:59 +00002496 case 's':
2497 db.names.push_back("operator<<");
2498 first += 2;
2499 break;
2500 case 'S':
2501 db.names.push_back("operator<<=");
2502 first += 2;
2503 break;
2504 case 't':
2505 db.names.push_back("operator<");
2506 first += 2;
2507 break;
2508 }
2509 break;
2510 case 'm':
2511 switch (first[1])
2512 {
2513 case 'i':
2514 db.names.push_back("operator-");
2515 first += 2;
2516 break;
2517 case 'I':
2518 db.names.push_back("operator-=");
2519 first += 2;
2520 break;
2521 case 'l':
2522 db.names.push_back("operator*");
2523 first += 2;
2524 break;
2525 case 'L':
2526 db.names.push_back("operator*=");
2527 first += 2;
2528 break;
2529 case 'm':
2530 db.names.push_back("operator--");
2531 first += 2;
2532 break;
2533 }
2534 break;
2535 case 'n':
2536 switch (first[1])
2537 {
2538 case 'a':
2539 db.names.push_back("operator new[]");
2540 first += 2;
2541 break;
2542 case 'e':
2543 db.names.push_back("operator!=");
2544 first += 2;
2545 break;
2546 case 'g':
2547 db.names.push_back("operator-");
2548 first += 2;
2549 break;
2550 case 't':
2551 db.names.push_back("operator!");
2552 first += 2;
2553 break;
2554 case 'w':
2555 db.names.push_back("operator new");
2556 first += 2;
2557 break;
2558 }
2559 break;
2560 case 'o':
2561 switch (first[1])
2562 {
2563 case 'o':
2564 db.names.push_back("operator||");
2565 first += 2;
2566 break;
2567 case 'r':
2568 db.names.push_back("operator|");
2569 first += 2;
2570 break;
2571 case 'R':
2572 db.names.push_back("operator|=");
2573 first += 2;
2574 break;
2575 }
2576 break;
2577 case 'p':
2578 switch (first[1])
2579 {
2580 case 'm':
2581 db.names.push_back("operator->*");
2582 first += 2;
2583 break;
2584 case 'l':
2585 db.names.push_back("operator+");
2586 first += 2;
2587 break;
2588 case 'L':
2589 db.names.push_back("operator+=");
2590 first += 2;
2591 break;
2592 case 'p':
2593 db.names.push_back("operator++");
2594 first += 2;
2595 break;
2596 case 's':
2597 db.names.push_back("operator+");
2598 first += 2;
2599 break;
2600 case 't':
2601 db.names.push_back("operator->");
2602 first += 2;
2603 break;
2604 }
2605 break;
2606 case 'q':
2607 if (first[1] == 'u')
2608 {
2609 db.names.push_back("operator?");
2610 first += 2;
2611 }
2612 break;
2613 case 'r':
2614 switch (first[1])
2615 {
2616 case 'm':
2617 db.names.push_back("operator%");
2618 first += 2;
2619 break;
2620 case 'M':
2621 db.names.push_back("operator%=");
2622 first += 2;
2623 break;
2624 case 's':
2625 db.names.push_back("operator>>");
2626 first += 2;
2627 break;
2628 case 'S':
2629 db.names.push_back("operator>>=");
2630 first += 2;
2631 break;
2632 }
2633 break;
2634 case 'v':
2635 if (std::isdigit(first[1]))
2636 {
2637 const char* t = parse_source_name(first+2, last, db);
2638 if (t != first+2)
2639 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002640 if (db.names.empty())
2641 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002642 db.names.back().first.insert(0, "operator ");
2643 first = t;
2644 }
2645 }
2646 break;
2647 }
2648 }
2649 return first;
2650}
2651
2652template <class C>
2653const char*
2654parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db)
2655{
2656 const char* t = parse_number(first, last);
2657 if (t != first && t != last && *t == 'E')
2658 {
2659 if (lit.size() > 3)
2660 db.names.push_back("(" + lit + ")");
2661 else
2662 db.names.emplace_back();
2663 if (*first == 'n')
2664 {
2665 db.names.back().first += '-';
2666 ++first;
2667 }
2668 db.names.back().first.append(first, t);
2669 if (lit.size() <= 3)
2670 db.names.back().first += lit;
2671 first = t+1;
2672 }
2673 return first;
2674}
2675
2676// <expr-primary> ::= L <type> <value number> E # integer literal
2677// ::= L <type> <value float> E # floating literal
2678// ::= L <string type> E # string literal
2679// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
2680// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
2681// ::= L <mangled-name> E # external name
2682
2683template <class C>
2684const char*
2685parse_expr_primary(const char* first, const char* last, C& db)
2686{
2687 if (last - first >= 4 && *first == 'L')
2688 {
2689 switch (first[1])
2690 {
2691 case 'w':
2692 {
2693 const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
2694 if (t != first+2)
2695 first = t;
2696 }
2697 break;
2698 case 'b':
2699 if (first[3] == 'E')
2700 {
2701 switch (first[2])
2702 {
2703 case '0':
2704 db.names.push_back("false");
2705 first += 4;
2706 break;
2707 case '1':
2708 db.names.push_back("true");
2709 first += 4;
2710 break;
2711 }
2712 }
2713 break;
2714 case 'c':
2715 {
2716 const char* t = parse_integer_literal(first+2, last, "char", db);
2717 if (t != first+2)
2718 first = t;
2719 }
2720 break;
2721 case 'a':
2722 {
2723 const char* t = parse_integer_literal(first+2, last, "signed char", db);
2724 if (t != first+2)
2725 first = t;
2726 }
2727 break;
2728 case 'h':
2729 {
2730 const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
2731 if (t != first+2)
2732 first = t;
2733 }
2734 break;
2735 case 's':
2736 {
2737 const char* t = parse_integer_literal(first+2, last, "short", db);
2738 if (t != first+2)
2739 first = t;
2740 }
2741 break;
2742 case 't':
2743 {
2744 const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
2745 if (t != first+2)
2746 first = t;
2747 }
2748 break;
2749 case 'i':
2750 {
2751 const char* t = parse_integer_literal(first+2, last, "", db);
2752 if (t != first+2)
2753 first = t;
2754 }
2755 break;
2756 case 'j':
2757 {
2758 const char* t = parse_integer_literal(first+2, last, "u", db);
2759 if (t != first+2)
2760 first = t;
2761 }
2762 break;
2763 case 'l':
2764 {
2765 const char* t = parse_integer_literal(first+2, last, "l", db);
2766 if (t != first+2)
2767 first = t;
2768 }
2769 break;
2770 case 'm':
2771 {
2772 const char* t = parse_integer_literal(first+2, last, "ul", db);
2773 if (t != first+2)
2774 first = t;
2775 }
2776 break;
2777 case 'x':
2778 {
2779 const char* t = parse_integer_literal(first+2, last, "ll", db);
2780 if (t != first+2)
2781 first = t;
2782 }
2783 break;
2784 case 'y':
2785 {
2786 const char* t = parse_integer_literal(first+2, last, "ull", db);
2787 if (t != first+2)
2788 first = t;
2789 }
2790 break;
2791 case 'n':
2792 {
2793 const char* t = parse_integer_literal(first+2, last, "__int128", db);
2794 if (t != first+2)
2795 first = t;
2796 }
2797 break;
2798 case 'o':
2799 {
2800 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
2801 if (t != first+2)
2802 first = t;
2803 }
2804 break;
2805 case 'f':
2806 {
2807 const char* t = parse_floating_number<float>(first+2, last, db);
2808 if (t != first+2)
2809 first = t;
2810 }
2811 break;
2812 case 'd':
2813 {
2814 const char* t = parse_floating_number<double>(first+2, last, db);
2815 if (t != first+2)
2816 first = t;
2817 }
2818 break;
2819 case 'e':
2820 {
2821 const char* t = parse_floating_number<long double>(first+2, last, db);
2822 if (t != first+2)
2823 first = t;
2824 }
2825 break;
2826 case '_':
2827 if (first[2] == 'Z')
2828 {
2829 const char* t = parse_encoding(first+3, last, db);
2830 if (t != first+3 && t != last && *t == 'E')
2831 first = t+1;
2832 }
2833 break;
2834 case 'T':
2835 // Invalid mangled name per
2836 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2837 break;
2838 default:
2839 {
2840 // might be named type
2841 const char* t = parse_type(first+1, last, db);
2842 if (t != first+1 && t != last)
2843 {
2844 if (*t != 'E')
2845 {
2846 const char* n = t;
2847 for (; n != last && isdigit(*n); ++n)
2848 ;
2849 if (n != t && n != last && *n == 'E')
2850 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00002851 if (db.names.empty())
2852 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002853 db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
2854 first = n+1;
2855 break;
2856 }
2857 }
2858 else
2859 {
2860 first = t+1;
2861 break;
2862 }
2863 }
2864 }
2865 }
2866 }
2867 return first;
2868}
2869
2870template <class String>
2871String
2872base_name(String& s)
2873{
2874 if (s.empty())
2875 return s;
2876 if (s == "std::string")
2877 {
2878 s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2879 return "basic_string";
2880 }
2881 if (s == "std::istream")
2882 {
2883 s = "std::basic_istream<char, std::char_traits<char> >";
2884 return "basic_istream";
2885 }
2886 if (s == "std::ostream")
2887 {
2888 s = "std::basic_ostream<char, std::char_traits<char> >";
2889 return "basic_ostream";
2890 }
2891 if (s == "std::iostream")
2892 {
2893 s = "std::basic_iostream<char, std::char_traits<char> >";
2894 return "basic_iostream";
2895 }
2896 const char* const pf = s.data();
2897 const char* pe = pf + s.size();
2898 if (pe[-1] == '>')
2899 {
2900 unsigned c = 1;
2901 while (true)
2902 {
2903 if (--pe == pf)
2904 return String();
2905 if (pe[-1] == '<')
2906 {
2907 if (--c == 0)
2908 {
2909 --pe;
2910 break;
2911 }
2912 }
2913 else if (pe[-1] == '>')
2914 ++c;
2915 }
2916 }
2917 const char* p0 = pe - 1;
2918 for (; p0 != pf; --p0)
2919 {
2920 if (*p0 == ':')
2921 {
2922 ++p0;
2923 break;
2924 }
2925 }
2926 return String(p0, pe);
2927}
2928
2929// <ctor-dtor-name> ::= C1 # complete object constructor
2930// ::= C2 # base object constructor
2931// ::= C3 # complete object allocating constructor
2932// extension ::= C5 # ?
2933// ::= D0 # deleting destructor
2934// ::= D1 # complete object destructor
2935// ::= D2 # base object destructor
2936// extension ::= D5 # ?
2937
2938template <class C>
2939const char*
2940parse_ctor_dtor_name(const char* first, const char* last, C& db)
2941{
2942 if (last-first >= 2 && !db.names.empty())
2943 {
2944 switch (first[0])
2945 {
2946 case 'C':
2947 switch (first[1])
2948 {
2949 case '1':
2950 case '2':
2951 case '3':
2952 case '5':
Greg Claytonb73a31e2013-12-12 17:39:39 +00002953 if (db.names.empty())
2954 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002955 db.names.push_back(base_name(db.names.back().first));
2956 first += 2;
2957 db.parsed_ctor_dtor_cv = true;
2958 break;
2959 }
2960 break;
2961 case 'D':
2962 switch (first[1])
2963 {
2964 case '0':
2965 case '1':
2966 case '2':
2967 case '5':
Greg Claytonb73a31e2013-12-12 17:39:39 +00002968 if (db.names.empty())
2969 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00002970 db.names.push_back("~" + base_name(db.names.back().first));
2971 first += 2;
2972 db.parsed_ctor_dtor_cv = true;
2973 break;
2974 }
2975 break;
2976 }
2977 }
2978 return first;
2979}
2980
2981// <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2982// ::= <closure-type-name>
2983//
2984// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2985//
2986// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2987
2988template <class C>
2989const char*
2990parse_unnamed_type_name(const char* first, const char* last, C& db)
2991{
2992 if (last - first > 2 && first[0] == 'U')
2993 {
2994 char type = first[1];
2995 switch (type)
2996 {
2997 case 't':
2998 {
2999 db.names.push_back(typename C::String("'unnamed"));
3000 const char* t0 = first+2;
3001 if (t0 == last)
3002 {
3003 db.names.pop_back();
3004 return first;
3005 }
3006 if (std::isdigit(*t0))
3007 {
3008 const char* t1 = t0 + 1;
3009 while (t1 != last && std::isdigit(*t1))
3010 ++t1;
3011 db.names.back().first.append(t0, t1);
3012 t0 = t1;
3013 }
3014 db.names.back().first.push_back('\'');
3015 if (t0 == last || *t0 != '_')
3016 {
3017 db.names.pop_back();
3018 return first;
3019 }
3020 first = t0 + 1;
3021 }
3022 break;
3023 case 'l':
3024 {
3025 db.names.push_back(typename C::String("'lambda'("));
3026 const char* t0 = first+2;
3027 if (first[2] == 'v')
3028 {
3029 db.names.back().first += ')';
3030 ++t0;
3031 }
3032 else
3033 {
3034 const char* t1 = parse_type(t0, last, db);
3035 if (t1 == t0)
3036 {
3037 db.names.pop_back();
3038 return first;
3039 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00003040 if (db.names.size() < 2)
3041 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003042 auto tmp = db.names.back().move_full();
3043 db.names.pop_back();
3044 db.names.back().first.append(tmp);
3045 t0 = t1;
3046 while (true)
3047 {
3048 t1 = parse_type(t0, last, db);
3049 if (t1 == t0)
3050 break;
Greg Claytonb73a31e2013-12-12 17:39:39 +00003051 if (db.names.size() < 2)
3052 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003053 tmp = db.names.back().move_full();
3054 db.names.pop_back();
3055 if (!tmp.empty())
3056 {
3057 db.names.back().first.append(", ");
3058 db.names.back().first.append(tmp);
3059 }
3060 t0 = t1;
3061 }
3062 db.names.back().first.append(")");
3063 }
3064 if (t0 == last || *t0 != 'E')
3065 {
3066 db.names.pop_back();
3067 return first;
3068 }
3069 ++t0;
3070 if (t0 == last)
3071 {
3072 db.names.pop_back();
3073 return first;
3074 }
3075 if (std::isdigit(*t0))
3076 {
3077 const char* t1 = t0 + 1;
3078 while (t1 != last && std::isdigit(*t1))
3079 ++t1;
3080 db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
3081 t0 = t1;
3082 }
3083 if (t0 == last || *t0 != '_')
3084 {
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
3101template <class C>
3102const char*
3103parse_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
3148template <class C>
3149const char*
3150parse_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)
Greg Claytonb73a31e2013-12-12 17:39:39 +00003167 {
3168 if (db.names.empty())
3169 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003170 db.names.back().first.insert(0, "std::");
Greg Claytonb73a31e2013-12-12 17:39:39 +00003171 }
Greg Clayton19c8e782013-10-30 18:42:59 +00003172 first = t1;
3173 }
3174 }
3175 return first;
3176}
3177
3178// at <type> # alignof (a type)
3179
3180template <class C>
3181const char*
3182parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003189 if (db.names.empty())
3190 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003191 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
3200template <class C>
3201const char*
3202parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003209 if (db.names.empty())
3210 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003211 db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3212 first = t;
3213 }
3214 }
3215 return first;
3216}
3217
3218template <class C>
3219const char*
3220parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003225 if (db.names.empty())
3226 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003227 db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
3228 first = t1;
3229 }
3230 return first;
3231}
3232
3233template <class C>
3234const char*
3235parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003240 if (db.names.empty())
3241 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003242 db.names.back().first = op + "(" + db.names.back().move_full() + ")";
3243 first = t1;
3244 }
3245 return first;
3246}
3247
3248template <class C>
3249const char*
3250parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003258 if (db.names.size() < 2)
3259 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003260 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
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
3318template <class C>
3319const char*
3320parse_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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003410 if (db.names.empty())
3411 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003412 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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003431 if (db.names.empty())
3432 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003433 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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003503 if (db.names.size() < 2)
3504 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003505 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
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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003576 if (db.names.empty())
3577 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003578 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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003666 if (db.names.empty())
3667 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003668 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 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00003695 if (db.names.size() < 3)
3696 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00003697 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 db.names.pop_back();
3708 db.names.pop_back();
3709 }
3710 }
3711 else
3712 db.names.pop_back();
3713 }
3714 }
3715 break;
3716 case 'r':
3717 switch (t[1])
3718 {
3719 case 'c':
3720 first = parse_reinterpret_cast_expr(first, last, db);
3721 break;
3722 case 'm':
3723 t = parse_binary_expression(first+2, last, "%", db);
3724 if (t != first+2)
3725 first = t;
3726 break;
3727 case 'M':
3728 t = parse_binary_expression(first+2, last, "%=", db);
3729 if (t != first+2)
3730 first = t;
3731 break;
3732 case 's':
3733 t = parse_binary_expression(first+2, last, ">>", db);
3734 if (t != first+2)
3735 first = t;
3736 break;
3737 case 'S':
3738 t = parse_binary_expression(first+2, last, ">>=", db);
3739 if (t != first+2)
3740 first = t;
3741 break;
3742 }
3743 break;
3744 case 's':
3745 switch (t[1])
3746 {
3747 case 'c':
3748 first = parse_static_cast_expr(first, last, db);
3749 break;
3750 case 'p':
3751 first = parse_pack_expansion(first, last, db);
3752 break;
3753 case 'r':
3754 return parse_unresolved_name(first, last, db);
3755 case 't':
3756 first = parse_sizeof_type_expr(first, last, db);
3757 break;
3758 case 'z':
3759 first = parse_sizeof_expr_expr(first, last, db);
3760 break;
3761 case 'Z':
3762 if (last - t >= 3)
3763 {
3764 switch (t[2])
3765 {
3766 case 'T':
3767 first = parse_sizeof_param_pack_expr(first, last, db);
3768 break;
3769 case 'f':
3770 first = parse_sizeof_function_param_pack_expr(first, last, db);
3771 break;
3772 }
3773 }
3774 break;
3775 }
3776 break;
3777 case 't':
3778 switch (t[1])
3779 {
3780 case 'e':
3781 case 'i':
3782 first = parse_typeid_expr(first, last, db);
3783 break;
3784 case 'r':
3785 db.names.push_back("throw");
3786 first += 2;
3787 break;
3788 case 'w':
3789 first = parse_throw_expr(first, last, db);
3790 break;
3791 }
3792 break;
3793 case '1':
3794 case '2':
3795 case '3':
3796 case '4':
3797 case '5':
3798 case '6':
3799 case '7':
3800 case '8':
3801 case '9':
3802 return parse_unresolved_name(first, last, db);
3803 }
3804 }
3805 return first;
3806}
3807
3808// <template-arg> ::= <type> # type or template
3809// ::= X <expression> E # expression
3810// ::= <expr-primary> # simple expressions
3811// ::= J <template-arg>* E # argument pack
3812// ::= LZ <encoding> E # extension
3813
3814template <class C>
3815const char*
3816parse_template_arg(const char* first, const char* last, C& db)
3817{
3818 if (first != last)
3819 {
3820 const char* t;
3821 switch (*first)
3822 {
3823 case 'X':
3824 t = parse_expression(first+1, last, db);
3825 if (t != first+1)
3826 {
3827 if (t != last && *t == 'E')
3828 first = t+1;
3829 }
3830 break;
3831 case 'J':
3832 t = first+1;
3833 if (t == last)
3834 return first;
3835 while (*t != 'E')
3836 {
3837 const char* t1 = parse_template_arg(t, last, db);
3838 if (t1 == t)
3839 return first;
3840 t = t1;
3841 }
3842 first = t+1;
3843 break;
3844 case 'L':
3845 // <expr-primary> or LZ <encoding> E
3846 if (first+1 != last && first[1] == 'Z')
3847 {
3848 t = parse_encoding(first+2, last, db);
3849 if (t != first+2 && t != last && *t == 'E')
3850 first = t+1;
3851 }
3852 else
3853 first = parse_expr_primary(first, last, db);
3854 break;
3855 default:
3856 // <type>
3857 first = parse_type(first, last, db);
3858 break;
3859 }
3860 }
3861 return first;
3862}
3863
3864// <template-args> ::= I <template-arg>* E
3865// extension, the abi says <template-arg>+
3866
3867template <class C>
3868const char*
3869parse_template_args(const char* first, const char* last, C& db)
3870{
3871 if (last - first >= 2 && *first == 'I')
3872 {
3873 if (db.tag_templates)
3874 db.template_param.back().clear();
3875 const char* t = first+1;
3876 typename C::String args("<");
3877 while (*t != 'E')
3878 {
3879 if (db.tag_templates)
3880 db.template_param.emplace_back(db.names.get_allocator());
3881 size_t k0 = db.names.size();
3882 const char* t1 = parse_template_arg(t, last, db);
3883 size_t k1 = db.names.size();
3884 if (db.tag_templates)
3885 db.template_param.pop_back();
3886 if (t1 == t || t1 == last)
3887 return first;
3888 if (db.tag_templates)
3889 {
3890 db.template_param.back().emplace_back(db.names.get_allocator());
3891 for (size_t k = k0; k < k1; ++k)
3892 db.template_param.back().back().push_back(db.names[k]);
3893 }
3894 for (size_t k = k0; k < k1; ++k)
3895 {
3896 if (args.size() > 1)
3897 args += ", ";
3898 args += db.names[k].move_full();
3899 }
3900 for (; k1 != k0; --k1)
3901 db.names.pop_back();
3902 t = t1;
3903 }
3904 first = t + 1;
3905 if (args.back() != '>')
3906 args += ">";
3907 else
3908 args += " >";
3909 db.names.push_back(std::move(args));
3910
3911 }
3912 return first;
3913}
3914
3915// <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
3916// ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
3917//
3918// <prefix> ::= <prefix> <unqualified-name>
3919// ::= <template-prefix> <template-args>
3920// ::= <template-param>
3921// ::= <decltype>
3922// ::= # empty
3923// ::= <substitution>
3924// ::= <prefix> <data-member-prefix>
3925// extension ::= L
3926//
3927// <template-prefix> ::= <prefix> <template unqualified-name>
3928// ::= <template-param>
3929// ::= <substitution>
3930
3931template <class C>
3932const char*
3933parse_nested_name(const char* first, const char* last, C& db)
3934{
3935 if (first != last && *first == 'N')
3936 {
3937 unsigned cv;
3938 const char* t0 = parse_cv_qualifiers(first+1, last, cv);
3939 if (t0 == last)
3940 return first;
3941 db.ref = 0;
3942 if (*t0 == 'R')
3943 {
3944 db.ref = 1;
3945 ++t0;
3946 }
3947 else if (*t0 == 'O')
3948 {
3949 db.ref = 2;
3950 ++t0;
3951 }
3952 db.names.emplace_back();
3953 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
3954 {
3955 t0 += 2;
3956 db.names.back().first = "std";
3957 }
3958 if (t0 == last)
3959 {
3960 db.names.pop_back();
3961 return first;
3962 }
3963 bool pop_subs = false;
3964 while (*t0 != 'E')
3965 {
3966 const char* t1;
3967 switch (*t0)
3968 {
3969 case 'S':
3970 if (t0 + 1 != last && t0[1] == 't')
3971 goto do_parse_unqualified_name;
3972 t1 = parse_substitution(t0, last, db);
3973 if (t1 != t0 && t1 != last)
3974 {
3975 auto name = db.names.back().move_full();
3976 db.names.pop_back();
3977 if (!db.names.back().first.empty())
3978 {
3979 db.names.back().first += "::" + name;
3980 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3981 }
3982 else
3983 db.names.back().first = name;
3984 pop_subs = true;
3985 t0 = t1;
3986 }
3987 else
3988 return first;
3989 break;
3990 case 'T':
3991 t1 = parse_template_param(t0, last, db);
3992 if (t1 != t0 && t1 != last)
3993 {
3994 auto name = db.names.back().move_full();
3995 db.names.pop_back();
3996 if (!db.names.back().first.empty())
3997 db.names.back().first += "::" + name;
3998 else
3999 db.names.back().first = name;
4000 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4001 pop_subs = true;
4002 t0 = t1;
4003 }
4004 else
4005 return first;
4006 break;
4007 case 'D':
4008 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
4009 goto do_parse_unqualified_name;
4010 t1 = parse_decltype(t0, last, db);
4011 if (t1 != t0 && t1 != last)
4012 {
4013 auto name = db.names.back().move_full();
4014 db.names.pop_back();
4015 if (!db.names.back().first.empty())
4016 db.names.back().first += "::" + name;
4017 else
4018 db.names.back().first = name;
4019 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4020 pop_subs = true;
4021 t0 = t1;
4022 }
4023 else
4024 return first;
4025 break;
4026 case 'I':
4027 t1 = parse_template_args(t0, last, db);
4028 if (t1 != t0 && t1 != last)
4029 {
4030 auto name = db.names.back().move_full();
4031 db.names.pop_back();
4032 db.names.back().first += name;
4033 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4034 t0 = t1;
4035 }
4036 else
4037 return first;
4038 break;
4039 case 'L':
4040 if (++t0 == last)
4041 return first;
4042 break;
4043 default:
4044 do_parse_unqualified_name:
4045 t1 = parse_unqualified_name(t0, last, db);
4046 if (t1 != t0 && t1 != last)
4047 {
4048 auto name = db.names.back().move_full();
4049 db.names.pop_back();
4050 if (!db.names.back().first.empty())
4051 db.names.back().first += "::" + name;
4052 else
4053 db.names.back().first = name;
4054 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4055 pop_subs = true;
4056 t0 = t1;
4057 }
4058 else
4059 return first;
4060 }
4061 }
4062 first = t0 + 1;
4063 db.cv = cv;
4064 if (pop_subs && !db.subs.empty())
4065 db.subs.pop_back();
4066 }
4067 return first;
4068}
4069
4070// <discriminator> := _ <non-negative number> # when number < 10
4071// := __ <non-negative number> _ # when number >= 10
4072// extension := decimal-digit+
4073
4074const char*
4075parse_discriminator(const char* first, const char* last)
4076{
4077 // parse but ignore discriminator
4078 if (first != last)
4079 {
4080 if (*first == '_')
4081 {
4082 const char* t1 = first+1;
4083 if (t1 != last)
4084 {
4085 if (std::isdigit(*t1))
4086 first = t1+1;
4087 else if (*t1 == '_')
4088 {
4089 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4090 ;
4091 if (t1 != last && *t1 == '_')
4092 first = t1 + 1;
4093 }
4094 }
4095 }
4096 else if (std::isdigit(*first))
4097 {
4098 const char* t1 = first+1;
4099 for (; t1 != last && std::isdigit(*t1); ++t1)
4100 ;
4101 first = t1;
4102 }
4103 }
4104 return first;
4105}
4106
4107// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
4108// := Z <function encoding> E s [<discriminator>]
4109// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
4110
4111template <class C>
4112const char*
4113parse_local_name(const char* first, const char* last, C& db)
4114{
4115 if (first != last && *first == 'Z')
4116 {
4117 const char* t = parse_encoding(first+1, last, db);
4118 if (t != first+1 && t != last && *t == 'E' && ++t != last)
4119 {
4120 switch (*t)
4121 {
4122 case 's':
4123 first = parse_discriminator(t+1, last);
Greg Claytonb73a31e2013-12-12 17:39:39 +00004124 if (db.names.empty())
4125 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004126 db.names.back().first.append("::string literal");
4127 break;
4128 case 'd':
4129 if (++t != last)
4130 {
4131 const char* t1 = parse_number(t, last);
4132 if (t1 != last && *t1 == '_')
4133 {
4134 t = t1 + 1;
4135 t1 = parse_name(t, last, db);
4136 if (t1 != t)
4137 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004138 if (db.names.size() < 2)
4139 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004140 auto name = db.names.back().move_full();
4141 db.names.pop_back();
4142 db.names.back().first.append("::");
4143 db.names.back().first.append(name);
4144 first = t1;
4145 }
4146 else
4147 db.names.pop_back();
4148 }
4149 }
4150 break;
4151 default:
4152 {
4153 const char* t1 = parse_name(t, last, db);
4154 if (t1 != t)
4155 {
4156 // parse but ignore discriminator
4157 first = parse_discriminator(t1, last);
Greg Claytonb73a31e2013-12-12 17:39:39 +00004158 if (db.names.size() < 2)
4159 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004160 auto name = db.names.back().move_full();
4161 db.names.pop_back();
4162 db.names.back().first.append("::");
4163 db.names.back().first.append(name);
4164 }
4165 else
4166 db.names.pop_back();
4167 }
4168 break;
4169 }
4170 }
4171 }
4172 return first;
4173}
4174
4175// <name> ::= <nested-name> // N
4176// ::= <local-name> # See Scope Encoding below // Z
4177// ::= <unscoped-template-name> <template-args>
4178// ::= <unscoped-name>
4179
4180// <unscoped-template-name> ::= <unscoped-name>
4181// ::= <substitution>
4182
4183template <class C>
4184const char*
4185parse_name(const char* first, const char* last, C& db)
4186{
4187 if (last - first >= 2)
4188 {
4189 const char* t0 = first;
4190 // extension: ignore L here
4191 if (*t0 == 'L')
4192 ++t0;
4193 switch (*t0)
4194 {
4195 case 'N':
4196 {
4197 const char* t1 = parse_nested_name(t0, last, db);
4198 if (t1 != t0)
4199 first = t1;
4200 break;
4201 }
4202 case 'Z':
4203 {
4204 const char* t1 = parse_local_name(t0, last, db);
4205 if (t1 != t0)
4206 first = t1;
4207 break;
4208 }
4209 default:
4210 {
4211 const char* t1 = parse_unscoped_name(t0, last, db);
4212 if (t1 != t0)
4213 {
4214 if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args>
4215 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004216 if (db.names.empty())
4217 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004218 db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4219 t0 = t1;
4220 t1 = parse_template_args(t0, last, db);
4221 if (t1 != t0)
4222 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004223 if (db.names.size() < 2)
4224 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004225 auto tmp = db.names.back().move_full();
4226 db.names.pop_back();
4227 db.names.back().first += tmp;
4228 first = t1;
4229 }
4230 }
4231 else // <unscoped-name>
4232 first = t1;
4233 }
4234 else
4235 { // try <substitution> <template-args>
4236 t1 = parse_substitution(t0, last, db);
4237 if (t1 != t0 && t1 != last && *t1 == 'I')
4238 {
4239 t0 = t1;
4240 t1 = parse_template_args(t0, last, db);
4241 if (t1 != t0)
4242 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004243 if (db.names.size() < 2)
4244 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004245 auto tmp = db.names.back().move_full();
4246 db.names.pop_back();
4247 db.names.back().first += tmp;
4248 first = t1;
4249 }
4250 }
4251 }
4252 break;
4253 }
4254 }
4255 }
4256 return first;
4257}
4258
4259// <call-offset> ::= h <nv-offset> _
4260// ::= v <v-offset> _
4261//
4262// <nv-offset> ::= <offset number>
4263// # non-virtual base override
4264//
4265// <v-offset> ::= <offset number> _ <virtual offset number>
4266// # virtual base override, with vcall offset
4267
4268const char*
4269parse_call_offset(const char* first, const char* last)
4270{
4271 if (first != last)
4272 {
4273 switch (*first)
4274 {
4275 case 'h':
4276 {
4277 const char* t = parse_number(first + 1, last);
4278 if (t != first + 1 && t != last && *t == '_')
4279 first = t + 1;
4280 }
4281 break;
4282 case 'v':
4283 {
4284 const char* t = parse_number(first + 1, last);
4285 if (t != first + 1 && t != last && *t == '_')
4286 {
4287 const char* t2 = parse_number(++t, last);
4288 if (t2 != t && t2 != last && *t2 == '_')
4289 first = t2 + 1;
4290 }
4291 }
4292 break;
4293 }
4294 }
4295 return first;
4296}
4297
4298// <special-name> ::= TV <type> # virtual table
4299// ::= TT <type> # VTT structure (construction vtable index)
4300// ::= TI <type> # typeinfo structure
4301// ::= TS <type> # typeinfo name (null-terminated byte string)
4302// ::= Tc <call-offset> <call-offset> <base encoding>
4303// # base is the nominal target function of thunk
4304// # first call-offset is 'this' adjustment
4305// # second call-offset is result adjustment
4306// ::= T <call-offset> <base encoding>
4307// # base is the nominal target function of thunk
4308// ::= GV <object name> # Guard variable for one-time initialization
4309// # No <type>
4310// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4311// extension ::= GR <object name> # reference temporary for object
4312
4313template <class C>
4314const char*
4315parse_special_name(const char* first, const char* last, C& db)
4316{
4317 if (last - first > 2)
4318 {
4319 const char* t;
4320 switch (*first)
4321 {
4322 case 'T':
4323 switch (first[1])
4324 {
4325 case 'V':
4326 // TV <type> # virtual table
4327 t = parse_type(first+2, last, db);
4328 if (t != first+2)
4329 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004330 if (db.names.empty())
4331 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004332 db.names.back().first.insert(0, "vtable for ");
4333 first = t;
4334 }
4335 break;
4336 case 'T':
4337 // TT <type> # VTT structure (construction vtable index)
4338 t = parse_type(first+2, last, db);
4339 if (t != first+2)
4340 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004341 if (db.names.empty())
4342 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004343 db.names.back().first.insert(0, "VTT for ");
4344 first = t;
4345 }
4346 break;
4347 case 'I':
4348 // TI <type> # typeinfo structure
4349 t = parse_type(first+2, last, db);
4350 if (t != first+2)
4351 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004352 if (db.names.empty())
4353 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004354 db.names.back().first.insert(0, "typeinfo for ");
4355 first = t;
4356 }
4357 break;
4358 case 'S':
4359 // TS <type> # typeinfo name (null-terminated byte string)
4360 t = parse_type(first+2, last, db);
4361 if (t != first+2)
4362 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004363 if (db.names.empty())
4364 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004365 db.names.back().first.insert(0, "typeinfo name for ");
4366 first = t;
4367 }
4368 break;
4369 case 'c':
4370 // Tc <call-offset> <call-offset> <base encoding>
4371 {
4372 const char* t0 = parse_call_offset(first+2, last);
4373 if (t0 == first+2)
4374 break;
4375 const char* t1 = parse_call_offset(t0, last);
4376 if (t1 == t0)
4377 break;
4378 t = parse_encoding(t1, last, db);
4379 if (t != t1)
4380 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004381 if (db.names.empty())
4382 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004383 db.names.back().first.insert(0, "covariant return thunk to ");
4384 first = t;
4385 }
4386 }
4387 break;
4388 case 'C':
4389 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
4390 t = parse_type(first+2, last, db);
4391 if (t != first+2)
4392 {
4393 const char* t0 = parse_number(t, last);
4394 if (t0 != t && t0 != last && *t0 == '_')
4395 {
4396 const char* t1 = parse_type(++t0, last, db);
4397 if (t1 != t0)
4398 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004399 if (db.names.size() < 2)
4400 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004401 auto left = db.names.back().move_full();
4402 db.names.pop_back();
4403 db.names.back().first = "construction vtable for " +
4404 std::move(left) + "-in-" +
4405 db.names.back().move_full();
4406 first = t1;
4407 }
4408 }
4409 }
4410 break;
4411 default:
4412 // T <call-offset> <base encoding>
4413 {
4414 const char* t0 = parse_call_offset(first+1, last);
4415 if (t0 == first+1)
4416 break;
4417 t = parse_encoding(t0, last, db);
4418 if (t != t0)
4419 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004420 if (db.names.empty())
4421 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004422 if (first[2] == 'v')
4423 {
4424 db.names.back().first.insert(0, "virtual thunk to ");
4425 first = t;
4426 }
4427 else
4428 {
4429 db.names.back().first.insert(0, "non-virtual thunk to ");
4430 first = t;
4431 }
4432 }
4433 }
4434 break;
4435 }
4436 break;
4437 case 'G':
4438 switch (first[1])
4439 {
4440 case 'V':
4441 // GV <object name> # Guard variable for one-time initialization
4442 t = parse_name(first+2, last, db);
4443 if (t != first+2)
4444 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004445 if (db.names.empty())
4446 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004447 db.names.back().first.insert(0, "guard variable for ");
4448 first = t;
4449 }
4450 break;
4451 case 'R':
4452 // extension ::= GR <object name> # reference temporary for object
4453 t = parse_name(first+2, last, db);
4454 if (t != first+2)
4455 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004456 if (db.names.empty())
4457 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004458 db.names.back().first.insert(0, "reference temporary for ");
4459 first = t;
4460 }
4461 break;
4462 }
4463 break;
4464 }
4465 }
4466 return first;
4467}
4468
Greg Claytonb73a31e2013-12-12 17:39:39 +00004469template <class T>
4470class save_value
4471{
4472 T& restore_;
4473 T original_value_;
4474public:
4475 save_value(T& restore)
4476 : restore_(restore),
4477 original_value_(restore)
4478 {}
4479
4480 ~save_value()
4481 {
4482 restore_ = std::move(original_value_);
4483 }
4484
4485 save_value(const save_value&) = delete;
4486 save_value& operator=(const save_value&) = delete;
4487};
4488
Greg Clayton19c8e782013-10-30 18:42:59 +00004489// <encoding> ::= <function name> <bare-function-type>
4490// ::= <data name>
4491// ::= <special-name>
4492
4493template <class C>
4494const char*
4495parse_encoding(const char* first, const char* last, C& db)
4496{
4497 if (first != last)
4498 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004499 save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4500 ++db.encoding_depth;
4501 save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4502 if (db.encoding_depth > 1)
4503 db.tag_templates = true;
Greg Clayton19c8e782013-10-30 18:42:59 +00004504 switch (*first)
4505 {
4506 case 'G':
4507 case 'T':
4508 first = parse_special_name(first, last, db);
4509 break;
4510 default:
4511 {
4512 const char* t = parse_name(first, last, db);
4513 unsigned cv = db.cv;
4514 unsigned ref = db.ref;
4515 if (t != first)
4516 {
4517 if (t != last && *t != 'E' && *t != '.')
4518 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004519 save_value<bool> sb2(db.tag_templates);
Greg Clayton19c8e782013-10-30 18:42:59 +00004520 db.tag_templates = false;
4521 const char* t2;
4522 typename C::String ret2;
Greg Claytonb73a31e2013-12-12 17:39:39 +00004523 if (db.names.empty())
4524 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004525 const typename C::String& nm = db.names.back().first;
Greg Claytonb73a31e2013-12-12 17:39:39 +00004526 if (nm.empty())
4527 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004528 if (!db.parsed_ctor_dtor_cv && nm.back() == '>' && nm[nm.size()-2] != '-'
4529 && nm[nm.size()-2] != '>')
4530 {
4531 t2 = parse_type(t, last, db);
4532 if (t2 == t)
4533 return first;
Greg Claytonb73a31e2013-12-12 17:39:39 +00004534 if (db.names.size() < 2)
4535 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004536 auto ret1 = std::move(db.names.back().first);
4537 ret2 = std::move(db.names.back().second);
4538 if (ret2.empty())
4539 ret1 += ' ';
4540 db.names.pop_back();
4541 db.names.back().first.insert(0, ret1);
4542 t = t2;
4543 }
4544 db.names.back().first += '(';
4545 if (t != last && *t == 'v')
4546 {
4547 ++t;
4548 }
4549 else
4550 {
4551 bool first_arg = true;
4552 while (true)
4553 {
4554 size_t k0 = db.names.size();
4555 t2 = parse_type(t, last, db);
4556 size_t k1 = db.names.size();
4557 if (t2 == t)
4558 break;
4559 if (k1 > k0)
4560 {
4561 typename C::String tmp;
4562 for (size_t k = k0; k < k1; ++k)
4563 {
4564 if (!tmp.empty())
4565 tmp += ", ";
4566 tmp += db.names[k].move_full();
4567 }
4568 for (size_t k = k0; k < k1; ++k)
4569 db.names.pop_back();
4570 if (!tmp.empty())
4571 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004572 if (db.names.empty())
4573 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004574 if (!first_arg)
4575 db.names.back().first += ", ";
4576 else
4577 first_arg = false;
4578 db.names.back().first += tmp;
4579 }
4580 }
4581 t = t2;
4582 }
4583 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00004584 if (db.names.empty())
4585 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004586 db.names.back().first += ')';
4587 if (cv & 1)
4588 db.names.back().first.append(" const");
4589 if (cv & 2)
4590 db.names.back().first.append(" volatile");
4591 if (cv & 4)
4592 db.names.back().first.append(" restrict");
4593 if (ref == 1)
4594 db.names.back().first.append(" &");
4595 else if (ref == 2)
4596 db.names.back().first.append(" &&");
4597 db.names.back().first += ret2;
4598 first = t;
Greg Clayton19c8e782013-10-30 18:42:59 +00004599 }
4600 else
4601 first = t;
4602 }
4603 break;
4604 }
4605 }
4606 }
4607 return first;
4608}
4609
4610// _block_invoke
4611// _block_invoke<decimal-digit>+
4612// _block_invoke_<decimal-digit>+
4613
4614template <class C>
4615const char*
4616parse_block_invoke(const char* first, const char* last, C& db)
4617{
4618 if (last - first >= 13)
4619 {
4620 const char test[] = "_block_invoke";
4621 const char* t = first;
4622 for (int i = 0; i < 13; ++i, ++t)
4623 {
4624 if (*t != test[i])
4625 return first;
4626 }
4627 if (t != last)
4628 {
4629 if (*t == '_')
4630 {
4631 // must have at least 1 decimal digit
4632 if (++t == last || !std::isdigit(*t))
4633 return first;
4634 ++t;
4635 }
4636 // parse zero or more digits
4637 while (t != last && isdigit(*t))
4638 ++t;
4639 }
Greg Claytonb73a31e2013-12-12 17:39:39 +00004640 if (db.names.empty())
4641 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004642 db.names.back().first.insert(0, "invocation function for block in ");
4643 first = t;
4644 }
4645 return first;
4646}
4647
4648// extension
4649// <dot-suffix> := .<anything and everything>
4650
4651template <class C>
4652const char*
4653parse_dot_suffix(const char* first, const char* last, C& db)
4654{
4655 if (first != last && *first == '.')
4656 {
Greg Claytonb73a31e2013-12-12 17:39:39 +00004657 if (db.names.empty())
4658 return first;
Greg Clayton19c8e782013-10-30 18:42:59 +00004659 db.names.back().first += " (" + typename C::String(first, last) + ")";
4660 first = last;
4661 }
4662 return first;
4663}
4664
4665// <block-involcaton-function> ___Z<encoding>_block_invoke
4666// <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+
4667// <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+
4668// <mangled-name> ::= _Z<encoding>
4669// ::= <type>
4670
4671template <class C>
4672void
4673demangle(const char* first, const char* last, C& db, int& status)
4674{
4675 if (first >= last)
4676 {
4677 status = invalid_mangled_name;
4678 return;
4679 }
4680 if (*first == '_')
4681 {
4682 if (last - first >= 4)
4683 {
4684 if (first[1] == 'Z')
4685 {
4686 const char* t = parse_encoding(first+2, last, db);
4687 if (t != first+2 && t != last && *t == '.')
4688 t = parse_dot_suffix(t, last, db);
4689 if (t != last)
4690 status = invalid_mangled_name;
4691 }
4692 else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z')
4693 {
4694 const char* t = parse_encoding(first+4, last, db);
4695 if (t != first+4 && t != last)
4696 {
4697 const char* t1 = parse_block_invoke(t, last, db);
4698 if (t1 != last)
4699 status = invalid_mangled_name;
4700 }
4701 else
4702 status = invalid_mangled_name;
4703 }
4704 else
4705 status = invalid_mangled_name;
4706 }
4707 else
4708 status = invalid_mangled_name;
4709 }
4710 else
4711 {
4712 const char* t = parse_type(first, last, db);
4713 if (t != last)
4714 status = invalid_mangled_name;
4715 }
4716 if (status == success && db.names.empty())
4717 status = invalid_mangled_name;
4718}
4719
4720template <std::size_t N>
4721class arena
4722{
4723 static const std::size_t alignment = 16;
4724 alignas(alignment) char buf_[N];
4725 char* ptr_;
4726
4727 std::size_t
4728 align_up(std::size_t n) noexcept
4729 {return n + (alignment-1) & ~(alignment-1);}
4730
4731 bool
4732 pointer_in_buffer(char* p) noexcept
4733 {return buf_ <= p && p <= buf_ + N;}
4734
4735public:
4736 arena() noexcept : ptr_(buf_) {}
4737 ~arena() {ptr_ = nullptr;}
4738 arena(const arena&) = delete;
4739 arena& operator=(const arena&) = delete;
4740
4741 char* allocate(std::size_t n);
4742 void deallocate(char* p, std::size_t n) noexcept;
4743
4744 static constexpr std::size_t size() {return N;}
4745 std::size_t used() const {return static_cast<std::size_t>(ptr_ - buf_);}
4746 void reset() {ptr_ = buf_;}
4747};
4748
4749template <std::size_t N>
4750char*
4751arena<N>::allocate(std::size_t n)
4752{
4753 n = align_up(n);
4754 if (static_cast<std::size_t>(buf_ + N - ptr_) >= n)
4755 {
4756 char* r = ptr_;
4757 ptr_ += n;
4758 return r;
4759 }
4760 return static_cast<char*>(std::malloc(n));
4761}
4762
4763template <std::size_t N>
4764void
4765arena<N>::deallocate(char* p, std::size_t n) noexcept
4766{
4767 if (pointer_in_buffer(p))
4768 {
4769 n = align_up(n);
4770 if (p + n == ptr_)
4771 ptr_ = p;
4772 }
4773 else
4774 std::free(p);
4775}
4776
4777template <class T, std::size_t N>
4778class short_alloc
4779{
4780 arena<N>& a_;
4781public:
4782 typedef T value_type;
4783
4784public:
4785 template <class _Up> struct rebind {typedef short_alloc<_Up, N> other;};
4786
4787 short_alloc(arena<N>& a) noexcept : a_(a) {}
4788 template <class U>
4789 short_alloc(const short_alloc<U, N>& a) noexcept
4790 : a_(a.a_) {}
4791 short_alloc(const short_alloc&) = default;
4792 short_alloc& operator=(const short_alloc&) = delete;
4793
4794 T* allocate(std::size_t n)
4795 {
4796 return reinterpret_cast<T*>(a_.allocate(n*sizeof(T)));
4797 }
4798 void deallocate(T* p, std::size_t n) noexcept
4799 {
4800 a_.deallocate(reinterpret_cast<char*>(p), n*sizeof(T));
4801 }
4802
4803 template <class T1, std::size_t N1, class U, std::size_t M>
4804 friend
4805 bool
4806 operator==(const short_alloc<T1, N1>& x, const short_alloc<U, M>& y) noexcept;
4807
4808 template <class U, std::size_t M> friend class short_alloc;
4809};
4810
4811template <class T, std::size_t N, class U, std::size_t M>
4812inline
4813bool
4814operator==(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4815{
4816 return N == M && &x.a_ == &y.a_;
4817}
4818
4819template <class T, std::size_t N, class U, std::size_t M>
4820inline
4821bool
4822operator!=(const short_alloc<T, N>& x, const short_alloc<U, M>& y) noexcept
4823{
4824 return !(x == y);
4825}
4826
4827template <class T>
4828class malloc_alloc
4829{
4830public:
4831 typedef T value_type;
4832
4833 malloc_alloc() = default;
4834 template <class U> malloc_alloc(const malloc_alloc<U>&) noexcept {}
4835
4836 T* allocate(std::size_t n)
4837 {
4838 return static_cast<T*>(std::malloc(n*sizeof(T)));
4839 }
4840 void deallocate(T* p, std::size_t) noexcept
4841 {
4842 std::free(p);
4843 }
4844};
4845
4846template <class T, class U>
4847inline
4848bool
4849operator==(const malloc_alloc<T>&, const malloc_alloc<U>&) noexcept
4850{
4851 return true;
4852}
4853
4854template <class T, class U>
4855inline
4856bool
4857operator!=(const malloc_alloc<T>& x, const malloc_alloc<U>& y) noexcept
4858{
4859 return !(x == y);
4860}
4861
4862const size_t bs = 4 * 1024;
4863template <class T> using Alloc = short_alloc<T, bs>;
4864template <class T> using Vector = std::vector<T, Alloc<T>>;
4865using String = std::basic_string<char, std::char_traits<char>, malloc_alloc<char>>;
4866
4867struct string_pair
4868{
4869 String first;
4870 String second;
4871
4872 string_pair() = default;
4873 string_pair(String f) : first(std::move(f)) {}
4874 string_pair(String f, String s)
4875 : first(std::move(f)), second(std::move(s)) {}
4876 template <size_t N>
4877 string_pair(const char (&s)[N]) : first(s, N-1) {}
4878
4879 size_t size() const {return first.size() + second.size();}
4880 String full() const {return first + second;}
4881 String move_full() {return std::move(first) + std::move(second);}
4882};
4883
4884struct Db
4885{
4886 typedef String String;
4887 typedef Vector<string_pair> sub_type;
4888 typedef Vector<sub_type> template_param_type;
4889 Vector<string_pair> names;
4890 Vector<sub_type> subs;
4891 Vector<template_param_type> template_param;
4892 unsigned cv;
4893 unsigned ref;
Greg Claytonb73a31e2013-12-12 17:39:39 +00004894 unsigned encoding_depth;
Greg Clayton19c8e782013-10-30 18:42:59 +00004895 bool parsed_ctor_dtor_cv;
4896 bool tag_templates;
4897 bool fix_forward_references;
4898 bool try_to_parse_template_args;
4899
4900 template <size_t N>
4901 Db(arena<N>& ar) :
4902 names(ar),
4903 subs(0, names, ar),
4904 template_param(0, subs, ar)
4905 {}
4906};
4907
4908char*
4909__cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status)
4910{
4911 if (mangled_name == nullptr || (buf != nullptr && n == nullptr))
4912 {
4913 if (status)
4914 *status = invalid_args;
4915 return nullptr;
4916 }
4917 size_t internal_size = buf != nullptr ? *n : 0;
4918 arena<bs> a;
4919 Db db(a);
4920 db.cv = 0;
4921 db.ref = 0;
Greg Claytonb73a31e2013-12-12 17:39:39 +00004922 db.encoding_depth = 0;
Greg Clayton19c8e782013-10-30 18:42:59 +00004923 db.parsed_ctor_dtor_cv = false;
4924 db.tag_templates = true;
4925 db.template_param.emplace_back(a);
4926 db.fix_forward_references = false;
4927 db.try_to_parse_template_args = true;
4928 int internal_status = success;
4929 size_t len = std::strlen(mangled_name);
4930 demangle(mangled_name, mangled_name + len, db,
4931 internal_status);
4932 if (internal_status == success && db.fix_forward_references &&
4933 !db.template_param.empty() && !db.template_param.front().empty())
4934 {
4935 db.fix_forward_references = false;
4936 db.tag_templates = false;
4937 db.names.clear();
4938 db.subs.clear();
4939 demangle(mangled_name, mangled_name + len, db, internal_status);
4940 if (db.fix_forward_references)
4941 internal_status = invalid_mangled_name;
4942 }
4943 if (internal_status == success)
4944 {
4945 size_t sz = db.names.back().size() + 1;
4946 if (sz > internal_size)
4947 {
4948 char* newbuf = static_cast<char*>(std::realloc(buf, sz));
4949 if (newbuf == nullptr)
4950 {
4951 internal_status = memory_alloc_failure;
4952 buf = nullptr;
4953 }
4954 else
4955 {
4956 buf = newbuf;
4957 if (n != nullptr)
4958 *n = sz;
4959 }
4960 }
4961 if (buf != nullptr)
4962 {
4963 db.names.back().first += db.names.back().second;
4964 std::memcpy(buf, db.names.back().first.data(), sz-1);
4965 buf[sz-1] = char(0);
4966 }
4967 }
4968 else
4969 buf = nullptr;
4970 if (status)
4971 *status = internal_status;
4972 return buf;
4973}
4974
Greg Claytonb73a31e2013-12-12 17:39:39 +00004975}
Greg Clayton19c8e782013-10-30 18:42:59 +00004976#endif
4977
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004978
Greg Claytone41e5892010-09-03 23:26:12 +00004979#include "llvm/ADT/DenseMap.h"
4980
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004981#include "lldb/Core/ConstString.h"
4982#include "lldb/Core/Mangled.h"
Greg Clayton83c5cd92010-11-14 22:13:40 +00004983#include "lldb/Core/RegularExpression.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004984#include "lldb/Core/Stream.h"
4985#include "lldb/Core/Timer.h"
Eli Friedman88966972010-06-09 08:50:27 +00004986#include <ctype.h>
4987#include <string.h>
Daniel Maleac91e4ab2013-05-31 20:21:38 +00004988#include <stdlib.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +00004989
4990using namespace lldb_private;
4991
Greg Clayton5e0c5e82012-07-18 20:47:40 +00004992static inline bool
4993cstring_is_mangled (const char *s)
4994{
4995 if (s)
4996 return s[0] == '_' && s[1] == 'Z';
4997 return false;
4998}
4999
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005000#pragma mark Mangled
5001//----------------------------------------------------------------------
5002// Default constructor
5003//----------------------------------------------------------------------
5004Mangled::Mangled () :
5005 m_mangled(),
5006 m_demangled()
5007{
5008}
5009
5010//----------------------------------------------------------------------
5011// Constructor with an optional string and a boolean indicating if it is
5012// the mangled version.
5013//----------------------------------------------------------------------
Greg Clayton5e0c5e82012-07-18 20:47:40 +00005014Mangled::Mangled (const ConstString &s, bool mangled) :
5015 m_mangled(),
5016 m_demangled()
5017{
5018 if (s)
5019 SetValue(s, mangled);
5020}
5021
Greg Clayton037520e2012-07-18 23:18:10 +00005022Mangled::Mangled (const ConstString &s) :
Greg Clayton5e0c5e82012-07-18 20:47:40 +00005023 m_mangled(),
5024 m_demangled()
5025{
Greg Clayton5e0c5e82012-07-18 20:47:40 +00005026 if (s)
5027 SetValue(s);
5028}
5029
5030//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005031// Destructor
5032//----------------------------------------------------------------------
5033Mangled::~Mangled ()
5034{
5035}
5036
5037//----------------------------------------------------------------------
5038// Convert to pointer operator. This allows code to check any Mangled
5039// objects to see if they contain anything valid using code such as:
5040//
5041// Mangled mangled(...);
5042// if (mangled)
5043// { ...
5044//----------------------------------------------------------------------
5045Mangled::operator void* () const
5046{
5047 return (m_mangled) ? const_cast<Mangled*>(this) : NULL;
5048}
5049
5050//----------------------------------------------------------------------
5051// Logical NOT operator. This allows code to check any Mangled
5052// objects to see if they are invalid using code such as:
5053//
5054// Mangled mangled(...);
5055// if (!file_spec)
5056// { ...
5057//----------------------------------------------------------------------
5058bool
5059Mangled::operator! () const
5060{
5061 return !m_mangled;
5062}
5063
5064//----------------------------------------------------------------------
5065// Clear the mangled and demangled values.
5066//----------------------------------------------------------------------
5067void
5068Mangled::Clear ()
5069{
5070 m_mangled.Clear();
5071 m_demangled.Clear();
5072}
5073
5074
5075//----------------------------------------------------------------------
5076// Compare the the string values.
5077//----------------------------------------------------------------------
5078int
5079Mangled::Compare (const Mangled& a, const Mangled& b)
5080{
Jim Ingham89bf5e92010-09-15 00:13:44 +00005081 return ConstString::Compare(a.GetName(ePreferMangled), a.GetName(ePreferMangled));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005082}
5083
5084
5085
5086//----------------------------------------------------------------------
5087// Set the string value in this objects. If "mangled" is true, then
5088// the mangled named is set with the new value in "s", else the
5089// demangled name is set.
5090//----------------------------------------------------------------------
5091void
Greg Clayton5e0c5e82012-07-18 20:47:40 +00005092Mangled::SetValue (const ConstString &s, bool mangled)
5093{
5094 if (s)
5095 {
5096 if (mangled)
5097 {
5098 m_demangled.Clear();
5099 m_mangled = s;
5100 }
5101 else
5102 {
5103 m_demangled = s;
5104 m_mangled.Clear();
5105 }
5106 }
5107 else
5108 {
5109 m_demangled.Clear();
5110 m_mangled.Clear();
5111 }
5112}
5113
5114void
5115Mangled::SetValue (const ConstString &name)
5116{
5117 if (name)
5118 {
5119 if (cstring_is_mangled(name.GetCString()))
5120 {
5121 m_demangled.Clear();
5122 m_mangled = name;
5123 }
5124 else
5125 {
5126 m_demangled = name;
5127 m_mangled.Clear();
5128 }
5129 }
5130 else
5131 {
5132 m_demangled.Clear();
5133 m_mangled.Clear();
5134 }
5135}
5136
5137
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005138//----------------------------------------------------------------------
5139// Generate the demangled name on demand using this accessor. Code in
5140// this class will need to use this accessor if it wishes to decode
5141// the demangled name. The result is cached and will be kept until a
5142// new string value is supplied to this object, or until the end of the
5143// object's lifetime.
5144//----------------------------------------------------------------------
5145const ConstString&
5146Mangled::GetDemangledName () const
5147{
5148 // Check to make sure we have a valid mangled name and that we
5149 // haven't already decoded our mangled name.
5150 if (m_mangled && !m_demangled)
5151 {
5152 // We need to generate and cache the demangled name.
5153 Timer scoped_timer (__PRETTY_FUNCTION__,
5154 "Mangled::GetDemangledName (m_mangled = %s)",
5155 m_mangled.GetCString());
5156
Greg Clayton5e0c5e82012-07-18 20:47:40 +00005157 // Don't bother running anything that isn't mangled
5158 const char *mangled_cstr = m_mangled.GetCString();
5159 if (cstring_is_mangled(mangled_cstr))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005160 {
Greg Claytonc3ae1ce2011-06-09 22:34:34 +00005161 if (!m_mangled.GetMangledCounterpart(m_demangled))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005162 {
Greg Claytone41e5892010-09-03 23:26:12 +00005163 // We didn't already mangle this name, demangle it and if all goes well
5164 // add it to our map.
Greg Clayton19c8e782013-10-30 18:42:59 +00005165#ifdef LLDB_USE_BUILTIN_DEMANGLER
5166 char *demangled_name = __cxa_demangle (mangled_cstr, NULL, NULL, NULL);
Colin Riley61979cc2013-11-20 15:19:08 +00005167#elif defined(_MSC_VER)
5168 // Cannot demangle on msvc.
5169 char *demangled_name = nullptr;
Virgile Bellod0c5c772013-09-18 08:09:31 +00005170#else
Greg Clayton19c8e782013-10-30 18:42:59 +00005171 char *demangled_name = abi::__cxa_demangle (mangled_cstr, NULL, NULL, NULL);
Virgile Bellod0c5c772013-09-18 08:09:31 +00005172#endif
Greg Claytone41e5892010-09-03 23:26:12 +00005173
5174 if (demangled_name)
5175 {
Greg Claytonc3ae1ce2011-06-09 22:34:34 +00005176 m_demangled.SetCStringWithMangledCounterpart(demangled_name, m_mangled);
Greg Claytone41e5892010-09-03 23:26:12 +00005177 free (demangled_name);
5178 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005179 }
5180 }
Jason Molenda3f8688b2010-12-15 04:27:04 +00005181 if (!m_demangled)
5182 {
5183 // Set the demangled string to the empty string to indicate we
5184 // tried to parse it once and failed.
5185 m_demangled.SetCString("");
5186 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005187 }
5188
5189 return m_demangled;
5190}
5191
Greg Clayton83c5cd92010-11-14 22:13:40 +00005192
5193bool
5194Mangled::NameMatches (const RegularExpression& regex) const
5195{
5196 if (m_mangled && regex.Execute (m_mangled.AsCString()))
5197 return true;
5198
5199 if (GetDemangledName() && regex.Execute (m_demangled.AsCString()))
5200 return true;
5201 return false;
5202}
5203
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005204//----------------------------------------------------------------------
5205// Get the demangled name if there is one, else return the mangled name.
5206//----------------------------------------------------------------------
5207const ConstString&
Jim Ingham08b87e02010-09-14 22:03:00 +00005208Mangled::GetName (Mangled::NamePreference preference) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005209{
Greg Clayton87425432010-09-14 23:44:49 +00005210 if (preference == ePreferDemangled)
Jim Ingham08b87e02010-09-14 22:03:00 +00005211 {
Greg Claytond0b89f82010-09-14 23:48:44 +00005212 // Call the accessor to make sure we get a demangled name in case
5213 // it hasn't been demangled yet...
5214 if (GetDemangledName())
5215 return m_demangled;
Greg Clayton87425432010-09-14 23:44:49 +00005216 return m_mangled;
5217 }
5218 else
5219 {
Greg Claytond0b89f82010-09-14 23:48:44 +00005220 if (m_mangled)
5221 return m_mangled;
5222 return GetDemangledName();
Jim Ingham08b87e02010-09-14 22:03:00 +00005223 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005224}
5225
5226//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005227// Dump a Mangled object to stream "s". We don't force our
5228// demangled name to be computed currently (we don't use the accessor).
5229//----------------------------------------------------------------------
5230void
5231Mangled::Dump (Stream *s) const
5232{
5233 if (m_mangled)
5234 {
5235 *s << ", mangled = " << m_mangled;
5236 }
5237 if (m_demangled)
5238 {
5239 const char * demangled = m_demangled.AsCString();
5240 s->Printf(", demangled = %s", demangled[0] ? demangled : "<error>");
5241 }
5242}
5243
5244//----------------------------------------------------------------------
5245// Dumps a debug version of this string with extra object and state
5246// information to stream "s".
5247//----------------------------------------------------------------------
5248void
5249Mangled::DumpDebug (Stream *s) const
5250{
Saleem Abdulrasool324a1032014-04-04 04:06:10 +00005251 s->Printf("%*p: Mangled mangled = ", static_cast<int>(sizeof(void*) * 2),
5252 static_cast<const void*>(this));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00005253 m_mangled.DumpDebug(s);
5254 s->Printf(", demangled = ");
5255 m_demangled.DumpDebug(s);
5256}
5257
5258//----------------------------------------------------------------------
5259// Return the size in byte that this object takes in memory. The size
5260// includes the size of the objects it owns, and not the strings that
5261// it references because they are shared strings.
5262//----------------------------------------------------------------------
5263size_t
5264Mangled::MemorySize () const
5265{
5266 return m_mangled.MemorySize() + m_demangled.MemorySize();
5267}
5268
5269//----------------------------------------------------------------------
5270// Dump OBJ to the supplied stream S.
5271//----------------------------------------------------------------------
5272Stream&
5273operator << (Stream& s, const Mangled& obj)
5274{
5275 if (obj.GetMangledName())
5276 s << "mangled = '" << obj.GetMangledName() << "'";
5277
5278 const ConstString& demangled = obj.GetDemangledName();
5279 if (demangled)
5280 s << ", demangled = '" << demangled << '\'';
5281 else
5282 s << ", demangled = <error>";
5283 return s;
5284}