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