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