1 //===-------------------------- cxa_demangle.cpp --------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // FIXME: (possibly) incomplete list of features that clang mangles that this 11 // file does not yet support: 12 // - enable_if attribute 13 // - decomposition declarations 14 // - C++ modules TS 15 16 #define _LIBCPP_NO_EXCEPTIONS 17 18 #include "__cxxabi_config.h" 19 20 #include <vector> 21 #include <algorithm> 22 #include <numeric> 23 #include <cstdio> 24 #include <cstdlib> 25 #include <cstring> 26 #include <cctype> 27 28 #ifdef _MSC_VER 29 // snprintf is implemented in VS 2015 30 #if _MSC_VER < 1900 31 #define snprintf _snprintf_s 32 #endif 33 #endif 34 35 namespace __cxxabiv1 36 { 37 38 namespace 39 { 40 41 enum 42 { 43 unknown_error = -4, 44 invalid_args = -3, 45 invalid_mangled_name, 46 memory_alloc_failure, 47 success 48 }; 49 50 class StringView { 51 const char *First; 52 const char *Last; 53 54 public: 55 template <size_t N> 56 StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} 57 StringView(const char *First_, const char *Last_) : First(First_), Last(Last_) {} 58 StringView() : First(nullptr), Last(nullptr) {} 59 60 StringView substr(size_t From, size_t To) { 61 if (To >= size()) 62 To = size() - 1; 63 if (From >= size()) 64 From = size() - 1; 65 return StringView(First + From, First + To); 66 } 67 68 StringView dropFront(size_t N) const { 69 if (N >= size()) 70 N = size() - 1; 71 return StringView(First + N, Last); 72 } 73 74 bool startsWith(StringView Str) const { 75 if (Str.size() > size()) 76 return false; 77 return std::equal(Str.begin(), Str.end(), begin()); 78 } 79 80 const char &operator[](size_t Idx) const { return *(begin() + Idx); } 81 82 const char *begin() const { return First; } 83 const char *end() const { return Last; } 84 size_t size() const { return static_cast<size_t>(Last - First); } 85 }; 86 87 bool operator==(const StringView &LHS, const StringView &RHS) { 88 return LHS.size() == RHS.size() && 89 std::equal(LHS.begin(), LHS.end(), RHS.begin()); 90 } 91 92 // Stream that AST nodes write their string representation into after the AST 93 // has been parsed. 94 class OutputStream { 95 char *Buffer; 96 size_t CurrentPosition; 97 size_t BufferCapacity; 98 99 // Ensure there is at least n more positions in buffer. 100 void grow(size_t N) { 101 if (N + CurrentPosition >= BufferCapacity) { 102 BufferCapacity *= 2; 103 if (BufferCapacity < N + CurrentPosition) 104 BufferCapacity = N + CurrentPosition; 105 Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity)); 106 } 107 } 108 109 public: 110 OutputStream(char *StartBuf, size_t Size) 111 : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {} 112 113 OutputStream &operator+=(StringView R) { 114 size_t Size = R.size(); 115 if (Size == 0) 116 return *this; 117 grow(Size); 118 memmove(Buffer + CurrentPosition, R.begin(), Size); 119 CurrentPosition += Size; 120 return *this; 121 } 122 123 OutputStream &operator+=(char C) { 124 grow(1); 125 Buffer[CurrentPosition++] = C; 126 return *this; 127 } 128 129 // Offset of position in buffer, used for building stream_string_view. 130 typedef unsigned StreamPosition; 131 132 // StringView into a stream, used for caching the ast nodes. 133 class StreamStringView { 134 StreamPosition First, Last; 135 136 friend class OutputStream; 137 138 public: 139 StreamStringView() : First(0), Last(0) {} 140 141 StreamStringView(StreamPosition First_, StreamPosition Last_) 142 : First(First_), Last(Last_) {} 143 144 bool empty() const { return First == Last; } 145 }; 146 147 OutputStream &operator+=(StreamStringView &s) { 148 size_t Sz = static_cast<size_t>(s.Last - s.First); 149 if (Sz == 0) 150 return *this; 151 grow(Sz); 152 memmove(Buffer + CurrentPosition, Buffer + s.First, Sz); 153 CurrentPosition += Sz; 154 return *this; 155 } 156 157 StreamPosition getCurrentPosition() const { 158 return static_cast<StreamPosition>(CurrentPosition); 159 } 160 161 StreamStringView makeStringViewFromPastPosition(StreamPosition Pos) { 162 return StreamStringView(Pos, getCurrentPosition()); 163 } 164 165 char back() const { 166 return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0'; 167 } 168 169 bool empty() const { return CurrentPosition == 0; } 170 171 char *getBuffer() { return Buffer; } 172 char *getBufferEnd() { return Buffer + CurrentPosition - 1; } 173 size_t getBufferCapacity() { return BufferCapacity; } 174 }; 175 176 // Base class of all AST nodes. The AST is built by the parser, then is 177 // traversed by the printLeft/Right functions to produce a demangled string. 178 class Node { 179 public: 180 enum Kind : unsigned char { 181 KDotSuffix, 182 KVendorExtQualType, 183 KQualType, 184 KConversionOperatorType, 185 KPostfixQualifiedType, 186 KNameType, 187 KAbiTagAttr, 188 KObjCProtoName, 189 KPointerType, 190 KLValueReferenceType, 191 KRValueReferenceType, 192 KPointerToMemberType, 193 KArrayType, 194 KFunctionType, 195 KTopLevelFunctionDecl, 196 KFunctionQualType, 197 KFunctionRefQualType, 198 KLiteralOperator, 199 KSpecialName, 200 KCtorVtableSpecialName, 201 KQualifiedName, 202 KEmptyName, 203 KVectorType, 204 KTemplateParams, 205 KNameWithTemplateArgs, 206 KGlobalQualifiedName, 207 KStdQualifiedName, 208 KExpandedSpecialSubstitution, 209 KSpecialSubstitution, 210 KCtorDtorName, 211 KDtorName, 212 KUnnamedTypeName, 213 KLambdaTypeName, 214 KExpr, 215 }; 216 217 const Kind K; 218 219 private: 220 // If this Node has any RHS part, potentally many Nodes further down. 221 const unsigned HasRHSComponent : 1; 222 const unsigned HasFunction : 1; 223 const unsigned HasArray : 1; 224 225 public: 226 Node(Kind K_, bool HasRHS_ = false, bool HasFunction_ = false, 227 bool HasArray_ = false) 228 : K(K_), HasRHSComponent(HasRHS_), HasFunction(HasFunction_), 229 HasArray(HasArray_) {} 230 231 bool hasRHSComponent() const { return HasRHSComponent; } 232 bool hasArray() const { return HasArray; } 233 bool hasFunction() const { return HasFunction; } 234 235 void print(OutputStream &s) const { 236 printLeft(s); 237 if (hasRHSComponent()) 238 printRight(s); 239 } 240 241 // Print the "left" side of this Node into OutputStream. 242 virtual void printLeft(OutputStream &) const = 0; 243 244 // Print the "right". This distinction is necessary to represent C++ types 245 // that appear on the RHS of their subtype, such as arrays or functions. 246 // Since most types don't have such a component, provide a default 247 // implemenation. 248 virtual void printRight(OutputStream &) const {} 249 250 virtual StringView getBaseName() const { return StringView(); } 251 252 // Silence compiler warnings, this dtor will never be called. 253 virtual ~Node() = default; 254 }; 255 256 class NodeArray { 257 Node **Elements; 258 size_t NumElements; 259 260 public: 261 NodeArray() : NumElements(0) {} 262 NodeArray(Node **Elements_, size_t NumElements_) 263 : Elements(Elements_), NumElements(NumElements_) {} 264 265 bool empty() const { return NumElements == 0; } 266 size_t size() const { return NumElements; } 267 268 void printWithSeperator(OutputStream &S, StringView Seperator) const { 269 for (size_t Idx = 0; Idx != NumElements; ++Idx) { 270 if (Idx) 271 S += Seperator; 272 Elements[Idx]->print(S); 273 } 274 } 275 }; 276 277 class DotSuffix final : public Node { 278 const Node *Prefix; 279 const StringView Suffix; 280 281 public: 282 DotSuffix(Node *Prefix_, StringView Suffix_) 283 : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {} 284 285 void printLeft(OutputStream &s) const override { 286 Prefix->print(s); 287 s += " ("; 288 s += Suffix; 289 s += ")"; 290 } 291 }; 292 293 class VendorExtQualType final : public Node { 294 const Node *Ext; 295 const Node *Ty; 296 297 public: 298 VendorExtQualType(Node *Ext_, Node *Ty_) 299 : Node(KVendorExtQualType), Ext(Ext_), Ty(Ty_) {} 300 301 void printLeft(OutputStream &S) const override { 302 Ext->print(S); 303 S += " "; 304 Ty->printLeft(S); 305 } 306 307 void printRight(OutputStream &S) const override { Ty->printRight(S); } 308 }; 309 310 enum Qualifiers { 311 QualNone = 0, 312 QualConst = 0x1, 313 QualVolatile = 0x2, 314 QualRestrict = 0x4, 315 }; 316 317 void addQualifiers(Qualifiers &Q1, Qualifiers Q2) { 318 Q1 = static_cast<Qualifiers>(Q1 | Q2); 319 } 320 321 class QualType : public Node { 322 protected: 323 const Qualifiers Quals; 324 const Node *Child; 325 326 void printQuals(OutputStream &S) const { 327 if (Quals & QualConst) 328 S += " const"; 329 if (Quals & QualVolatile) 330 S += " volatile"; 331 if (Quals & QualRestrict) 332 S += " restrict"; 333 } 334 335 public: 336 QualType(Node *Child_, Qualifiers Quals_) 337 : Node(KQualType, Child_->hasRHSComponent(), Child_->hasFunction(), 338 Child_->hasArray()), 339 Quals(Quals_), Child(Child_) {} 340 341 QualType(Node::Kind ChildKind_, Node *Child_, Qualifiers Quals_) 342 : Node(ChildKind_, Child_->hasRHSComponent(), Child_->hasFunction(), 343 Child_->hasArray()), 344 Quals(Quals_), Child(Child_) {} 345 346 void printLeft(OutputStream &S) const override { 347 Child->printLeft(S); 348 printQuals(S); 349 } 350 351 void printRight(OutputStream &S) const override { Child->printRight(S); } 352 }; 353 354 class ConversionOperatorType final : public Node { 355 const Node *Ty; 356 357 public: 358 ConversionOperatorType(Node *Ty_) : Node(KConversionOperatorType), Ty(Ty_) {} 359 360 void printLeft(OutputStream &S) const override { 361 S += "operator "; 362 Ty->print(S); 363 } 364 }; 365 366 class PostfixQualifiedType final : public Node { 367 const Node *Ty; 368 const StringView Postfix; 369 370 public: 371 PostfixQualifiedType(Node *Ty_, StringView Postfix_) 372 : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {} 373 374 void printLeft(OutputStream &s) const override { 375 Ty->printLeft(s); 376 s += Postfix; 377 } 378 379 void printRight(OutputStream &S) const override { Ty->printRight(S); } 380 }; 381 382 class NameType final : public Node { 383 const StringView Name; 384 385 public: 386 NameType(StringView Name_) : Node(KNameType), Name(Name_) {} 387 388 StringView getName() const { return Name; } 389 StringView getBaseName() const override { return Name; } 390 391 void printLeft(OutputStream &s) const override { s += Name; } 392 }; 393 394 class AbiTagAttr final : public Node { 395 const Node* Base; 396 StringView Tag; 397 public: 398 AbiTagAttr(const Node* Base_, StringView Tag_) 399 : Node(KAbiTagAttr), Base(Base_), Tag(Tag_) {} 400 401 void printLeft(OutputStream &S) const override { 402 Base->printLeft(S); 403 S += "[abi:"; 404 S += Tag; 405 S += "]"; 406 } 407 }; 408 409 class ObjCProtoName : public Node { 410 Node *Ty; 411 Node *Protocol; 412 413 friend class PointerType; 414 415 public: 416 ObjCProtoName(Node *Ty_, Node *Protocol_) 417 : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {} 418 419 bool isObjCObject() const { 420 return Ty->K == KNameType && 421 static_cast<NameType *>(Ty)->getName() == "objc_object"; 422 } 423 424 void printLeft(OutputStream &S) const override { 425 Ty->printLeft(S); 426 S += "<"; 427 Protocol->printLeft(S); 428 S += ">"; 429 } 430 }; 431 432 class PointerType final : public Node { 433 const Node *Pointee; 434 435 public: 436 PointerType(Node *Pointee_) 437 : Node(KPointerType, Pointee_->hasRHSComponent()), Pointee(Pointee_) {} 438 439 void printLeft(OutputStream &s) const override { 440 // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>. 441 if (Pointee->K != KObjCProtoName || 442 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { 443 Pointee->printLeft(s); 444 if (Pointee->hasArray()) 445 s += " "; 446 if (Pointee->hasArray() || Pointee->hasFunction()) 447 s += "("; 448 s += "*"; 449 } else { 450 const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee); 451 s += "id<"; 452 objcProto->Protocol->print(s); 453 s += ">"; 454 } 455 } 456 457 void printRight(OutputStream &s) const override { 458 if (Pointee->K != KObjCProtoName || 459 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { 460 if (Pointee->hasArray() || Pointee->hasFunction()) 461 s += ")"; 462 Pointee->printRight(s); 463 } 464 } 465 }; 466 467 class LValueReferenceType final : public Node { 468 const Node *Pointee; 469 470 public: 471 LValueReferenceType(Node *Pointee_) 472 : Node(KLValueReferenceType, Pointee_->hasRHSComponent()), 473 Pointee(Pointee_) {} 474 475 void printLeft(OutputStream &s) const override { 476 Pointee->printLeft(s); 477 if (Pointee->hasArray()) 478 s += " "; 479 if (Pointee->hasArray() || Pointee->hasFunction()) 480 s += "(&"; 481 else 482 s += "&"; 483 } 484 void printRight(OutputStream &s) const override { 485 if (Pointee->hasArray() || Pointee->hasFunction()) 486 s += ")"; 487 Pointee->printRight(s); 488 } 489 }; 490 491 class RValueReferenceType final : public Node { 492 const Node *Pointee; 493 494 public: 495 RValueReferenceType(Node *Pointee_) 496 : Node(KRValueReferenceType, Pointee_->hasRHSComponent()), 497 Pointee(Pointee_) {} 498 499 void printLeft(OutputStream &s) const override { 500 Pointee->printLeft(s); 501 if (Pointee->hasArray()) 502 s += " "; 503 if (Pointee->hasArray() || Pointee->hasFunction()) 504 s += "(&&"; 505 else 506 s += "&&"; 507 } 508 509 void printRight(OutputStream &s) const override { 510 if (Pointee->hasArray() || Pointee->hasFunction()) 511 s += ")"; 512 Pointee->printRight(s); 513 } 514 }; 515 516 class PointerToMemberType final : public Node { 517 const Node *ClassType; 518 const Node *MemberType; 519 520 public: 521 PointerToMemberType(Node *ClassType_, Node *MemberType_) 522 : Node(KPointerToMemberType, MemberType_->hasRHSComponent()), 523 ClassType(ClassType_), MemberType(MemberType_) {} 524 525 void printLeft(OutputStream &s) const override { 526 MemberType->printLeft(s); 527 if (MemberType->hasArray() || MemberType->hasFunction()) 528 s += "("; 529 else 530 s += " "; 531 ClassType->print(s); 532 s += "::*"; 533 } 534 535 void printRight(OutputStream &s) const override { 536 if (MemberType->hasArray() || MemberType->hasFunction()) 537 s += ")"; 538 MemberType->printRight(s); 539 } 540 }; 541 542 class NodeOrString { 543 const void *First; 544 const void *Second; 545 546 public: 547 /* implicit */ NodeOrString(StringView Str) { 548 const char *FirstChar = Str.begin(); 549 const char *SecondChar = Str.end(); 550 if (SecondChar == nullptr) { 551 assert(FirstChar == SecondChar); 552 ++FirstChar, ++SecondChar; 553 } 554 First = static_cast<const void *>(FirstChar); 555 Second = static_cast<const void *>(SecondChar); 556 } 557 558 /* implicit */ NodeOrString(Node *N) 559 : First(static_cast<const void *>(N)), Second(nullptr) {} 560 NodeOrString() : First(nullptr), Second(nullptr) {} 561 562 bool isString() const { return Second && First; } 563 bool isNode() const { return First && !Second; } 564 bool isEmpty() const { return !First && !Second; } 565 566 StringView asString() const { 567 assert(isString()); 568 return StringView(static_cast<const char *>(First), 569 static_cast<const char *>(Second)); 570 } 571 572 const Node *asNode() const { 573 assert(isNode()); 574 return static_cast<const Node *>(First); 575 } 576 }; 577 578 class ArrayType final : public Node { 579 Node *Base; 580 NodeOrString Dimension; 581 582 public: 583 ArrayType(Node *Base_, NodeOrString Dimension_) 584 : Node(KArrayType, true, false, true), Base(Base_), Dimension(Dimension_) {} 585 586 // Incomplete array type. 587 ArrayType(Node *Base_) : Node(KArrayType, true, false, true), Base(Base_) {} 588 589 void printLeft(OutputStream &S) const override { Base->printLeft(S); } 590 591 void printRight(OutputStream &S) const override { 592 if (S.back() != ']') 593 S += " "; 594 S += "["; 595 if (Dimension.isString()) 596 S += Dimension.asString(); 597 else if (Dimension.isNode()) 598 Dimension.asNode()->print(S); 599 S += "]"; 600 Base->printRight(S); 601 } 602 }; 603 604 class FunctionType final : public Node { 605 Node *Ret; 606 NodeArray Params; 607 608 public: 609 FunctionType(Node *Ret_, NodeArray Params_) 610 : Node(KFunctionType, true, true), Ret(Ret_), Params(Params_) {} 611 612 // Handle C++'s ... quirky decl grammer by using the left & right 613 // distinction. Consider: 614 // int (*f(float))(char) {} 615 // f is a function that takes a float and returns a pointer to a function 616 // that takes a char and returns an int. If we're trying to print f, start 617 // by printing out the return types's left, then print our parameters, then 618 // finally print right of the return type. 619 void printLeft(OutputStream &S) const override { 620 Ret->printLeft(S); 621 S += " "; 622 } 623 624 void printRight(OutputStream &S) const override { 625 S += "("; 626 Params.printWithSeperator(S, ", "); 627 S += ")"; 628 Ret->printRight(S); 629 } 630 }; 631 632 class TopLevelFunctionDecl final : public Node { 633 const Node *Ret; 634 const Node *Name; 635 NodeArray Params; 636 637 public: 638 TopLevelFunctionDecl(Node *Ret_, Node *Name_, NodeArray Params_) 639 : Node(KTopLevelFunctionDecl, true, true), Ret(Ret_), Name(Name_), 640 Params(Params_) {} 641 642 void printLeft(OutputStream &S) const override { 643 if (Ret) { 644 Ret->printLeft(S); 645 if (!Ret->hasRHSComponent()) 646 S += " "; 647 } 648 Name->print(S); 649 } 650 651 void printRight(OutputStream &S) const override { 652 S += "("; 653 Params.printWithSeperator(S, ", "); 654 S += ")"; 655 if (Ret) 656 Ret->printRight(S); 657 } 658 }; 659 660 enum FunctionRefQual : unsigned char { 661 FrefQualNone, 662 FrefQualLValue, 663 FrefQualRValue, 664 }; 665 666 class FunctionRefQualType : public Node { 667 Node *Fn; 668 FunctionRefQual Quals; 669 670 friend class FunctionQualType; 671 672 public: 673 FunctionRefQualType(Node *Fn_, FunctionRefQual Quals_) 674 : Node(KFunctionRefQualType, true, true), Fn(Fn_), Quals(Quals_) {} 675 676 void printQuals(OutputStream &S) const { 677 if (Quals == FrefQualLValue) 678 S += " &"; 679 else 680 S += " &&"; 681 } 682 683 void printLeft(OutputStream &S) const override { Fn->printLeft(S); } 684 685 void printRight(OutputStream &S) const override { 686 Fn->printRight(S); 687 printQuals(S); 688 } 689 }; 690 691 class FunctionQualType final : public QualType { 692 public: 693 FunctionQualType(Node *Child_, Qualifiers Quals_) 694 : QualType(KFunctionQualType, Child_, Quals_) {} 695 696 void printLeft(OutputStream &S) const override { Child->printLeft(S); } 697 698 void printRight(OutputStream &S) const override { 699 if (Child->K == KFunctionRefQualType) { 700 auto *RefQuals = static_cast<const FunctionRefQualType *>(Child); 701 RefQuals->Fn->printRight(S); 702 printQuals(S); 703 RefQuals->printQuals(S); 704 } else { 705 Child->printRight(S); 706 printQuals(S); 707 } 708 } 709 }; 710 711 class LiteralOperator : public Node { 712 const Node *OpName; 713 714 public: 715 LiteralOperator(Node *OpName_) : Node(KLiteralOperator), OpName(OpName_) {} 716 717 void printLeft(OutputStream &S) const override { 718 S += "operator\"\" "; 719 OpName->print(S); 720 } 721 }; 722 723 class SpecialName final : public Node { 724 const StringView Special; 725 const Node *Child; 726 727 public: 728 SpecialName(StringView Special_, Node *Child_) 729 : Node(KSpecialName), Special(Special_), Child(Child_) {} 730 731 void printLeft(OutputStream &S) const override { 732 S += Special; 733 Child->print(S); 734 } 735 }; 736 737 class CtorVtableSpecialName final : public Node { 738 const Node *FirstType; 739 const Node *SecondType; 740 741 public: 742 CtorVtableSpecialName(Node *FirstType_, Node *SecondType_) 743 : Node(KCtorVtableSpecialName), FirstType(FirstType_), 744 SecondType(SecondType_) {} 745 746 void printLeft(OutputStream &S) const override { 747 S += "construction vtable for "; 748 FirstType->print(S); 749 S += "-in-"; 750 SecondType->print(S); 751 } 752 }; 753 754 class QualifiedName final : public Node { 755 // qualifier::name 756 const Node *Qualifier; 757 const Node *Name; 758 759 mutable OutputStream::StreamStringView Cache; 760 761 public: 762 QualifiedName(Node *Qualifier_, Node *Name_) 763 : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {} 764 765 StringView getBaseName() const override { return Name->getBaseName(); } 766 767 void printLeft(OutputStream &S) const override { 768 if (!Cache.empty()) { 769 S += Cache; 770 return; 771 } 772 773 OutputStream::StreamPosition Start = S.getCurrentPosition(); 774 if (Qualifier->K != KEmptyName) { 775 Qualifier->print(S); 776 S += "::"; 777 } 778 Name->print(S); 779 Cache = S.makeStringViewFromPastPosition(Start); 780 } 781 }; 782 783 class EmptyName : public Node { 784 public: 785 EmptyName() : Node(KEmptyName) {} 786 void printLeft(OutputStream &) const override {} 787 }; 788 789 class VectorType final : public Node { 790 const Node *BaseType; 791 const NodeOrString Dimension; 792 const bool IsPixel; 793 794 public: 795 VectorType(NodeOrString Dimension_) 796 : Node(KVectorType), BaseType(nullptr), Dimension(Dimension_), 797 IsPixel(true) {} 798 VectorType(Node *BaseType_, NodeOrString Dimension_) 799 : Node(KVectorType), BaseType(BaseType_), Dimension(Dimension_), 800 IsPixel(false) {} 801 802 void printLeft(OutputStream &S) const override { 803 if (IsPixel) { 804 S += "pixel vector["; 805 S += Dimension.asString(); 806 S += "]"; 807 } else { 808 BaseType->print(S); 809 S += " vector["; 810 if (Dimension.isNode()) 811 Dimension.asNode()->print(S); 812 else if (Dimension.isString()) 813 S += Dimension.asString(); 814 S += "]"; 815 } 816 } 817 }; 818 819 class TemplateParams final : public Node { 820 NodeArray Params; 821 822 mutable OutputStream::StreamStringView Cache; 823 824 public: 825 TemplateParams(NodeArray Params_) : Node(KTemplateParams), Params(Params_) {} 826 827 void printLeft(OutputStream &S) const override { 828 if (!Cache.empty()) { 829 S += Cache; 830 return; 831 } 832 833 OutputStream::StreamPosition Start = S.getCurrentPosition(); 834 835 S += "<"; 836 Params.printWithSeperator(S, ", "); 837 if (S.back() == '>') 838 S += " "; 839 S += ">"; 840 841 Cache = S.makeStringViewFromPastPosition(Start); 842 } 843 }; 844 845 class NameWithTemplateArgs final : public Node { 846 // name<template_args> 847 Node *Name; 848 Node *TemplateArgs; 849 850 public: 851 NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_) 852 : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {} 853 854 StringView getBaseName() const override { return Name->getBaseName(); } 855 856 void printLeft(OutputStream &S) const override { 857 Name->print(S); 858 TemplateArgs->print(S); 859 } 860 }; 861 862 class GlobalQualifiedName final : public Node { 863 Node *Child; 864 865 public: 866 GlobalQualifiedName(Node *Child_) : Node(KGlobalQualifiedName), Child(Child_) {} 867 868 StringView getBaseName() const override { return Child->getBaseName(); } 869 870 void printLeft(OutputStream &S) const override { 871 S += "::"; 872 Child->print(S); 873 } 874 }; 875 876 class StdQualifiedName final : public Node { 877 Node *Child; 878 879 public: 880 StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {} 881 882 StringView getBaseName() const override { return Child->getBaseName(); } 883 884 void printLeft(OutputStream &S) const override { 885 S += "std::"; 886 Child->print(S); 887 } 888 }; 889 890 enum class SpecialSubKind { 891 allocator, 892 basic_string, 893 string, 894 istream, 895 ostream, 896 iostream, 897 }; 898 899 class ExpandedSpecialSubstitution final : public Node { 900 SpecialSubKind SSK; 901 902 public: 903 ExpandedSpecialSubstitution(SpecialSubKind SSK_) 904 : Node(KExpandedSpecialSubstitution), SSK(SSK_) {} 905 906 StringView getBaseName() const override { 907 switch (SSK) { 908 case SpecialSubKind::allocator: 909 return StringView("allocator"); 910 case SpecialSubKind::basic_string: 911 return StringView("basic_string"); 912 case SpecialSubKind::string: 913 return StringView("basic_string"); 914 case SpecialSubKind::istream: 915 return StringView("basic_istream"); 916 case SpecialSubKind::ostream: 917 return StringView("basic_ostream"); 918 case SpecialSubKind::iostream: 919 return StringView("basic_iostream"); 920 } 921 _LIBCPP_UNREACHABLE(); 922 } 923 924 void printLeft(OutputStream &S) const override { 925 switch (SSK) { 926 case SpecialSubKind::allocator: 927 S += "std::basic_string<char, std::char_traits<char>, " 928 "std::allocator<char> >"; 929 break; 930 case SpecialSubKind::basic_string: 931 case SpecialSubKind::string: 932 S += "std::basic_string<char, std::char_traits<char>, " 933 "std::allocator<char> >"; 934 break; 935 case SpecialSubKind::istream: 936 S += "std::basic_istream<char, std::char_traits<char> >"; 937 break; 938 case SpecialSubKind::ostream: 939 S += "std::basic_ostream<char, std::char_traits<char> >"; 940 break; 941 case SpecialSubKind::iostream: 942 S += "std::basic_iostream<char, std::char_traits<char> >"; 943 break; 944 } 945 } 946 }; 947 948 class SpecialSubstitution final : public Node { 949 public: 950 SpecialSubKind SSK; 951 952 SpecialSubstitution(SpecialSubKind SSK_) 953 : Node(KSpecialSubstitution), SSK(SSK_) {} 954 955 StringView getBaseName() const override { 956 switch (SSK) { 957 case SpecialSubKind::allocator: 958 return StringView("allocator"); 959 case SpecialSubKind::basic_string: 960 return StringView("basic_string"); 961 case SpecialSubKind::string: 962 return StringView("string"); 963 case SpecialSubKind::istream: 964 return StringView("istream"); 965 case SpecialSubKind::ostream: 966 return StringView("ostream"); 967 case SpecialSubKind::iostream: 968 return StringView("iostream"); 969 } 970 _LIBCPP_UNREACHABLE(); 971 } 972 973 void printLeft(OutputStream &S) const override { 974 switch (SSK) { 975 case SpecialSubKind::allocator: 976 S += "std::allocator"; 977 break; 978 case SpecialSubKind::basic_string: 979 S += "std::basic_string"; 980 break; 981 case SpecialSubKind::string: 982 S += "std::string"; 983 break; 984 case SpecialSubKind::istream: 985 S += "std::istream"; 986 break; 987 case SpecialSubKind::ostream: 988 S += "std::ostream"; 989 break; 990 case SpecialSubKind::iostream: 991 S += "std::iostream"; 992 break; 993 } 994 } 995 }; 996 997 class CtorDtorName final : public Node { 998 const Node *Basename; 999 const bool IsDtor; 1000 1001 public: 1002 CtorDtorName(Node *Basename_, bool IsDtor_) 1003 : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_) {} 1004 1005 void printLeft(OutputStream &S) const override { 1006 if (IsDtor) 1007 S += "~"; 1008 S += Basename->getBaseName(); 1009 } 1010 }; 1011 1012 class DtorName : public Node { 1013 const Node *Base; 1014 1015 public: 1016 DtorName(Node *Base_) : Node(KDtorName), Base(Base_) {} 1017 1018 void printLeft(OutputStream &S) const override { 1019 S += "~"; 1020 Base->printLeft(S); 1021 } 1022 }; 1023 1024 class UnnamedTypeName : public Node { 1025 const StringView Count; 1026 1027 public: 1028 UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {} 1029 1030 void printLeft(OutputStream &S) const override { 1031 S += "'unnamed"; 1032 S += Count; 1033 S += "\'"; 1034 } 1035 }; 1036 1037 class LambdaTypeName : public Node { 1038 NodeArray Params; 1039 StringView Count; 1040 1041 public: 1042 LambdaTypeName(NodeArray Params_, StringView Count_) 1043 : Node(KLambdaTypeName), Params(Params_), Count(Count_) {} 1044 1045 void printLeft(OutputStream &S) const override { 1046 S += "\'lambda"; 1047 S += Count; 1048 S += "\'("; 1049 Params.printWithSeperator(S, ", "); 1050 S += ")"; 1051 } 1052 }; 1053 1054 // -- Expression Nodes -- 1055 1056 struct Expr : public Node { 1057 Expr() : Node(KExpr) {} 1058 }; 1059 1060 class BinaryExpr : public Expr { 1061 const Node *LHS; 1062 const StringView InfixOperator; 1063 const Node *RHS; 1064 1065 public: 1066 BinaryExpr(Node *LHS_, StringView InfixOperator_, Node *RHS_) 1067 : LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) {} 1068 1069 void printLeft(OutputStream &S) const override { 1070 // might be a template argument expression, then we need to disambiguate 1071 // with parens. 1072 if (InfixOperator == ">") 1073 S += "("; 1074 1075 S += "("; 1076 LHS->print(S); 1077 S += ") "; 1078 S += InfixOperator; 1079 S += " ("; 1080 RHS->print(S); 1081 S += ")"; 1082 1083 if (InfixOperator == ">") 1084 S += ")"; 1085 } 1086 }; 1087 1088 class ArraySubscriptExpr : public Expr { 1089 const Node *Op1; 1090 const Node *Op2; 1091 1092 public: 1093 ArraySubscriptExpr(Node *Op1_, Node *Op2_) : Op1(Op1_), Op2(Op2_) {} 1094 1095 void printLeft(OutputStream &S) const override { 1096 S += "("; 1097 Op1->print(S); 1098 S += ")["; 1099 Op2->print(S); 1100 S += "]"; 1101 } 1102 }; 1103 1104 class PostfixExpr : public Expr { 1105 const Node *Child; 1106 const StringView Operand; 1107 1108 public: 1109 PostfixExpr(Node *Child_, StringView Operand_) 1110 : Child(Child_), Operand(Operand_) {} 1111 1112 void printLeft(OutputStream &S) const override { 1113 S += "("; 1114 Child->print(S); 1115 S += ")"; 1116 S += Operand; 1117 } 1118 }; 1119 1120 class ConditionalExpr : public Expr { 1121 const Node *Cond; 1122 const Node *Then; 1123 const Node *Else; 1124 1125 public: 1126 ConditionalExpr(Node *Cond_, Node *Then_, Node *Else_) 1127 : Cond(Cond_), Then(Then_), Else(Else_) {} 1128 1129 void printLeft(OutputStream &S) const override { 1130 S += "("; 1131 Cond->print(S); 1132 S += ") ? ("; 1133 Then->print(S); 1134 S += ") : ("; 1135 Else->print(S); 1136 S += ")"; 1137 } 1138 }; 1139 1140 class MemberExpr : public Expr { 1141 const Node *LHS; 1142 const StringView Kind; 1143 const Node *RHS; 1144 1145 public: 1146 MemberExpr(Node *LHS_, StringView Kind_, Node *RHS_) 1147 : LHS(LHS_), Kind(Kind_), RHS(RHS_) {} 1148 1149 void printLeft(OutputStream &S) const override { 1150 LHS->print(S); 1151 S += Kind; 1152 RHS->print(S); 1153 } 1154 }; 1155 1156 class EnclosingExpr : public Expr { 1157 const StringView Prefix; 1158 const Node *Infix; 1159 const StringView Postfix; 1160 1161 public: 1162 EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_) 1163 : Prefix(Prefix_), Infix(Infix_), Postfix(Postfix_) {} 1164 1165 void printLeft(OutputStream &S) const override { 1166 S += Prefix; 1167 Infix->print(S); 1168 S += Postfix; 1169 } 1170 }; 1171 1172 class CastExpr : public Expr { 1173 // cast_kind<to>(from) 1174 const StringView CastKind; 1175 const Node *To; 1176 const Node *From; 1177 1178 public: 1179 CastExpr(StringView CastKind_, Node *To_, Node *From_) 1180 : CastKind(CastKind_), To(To_), From(From_) {} 1181 1182 void printLeft(OutputStream &S) const override { 1183 S += CastKind; 1184 S += "<"; 1185 To->printLeft(S); 1186 S += ">("; 1187 From->printLeft(S); 1188 S += ")"; 1189 } 1190 }; 1191 1192 class SizeofParamPackExpr : public Expr { 1193 NodeArray Args; 1194 1195 public: 1196 SizeofParamPackExpr(NodeArray Args_) : Args(Args_) {} 1197 1198 void printLeft(OutputStream &S) const override { 1199 S += "sizeof...("; 1200 Args.printWithSeperator(S, ", "); 1201 S += ")"; 1202 } 1203 }; 1204 1205 class CallExpr : public Expr { 1206 const Node *Callee; 1207 NodeArray Args; 1208 1209 public: 1210 CallExpr(Node *Callee_, NodeArray Args_) : Callee(Callee_), Args(Args_) {} 1211 1212 void printLeft(OutputStream &S) const override { 1213 Callee->print(S); 1214 S += "("; 1215 Args.printWithSeperator(S, ", "); 1216 S += ")"; 1217 } 1218 }; 1219 1220 class NewExpr : public Expr { 1221 // new (expr_list) type(init_list) 1222 NodeArray ExprList; 1223 Node *Type; 1224 NodeArray InitList; 1225 bool IsGlobal; // ::operator new ? 1226 bool IsArray; // new[] ? 1227 public: 1228 NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, 1229 bool IsArray_) 1230 : ExprList(ExprList_), Type(Type_), InitList(InitList_), IsGlobal(IsGlobal_), 1231 IsArray(IsArray_) {} 1232 1233 void printLeft(OutputStream &S) const override { 1234 if (IsGlobal) 1235 S += "::operator "; 1236 S += "new"; 1237 if (IsArray) 1238 S += "[]"; 1239 if (!ExprList.empty()) { 1240 S += "("; 1241 ExprList.printWithSeperator(S, ", "); 1242 S += ")"; 1243 } 1244 Type->print(S); 1245 if (!InitList.empty()) { 1246 S += "("; 1247 InitList.printWithSeperator(S, ", "); 1248 S += ")"; 1249 } 1250 } 1251 }; 1252 1253 class DeleteExpr : public Expr { 1254 Node *Op; 1255 bool IsGlobal; 1256 bool IsArray; 1257 1258 public: 1259 DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_) 1260 : Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {} 1261 1262 void printLeft(OutputStream &S) const override { 1263 if (IsGlobal) 1264 S += "::"; 1265 S += "delete"; 1266 if (IsArray) 1267 S += "[] "; 1268 Op->print(S); 1269 } 1270 }; 1271 1272 class PrefixExpr : public Expr { 1273 StringView Prefix; 1274 Node *Child; 1275 1276 public: 1277 PrefixExpr(StringView Prefix_, Node *Child_) : Prefix(Prefix_), Child(Child_) {} 1278 1279 void printLeft(OutputStream &S) const override { 1280 S += Prefix; 1281 S += "("; 1282 Child->print(S); 1283 S += ")"; 1284 } 1285 }; 1286 1287 class FunctionParam : public Expr { 1288 StringView Number; 1289 1290 public: 1291 FunctionParam(StringView Number_) : Number(Number_) {} 1292 1293 void printLeft(OutputStream &S) const override { 1294 S += "fp"; 1295 S += Number; 1296 } 1297 }; 1298 1299 class ExprList : public Expr { 1300 NodeArray SubExprs; 1301 1302 public: 1303 ExprList(NodeArray SubExprs_) : SubExprs(SubExprs_) {} 1304 1305 void printLeft(OutputStream &S) const override { 1306 S += "("; 1307 SubExprs.printWithSeperator(S, ", "); 1308 S += ")"; 1309 } 1310 }; 1311 1312 class ConversionExpr : public Expr { 1313 NodeArray Expressions; 1314 NodeArray Types; 1315 1316 public: 1317 ConversionExpr(NodeArray Expressions_, NodeArray Types_) 1318 : Expressions(Expressions_), Types(Types_) {} 1319 1320 void printLeft(OutputStream &S) const override { 1321 S += "("; 1322 Expressions.printWithSeperator(S, ", "); 1323 S += ")("; 1324 Types.printWithSeperator(S, ", "); 1325 S += ")"; 1326 } 1327 }; 1328 1329 class ThrowExpr : public Expr { 1330 const Node *Op; 1331 1332 public: 1333 ThrowExpr(Node *Op_) : Op(Op_) {} 1334 1335 void printLeft(OutputStream &S) const override { 1336 S += "throw "; 1337 Op->print(S); 1338 } 1339 }; 1340 1341 class BoolExpr : public Expr { 1342 bool Value; 1343 1344 public: 1345 BoolExpr(bool Value_) : Value(Value_) {} 1346 1347 void printLeft(OutputStream &S) const override { 1348 S += Value ? StringView("true") : StringView("false"); 1349 } 1350 }; 1351 1352 class IntegerCastExpr : public Expr { 1353 // ty(integer) 1354 Node *Ty; 1355 StringView Integer; 1356 1357 public: 1358 IntegerCastExpr(Node *Ty_, StringView Integer_) : Ty(Ty_), Integer(Integer_) {} 1359 1360 void printLeft(OutputStream &S) const override { 1361 S += "("; 1362 Ty->print(S); 1363 S += ")"; 1364 S += Integer; 1365 } 1366 }; 1367 1368 class IntegerExpr : public Expr { 1369 StringView Type; 1370 StringView Value; 1371 1372 public: 1373 IntegerExpr(StringView Type_, StringView Value_) : Type(Type_), Value(Value_) {} 1374 1375 void printLeft(OutputStream &S) const override { 1376 if (Type.size() > 3) { 1377 S += "("; 1378 S += Type; 1379 S += ")"; 1380 } 1381 1382 if (Value[0] == 'n') { 1383 S += "-"; 1384 S += Value.dropFront(1); 1385 } else 1386 S += Value; 1387 1388 if (Type.size() <= 3) 1389 S += Type; 1390 } 1391 }; 1392 1393 template <class Float> struct FloatData; 1394 1395 template <class Float> class FloatExpr : public Expr { 1396 const StringView Contents; 1397 1398 public: 1399 FloatExpr(StringView Contents_) : Contents(Contents_) {} 1400 1401 void printLeft(OutputStream &s) const override { 1402 const char *first = Contents.begin(); 1403 const char *last = Contents.end() + 1; 1404 1405 const size_t N = FloatData<Float>::mangled_size; 1406 if (static_cast<std::size_t>(last - first) > N) { 1407 last = first + N; 1408 union { 1409 Float value; 1410 char buf[sizeof(Float)]; 1411 }; 1412 const char *t = first; 1413 char *e = buf; 1414 for (; t != last; ++t, ++e) { 1415 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') 1416 : static_cast<unsigned>(*t - 'a' + 10); 1417 ++t; 1418 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') 1419 : static_cast<unsigned>(*t - 'a' + 10); 1420 *e = static_cast<char>((d1 << 4) + d0); 1421 } 1422 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 1423 std::reverse(buf, e); 1424 #endif 1425 char num[FloatData<Float>::max_demangled_size] = {0}; 1426 int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value); 1427 s += StringView(num, num + n); 1428 } 1429 } 1430 }; 1431 1432 class BumpPointerAllocator { 1433 struct BlockMeta { 1434 BlockMeta* Next; 1435 size_t Current; 1436 }; 1437 1438 static constexpr size_t AllocSize = 4096; 1439 static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta); 1440 1441 alignas(16) char InitialBuffer[AllocSize]; 1442 BlockMeta* BlockList = nullptr; 1443 1444 void grow() { 1445 char* NewMeta = new char[AllocSize]; 1446 BlockList = new (NewMeta) BlockMeta{BlockList, 0}; 1447 } 1448 1449 void* allocateMassive(size_t NBytes) { 1450 NBytes += sizeof(BlockMeta); 1451 BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(new char[NBytes]); 1452 BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; 1453 return static_cast<void*>(NewMeta + 1); 1454 } 1455 1456 public: 1457 BumpPointerAllocator() 1458 : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {} 1459 1460 void* allocate(size_t N) { 1461 N = (N + 15u) & ~15u; 1462 if (N + BlockList->Current >= UsableAllocSize) { 1463 if (N > UsableAllocSize) 1464 return allocateMassive(N); 1465 grow(); 1466 } 1467 BlockList->Current += N; 1468 return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) + 1469 BlockList->Current - N); 1470 } 1471 1472 ~BumpPointerAllocator() { 1473 while (BlockList) { 1474 BlockMeta* Tmp = BlockList; 1475 BlockList = BlockList->Next; 1476 if (reinterpret_cast<char*>(Tmp) != InitialBuffer) 1477 delete[] reinterpret_cast<char*>(Tmp); 1478 } 1479 } 1480 }; 1481 1482 template <class T, size_t N> 1483 class PODSmallVector { 1484 static_assert(std::is_pod<T>::value, 1485 "T is required to be a plain old data type"); 1486 1487 T* First; 1488 T* Last; 1489 T* Cap; 1490 T Inline[N]; 1491 1492 bool isInline() const { return First == Inline; } 1493 1494 void clearInline() { 1495 First = Inline; 1496 Last = Inline; 1497 Cap = Inline + N; 1498 } 1499 1500 void reserve(size_t NewCap) { 1501 size_t S = size(); 1502 if (isInline()) { 1503 auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T))); 1504 std::copy(First, Last, Tmp); 1505 First = Tmp; 1506 } else 1507 First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T))); 1508 Last = First + S; 1509 Cap = First + NewCap; 1510 } 1511 1512 public: 1513 PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {} 1514 1515 PODSmallVector(const PODSmallVector&) = delete; 1516 PODSmallVector& operator=(const PODSmallVector&) = delete; 1517 1518 PODSmallVector(PODSmallVector&& Other) : PODSmallVector() { 1519 if (Other.isInline()) { 1520 std::copy(Other.begin(), Other.end(), First); 1521 Last = First + Other.size(); 1522 Other.clear(); 1523 return; 1524 } 1525 1526 First = Other.First; 1527 Last = Other.Last; 1528 Cap = Other.Cap; 1529 Other.clearInline(); 1530 } 1531 1532 PODSmallVector& operator=(PODSmallVector&& Other) { 1533 if (Other.isInline()) { 1534 if (!isInline()) { 1535 std::free(First); 1536 clearInline(); 1537 } 1538 std::copy(Other.begin(), Other.end(), First); 1539 Last = First + Other.size(); 1540 Other.clear(); 1541 return *this; 1542 } 1543 1544 if (isInline()) { 1545 First = Other.First; 1546 Last = Other.Last; 1547 Cap = Other.Cap; 1548 Other.clearInline(); 1549 return *this; 1550 } 1551 1552 std::swap(First, Other.First); 1553 std::swap(Last, Other.Last); 1554 std::swap(Cap, Other.Cap); 1555 Other.clear(); 1556 return *this; 1557 } 1558 1559 void push_back(const T& Elem) { 1560 if (Last == Cap) 1561 reserve(size() * 2); 1562 *Last++ = Elem; 1563 } 1564 1565 void pop_back() { 1566 assert(Last != First && "Popping empty vector!"); 1567 --Last; 1568 } 1569 1570 void dropBack(size_t Index) { 1571 assert(Index <= size() && "dropBack() can't expand!"); 1572 Last = First + Index; 1573 } 1574 1575 T* begin() { return First; } 1576 T* end() { return Last; } 1577 1578 bool empty() const { return First == Last; } 1579 size_t size() const { return static_cast<size_t>(Last - First); } 1580 T& back() { 1581 assert(Last != First && "Calling back() on empty vector!"); 1582 return *(Last - 1); 1583 } 1584 T& operator[](size_t Index) { 1585 assert(Index < size() && "Invalid access!"); 1586 return *(begin() + Index); 1587 } 1588 void clear() { Last = First; } 1589 1590 ~PODSmallVector() { 1591 if (!isInline()) 1592 std::free(First); 1593 } 1594 }; 1595 1596 // Substitution table. This type is used to track the substitutions that are 1597 // known by the parser. 1598 template <size_t Size> 1599 class SubstitutionTable { 1600 // Substitutions hold the actual entries in the table, and PackIndices tells 1601 // us which entries are members of which pack. For example, if the 1602 // substitutions we're tracking are: {int, {float, FooBar}, char}, with 1603 // {float, FooBar} being a parameter pack, we represent the substitutions as: 1604 // Substitutions: int, float, FooBar, char 1605 // PackIndices: 0, 1, 3 1606 // So, PackIndicies[I] holds the offset of the begin of the Ith pack, and 1607 // PackIndices[I + 1] holds the offset of the end. 1608 PODSmallVector<Node*, Size> Substitutions; 1609 PODSmallVector<unsigned, Size> PackIndices; 1610 1611 public: 1612 // Add a substitution that represents a single name to the table. This is 1613 // modeled as a parameter pack with just one element. 1614 void pushSubstitution(Node* Entry) { 1615 pushPack(); 1616 pushSubstitutionIntoPack(Entry); 1617 } 1618 1619 // Add a new empty pack to the table. Subsequent calls to 1620 // pushSubstitutionIntoPack() will add to this pack. 1621 void pushPack() { 1622 PackIndices.push_back(static_cast<unsigned>(Substitutions.size())); 1623 } 1624 void pushSubstitutionIntoPack(Node* Entry) { 1625 assert(!PackIndices.empty() && "No pack to push substitution into!"); 1626 Substitutions.push_back(Entry); 1627 } 1628 1629 // Remove the last pack from the table. 1630 void popPack() { 1631 unsigned Last = PackIndices.back(); 1632 PackIndices.pop_back(); 1633 Substitutions.dropBack(Last); 1634 } 1635 1636 // For use in a range-for loop. 1637 struct NodeRange { 1638 Node** First; 1639 Node** Last; 1640 Node** begin() { return First; } 1641 Node** end() { return Last; } 1642 }; 1643 1644 // Retrieve the Nth substitution. This is represented as a range, as the 1645 // substitution could be referring to a parameter pack. 1646 NodeRange nthSubstitution(size_t N) { 1647 assert(PackIndices[N] <= Substitutions.size()); 1648 // The Nth parameter pack starts at offset PackIndices[N], and ends at 1649 // PackIndices[N + 1]. 1650 Node** Begin = Substitutions.begin() + PackIndices[N]; 1651 Node** End; 1652 if (N + 1 != PackIndices.size()) { 1653 assert(PackIndices[N + 1] <= Substitutions.size()); 1654 End = Substitutions.begin() + PackIndices[N + 1]; 1655 } else 1656 End = Substitutions.end(); 1657 assert(Begin <= End); 1658 return NodeRange{Begin, End}; 1659 } 1660 1661 size_t size() const { return PackIndices.size(); } 1662 bool empty() const { return PackIndices.empty(); } 1663 void clear() { 1664 Substitutions.clear(); 1665 PackIndices.clear(); 1666 } 1667 }; 1668 1669 struct Db 1670 { 1671 // Name stack, this is used by the parser to hold temporary names that were 1672 // parsed. The parser colapses multiple names into new nodes to construct 1673 // the AST. Once the parser is finished, names.size() == 1. 1674 PODSmallVector<Node*, 32> Names; 1675 1676 // Substitution table. Itanium supports name substitutions as a means of 1677 // compression. The string "S42_" refers to the 42nd entry in this table. 1678 SubstitutionTable<32> Subs; 1679 1680 // Template parameter table. Like the above, but referenced like "T42_". 1681 // This has a smaller size compared to Subs and Names because it can be 1682 // stored on the stack. 1683 SubstitutionTable<4> TemplateParams; 1684 1685 Qualifiers CV = QualNone; 1686 FunctionRefQual RefQuals = FrefQualNone; 1687 unsigned EncodingDepth = 0; 1688 bool ParsedCtorDtorCV = false; 1689 bool TagTemplates = true; 1690 bool FixForwardReferences = false; 1691 bool TryToParseTemplateArgs = true; 1692 1693 BumpPointerAllocator ASTAllocator; 1694 1695 template <class T, class... Args> T* make(Args&& ...args) 1696 { 1697 return new (ASTAllocator.allocate(sizeof(T))) 1698 T(std::forward<Args>(args)...); 1699 } 1700 1701 template <class It> NodeArray makeNodeArray(It begin, It end) 1702 { 1703 size_t sz = static_cast<size_t>(end - begin); 1704 void* mem = ASTAllocator.allocate(sizeof(Node*) * sz); 1705 Node** data = new (mem) Node*[sz]; 1706 std::copy(begin, end, data); 1707 return NodeArray(data, sz); 1708 } 1709 1710 NodeArray popTrailingNodeArray(size_t FromPosition) 1711 { 1712 assert(FromPosition <= Names.size()); 1713 NodeArray res = makeNodeArray( 1714 Names.begin() + (long)FromPosition, Names.end()); 1715 Names.dropBack(FromPosition); 1716 return res; 1717 } 1718 }; 1719 1720 const char* parse_type(const char* first, const char* last, Db& db); 1721 const char* parse_encoding(const char* first, const char* last, Db& db); 1722 const char* parse_name(const char* first, const char* last, Db& db, 1723 bool* ends_with_template_args = 0); 1724 const char* parse_expression(const char* first, const char* last, Db& db); 1725 const char* parse_template_args(const char* first, const char* last, Db& db); 1726 const char* parse_operator_name(const char* first, const char* last, Db& db); 1727 const char* parse_unqualified_name(const char* first, const char* last, Db& db); 1728 const char* parse_decltype(const char* first, const char* last, Db& db); 1729 1730 // <number> ::= [n] <non-negative decimal integer> 1731 1732 const char* 1733 parse_number(const char* first, const char* last) 1734 { 1735 if (first != last) 1736 { 1737 const char* t = first; 1738 if (*t == 'n') 1739 ++t; 1740 if (t != last) 1741 { 1742 if (*t == '0') 1743 { 1744 first = t+1; 1745 } 1746 else if ('1' <= *t && *t <= '9') 1747 { 1748 first = t+1; 1749 while (first != last && std::isdigit(*first)) 1750 ++first; 1751 } 1752 } 1753 } 1754 return first; 1755 } 1756 1757 template <class Float> 1758 struct FloatData; 1759 1760 template <> 1761 struct FloatData<float> 1762 { 1763 static const size_t mangled_size = 8; 1764 static const size_t max_demangled_size = 24; 1765 static constexpr const char* spec = "%af"; 1766 }; 1767 1768 constexpr const char* FloatData<float>::spec; 1769 1770 template <> 1771 struct FloatData<double> 1772 { 1773 static const size_t mangled_size = 16; 1774 static const size_t max_demangled_size = 32; 1775 static constexpr const char* spec = "%a"; 1776 }; 1777 1778 constexpr const char* FloatData<double>::spec; 1779 1780 template <> 1781 struct FloatData<long double> 1782 { 1783 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ 1784 defined(__wasm__) 1785 static const size_t mangled_size = 32; 1786 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) 1787 static const size_t mangled_size = 16; 1788 #else 1789 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms 1790 #endif 1791 static const size_t max_demangled_size = 40; 1792 static constexpr const char* spec = "%LaL"; 1793 }; 1794 1795 constexpr const char* FloatData<long double>::spec; 1796 1797 template <class Float> 1798 const char* 1799 parse_floating_number(const char* first, const char* last, Db& db) 1800 { 1801 const size_t N = FloatData<Float>::mangled_size; 1802 if (static_cast<std::size_t>(last - first) <= N) 1803 return first; 1804 last = first + N; 1805 const char* t = first; 1806 for (; t != last; ++t) 1807 { 1808 if (!isxdigit(*t)) 1809 return first; 1810 } 1811 if (*t == 'E') 1812 { 1813 db.Names.push_back( 1814 db.make<FloatExpr<Float>>(StringView(first, t))); 1815 first = t + 1; 1816 } 1817 return first; 1818 } 1819 1820 // <positive length number> ::= [0-9]* 1821 const char* 1822 parse_positive_integer(const char* first, const char* last, size_t* out) 1823 { 1824 if (first != last) 1825 { 1826 char c = *first; 1827 if (isdigit(c) && first+1 != last) 1828 { 1829 const char* t = first+1; 1830 size_t n = static_cast<size_t>(c - '0'); 1831 for (c = *t; isdigit(c); c = *t) 1832 { 1833 n = n * 10 + static_cast<size_t>(c - '0'); 1834 if (++t == last) 1835 return first; 1836 } 1837 *out = n; 1838 first = t; 1839 } 1840 } 1841 return first; 1842 } 1843 1844 // extension 1845 // <abi-tag-seq> ::= <abi-tag>* 1846 // <abi-tag> ::= B <positive length number> <identifier> 1847 const char* 1848 parse_abi_tag_seq(const char* first, const char* last, Db& db) 1849 { 1850 while (first != last && *first == 'B' && first+1 != last) 1851 { 1852 size_t length; 1853 const char* t = parse_positive_integer(first+1, last, &length); 1854 if (t == first+1) 1855 return first; 1856 if (static_cast<size_t>(last - t) < length || db.Names.empty()) 1857 return first; 1858 db.Names.back() = db.make<AbiTagAttr>( 1859 db.Names.back(), StringView(t, t + length)); 1860 first = t + length; 1861 } 1862 return first; 1863 } 1864 1865 // <source-name> ::= <positive length number> <identifier> [<abi-tag-seq>] 1866 const char* 1867 parse_source_name(const char* first, const char* last, Db& db) 1868 { 1869 if (first != last) 1870 { 1871 size_t length; 1872 const char* t = parse_positive_integer(first, last, &length); 1873 if (t == first) 1874 return first; 1875 if (static_cast<size_t>(last - t) >= length) 1876 { 1877 StringView r(t, t + length); 1878 if (r.substr(0, 10) == "_GLOBAL__N") 1879 db.Names.push_back(db.make<NameType>("(anonymous namespace)")); 1880 else 1881 db.Names.push_back(db.make<NameType>(r)); 1882 first = t + length; 1883 first = parse_abi_tag_seq(first, last, db); 1884 } 1885 } 1886 return first; 1887 } 1888 1889 // <substitution> ::= S <seq-id> _ 1890 // ::= S_ 1891 // <substitution> ::= Sa # ::std::allocator 1892 // <substitution> ::= Sb # ::std::basic_string 1893 // <substitution> ::= Ss # ::std::basic_string < char, 1894 // ::std::char_traits<char>, 1895 // ::std::allocator<char> > 1896 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > 1897 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > 1898 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > 1899 1900 const char* 1901 parse_substitution(const char* first, const char* last, Db& db) 1902 { 1903 if (last - first >= 2) 1904 { 1905 if (*first == 'S') 1906 { 1907 switch (first[1]) 1908 { 1909 case 'a': 1910 db.Names.push_back( 1911 db.make<SpecialSubstitution>( 1912 SpecialSubKind::allocator)); 1913 first += 2; 1914 break; 1915 case 'b': 1916 db.Names.push_back( 1917 db.make<SpecialSubstitution>(SpecialSubKind::basic_string)); 1918 first += 2; 1919 break; 1920 case 's': 1921 db.Names.push_back( 1922 db.make<SpecialSubstitution>( 1923 SpecialSubKind::string)); 1924 first += 2; 1925 break; 1926 case 'i': 1927 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::istream)); 1928 first += 2; 1929 break; 1930 case 'o': 1931 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::ostream)); 1932 first += 2; 1933 break; 1934 case 'd': 1935 db.Names.push_back(db.make<SpecialSubstitution>(SpecialSubKind::iostream)); 1936 first += 2; 1937 break; 1938 case '_': 1939 if (!db.Subs.empty()) 1940 { 1941 for (Node* n : db.Subs.nthSubstitution(0)) 1942 db.Names.push_back(n); 1943 first += 2; 1944 } 1945 break; 1946 default: 1947 if (std::isdigit(first[1]) || std::isupper(first[1])) 1948 { 1949 size_t sub = 0; 1950 const char* t = first+1; 1951 if (std::isdigit(*t)) 1952 sub = static_cast<size_t>(*t - '0'); 1953 else 1954 sub = static_cast<size_t>(*t - 'A') + 10; 1955 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t) 1956 { 1957 sub *= 36; 1958 if (std::isdigit(*t)) 1959 sub += static_cast<size_t>(*t - '0'); 1960 else 1961 sub += static_cast<size_t>(*t - 'A') + 10; 1962 } 1963 if (t == last || *t != '_') 1964 return first; 1965 ++sub; 1966 if (sub < db.Subs.size()) 1967 { 1968 for (Node* n : db.Subs.nthSubstitution(sub)) 1969 db.Names.push_back(n); 1970 first = t+1; 1971 } 1972 } 1973 break; 1974 } 1975 } 1976 } 1977 return first; 1978 } 1979 1980 // <builtin-type> ::= v # void 1981 // ::= w # wchar_t 1982 // ::= b # bool 1983 // ::= c # char 1984 // ::= a # signed char 1985 // ::= h # unsigned char 1986 // ::= s # short 1987 // ::= t # unsigned short 1988 // ::= i # int 1989 // ::= j # unsigned int 1990 // ::= l # long 1991 // ::= m # unsigned long 1992 // ::= x # long long, __int64 1993 // ::= y # unsigned long long, __int64 1994 // ::= n # __int128 1995 // ::= o # unsigned __int128 1996 // ::= f # float 1997 // ::= d # double 1998 // ::= e # long double, __float80 1999 // ::= g # __float128 2000 // ::= z # ellipsis 2001 // ::= Dd # IEEE 754r decimal floating point (64 bits) 2002 // ::= De # IEEE 754r decimal floating point (128 bits) 2003 // ::= Df # IEEE 754r decimal floating point (32 bits) 2004 // ::= Dh # IEEE 754r half-precision floating point (16 bits) 2005 // ::= Di # char32_t 2006 // ::= Ds # char16_t 2007 // ::= Da # auto (in dependent new-expressions) 2008 // ::= Dc # decltype(auto) 2009 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) 2010 // ::= u <source-name> # vendor extended type 2011 2012 const char* 2013 parse_builtin_type(const char* first, const char* last, Db& db) 2014 { 2015 if (first != last) 2016 { 2017 switch (*first) 2018 { 2019 case 'v': 2020 db.Names.push_back(db.make<NameType>("void")); 2021 ++first; 2022 break; 2023 case 'w': 2024 db.Names.push_back(db.make<NameType>("wchar_t")); 2025 ++first; 2026 break; 2027 case 'b': 2028 db.Names.push_back(db.make<NameType>("bool")); 2029 ++first; 2030 break; 2031 case 'c': 2032 db.Names.push_back(db.make<NameType>("char")); 2033 ++first; 2034 break; 2035 case 'a': 2036 db.Names.push_back(db.make<NameType>("signed char")); 2037 ++first; 2038 break; 2039 case 'h': 2040 db.Names.push_back(db.make<NameType>("unsigned char")); 2041 ++first; 2042 break; 2043 case 's': 2044 db.Names.push_back(db.make<NameType>("short")); 2045 ++first; 2046 break; 2047 case 't': 2048 db.Names.push_back(db.make<NameType>("unsigned short")); 2049 ++first; 2050 break; 2051 case 'i': 2052 db.Names.push_back(db.make<NameType>("int")); 2053 ++first; 2054 break; 2055 case 'j': 2056 db.Names.push_back(db.make<NameType>("unsigned int")); 2057 ++first; 2058 break; 2059 case 'l': 2060 db.Names.push_back(db.make<NameType>("long")); 2061 ++first; 2062 break; 2063 case 'm': 2064 db.Names.push_back(db.make<NameType>("unsigned long")); 2065 ++first; 2066 break; 2067 case 'x': 2068 db.Names.push_back(db.make<NameType>("long long")); 2069 ++first; 2070 break; 2071 case 'y': 2072 db.Names.push_back(db.make<NameType>("unsigned long long")); 2073 ++first; 2074 break; 2075 case 'n': 2076 db.Names.push_back(db.make<NameType>("__int128")); 2077 ++first; 2078 break; 2079 case 'o': 2080 db.Names.push_back(db.make<NameType>("unsigned __int128")); 2081 ++first; 2082 break; 2083 case 'f': 2084 db.Names.push_back(db.make<NameType>("float")); 2085 ++first; 2086 break; 2087 case 'd': 2088 db.Names.push_back(db.make<NameType>("double")); 2089 ++first; 2090 break; 2091 case 'e': 2092 db.Names.push_back(db.make<NameType>("long double")); 2093 ++first; 2094 break; 2095 case 'g': 2096 db.Names.push_back(db.make<NameType>("__float128")); 2097 ++first; 2098 break; 2099 case 'z': 2100 db.Names.push_back(db.make<NameType>("...")); 2101 ++first; 2102 break; 2103 case 'u': 2104 { 2105 const char*t = parse_source_name(first+1, last, db); 2106 if (t != first+1) 2107 first = t; 2108 } 2109 break; 2110 case 'D': 2111 if (first+1 != last) 2112 { 2113 switch (first[1]) 2114 { 2115 case 'd': 2116 db.Names.push_back(db.make<NameType>("decimal64")); 2117 first += 2; 2118 break; 2119 case 'e': 2120 db.Names.push_back(db.make<NameType>("decimal128")); 2121 first += 2; 2122 break; 2123 case 'f': 2124 db.Names.push_back(db.make<NameType>("decimal32")); 2125 first += 2; 2126 break; 2127 case 'h': 2128 db.Names.push_back(db.make<NameType>("decimal16")); 2129 first += 2; 2130 break; 2131 case 'i': 2132 db.Names.push_back(db.make<NameType>("char32_t")); 2133 first += 2; 2134 break; 2135 case 's': 2136 db.Names.push_back(db.make<NameType>("char16_t")); 2137 first += 2; 2138 break; 2139 case 'a': 2140 db.Names.push_back(db.make<NameType>("auto")); 2141 first += 2; 2142 break; 2143 case 'c': 2144 db.Names.push_back(db.make<NameType>("decltype(auto)")); 2145 first += 2; 2146 break; 2147 case 'n': 2148 db.Names.push_back(db.make<NameType>("std::nullptr_t")); 2149 first += 2; 2150 break; 2151 } 2152 } 2153 break; 2154 } 2155 } 2156 return first; 2157 } 2158 2159 // <CV-Qualifiers> ::= [r] [V] [K] 2160 2161 const char* 2162 parse_cv_qualifiers(const char* first, const char* last, Qualifiers& cv) 2163 { 2164 cv = QualNone; 2165 if (first != last) 2166 { 2167 if (*first == 'r') 2168 { 2169 addQualifiers(cv, QualRestrict); 2170 ++first; 2171 } 2172 if (*first == 'V') 2173 { 2174 addQualifiers(cv, QualVolatile); 2175 ++first; 2176 } 2177 if (*first == 'K') 2178 { 2179 addQualifiers(cv, QualConst); 2180 ++first; 2181 } 2182 } 2183 return first; 2184 } 2185 2186 // <template-param> ::= T_ # first template parameter 2187 // ::= T <parameter-2 non-negative number> _ 2188 2189 const char* 2190 parse_template_param(const char* first, const char* last, Db& db) 2191 { 2192 if (last - first >= 2) 2193 { 2194 if (*first == 'T') 2195 { 2196 if (first[1] == '_') 2197 { 2198 if (!db.TemplateParams.empty()) 2199 { 2200 for (Node *t : db.TemplateParams.nthSubstitution(0)) 2201 db.Names.push_back(t); 2202 first += 2; 2203 } 2204 else 2205 { 2206 db.Names.push_back(db.make<NameType>("T_")); 2207 first += 2; 2208 db.FixForwardReferences = true; 2209 } 2210 } 2211 else if (isdigit(first[1])) 2212 { 2213 const char* t = first+1; 2214 size_t sub = static_cast<size_t>(*t - '0'); 2215 for (++t; t != last && isdigit(*t); ++t) 2216 { 2217 sub *= 10; 2218 sub += static_cast<size_t>(*t - '0'); 2219 } 2220 if (t == last || *t != '_') 2221 return first; 2222 ++sub; 2223 if (sub < db.TemplateParams.size()) 2224 { 2225 for (Node *temp : db.TemplateParams.nthSubstitution(sub)) 2226 db.Names.push_back(temp); 2227 first = t+1; 2228 } 2229 else 2230 { 2231 db.Names.push_back( 2232 db.make<NameType>(StringView(first, t + 1))); 2233 first = t+1; 2234 db.FixForwardReferences = true; 2235 } 2236 } 2237 } 2238 } 2239 return first; 2240 } 2241 2242 // cc <type> <expression> # const_cast<type> (expression) 2243 2244 const char* 2245 parse_const_cast_expr(const char* first, const char* last, Db& db) 2246 { 2247 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') 2248 { 2249 const char* t = parse_type(first+2, last, db); 2250 if (t != first+2) 2251 { 2252 const char* t1 = parse_expression(t, last, db); 2253 if (t1 != t) 2254 { 2255 if (db.Names.size() < 2) 2256 return first; 2257 auto from_expr = db.Names.back(); 2258 db.Names.pop_back(); 2259 if (db.Names.empty()) 2260 return first; 2261 db.Names.back() = db.make<CastExpr>( 2262 "const_cast", db.Names.back(), from_expr); 2263 first = t1; 2264 } 2265 } 2266 } 2267 return first; 2268 } 2269 2270 // dc <type> <expression> # dynamic_cast<type> (expression) 2271 2272 const char* 2273 parse_dynamic_cast_expr(const char* first, const char* last, Db& db) 2274 { 2275 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') 2276 { 2277 const char* t = parse_type(first+2, last, db); 2278 if (t != first+2) 2279 { 2280 const char* t1 = parse_expression(t, last, db); 2281 if (t1 != t) 2282 { 2283 if (db.Names.size() < 2) 2284 return first; 2285 auto from_expr = db.Names.back(); 2286 db.Names.pop_back(); 2287 if (db.Names.empty()) 2288 return first; 2289 db.Names.back() = db.make<CastExpr>( 2290 "dynamic_cast", db.Names.back(), from_expr); 2291 first = t1; 2292 } 2293 } 2294 } 2295 return first; 2296 } 2297 2298 // rc <type> <expression> # reinterpret_cast<type> (expression) 2299 2300 const char* 2301 parse_reinterpret_cast_expr(const char* first, const char* last, Db& db) 2302 { 2303 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') 2304 { 2305 const char* t = parse_type(first+2, last, db); 2306 if (t != first+2) 2307 { 2308 const char* t1 = parse_expression(t, last, db); 2309 if (t1 != t) 2310 { 2311 if (db.Names.size() < 2) 2312 return first; 2313 auto from_expr = db.Names.back(); 2314 db.Names.pop_back(); 2315 if (db.Names.empty()) 2316 return first; 2317 db.Names.back() = db.make<CastExpr>( 2318 "reinterpret_cast", db.Names.back(), from_expr); 2319 first = t1; 2320 } 2321 } 2322 } 2323 return first; 2324 } 2325 2326 // sc <type> <expression> # static_cast<type> (expression) 2327 2328 const char* 2329 parse_static_cast_expr(const char* first, const char* last, Db& db) 2330 { 2331 if (last - first >= 3 && first[0] == 's' && first[1] == 'c') 2332 { 2333 const char* t = parse_type(first+2, last, db); 2334 if (t != first+2) 2335 { 2336 const char* t1 = parse_expression(t, last, db); 2337 if (t1 != t) 2338 { 2339 if (db.Names.size() < 2) 2340 return first; 2341 auto from_expr = db.Names.back(); 2342 db.Names.pop_back(); 2343 db.Names.back() = db.make<CastExpr>( 2344 "static_cast", db.Names.back(), from_expr); 2345 first = t1; 2346 } 2347 } 2348 } 2349 return first; 2350 } 2351 2352 // sp <expression> # pack expansion 2353 2354 const char* 2355 parse_pack_expansion(const char* first, const char* last, Db& db) 2356 { 2357 if (last - first >= 3 && first[0] == 's' && first[1] == 'p') 2358 { 2359 const char* t = parse_expression(first+2, last, db); 2360 if (t != first+2) 2361 first = t; 2362 } 2363 return first; 2364 } 2365 2366 // st <type> # sizeof (a type) 2367 2368 const char* 2369 parse_sizeof_type_expr(const char* first, const char* last, Db& db) 2370 { 2371 if (last - first >= 3 && first[0] == 's' && first[1] == 't') 2372 { 2373 const char* t = parse_type(first+2, last, db); 2374 if (t != first+2) 2375 { 2376 if (db.Names.empty()) 2377 return first; 2378 db.Names.back() = db.make<EnclosingExpr>( 2379 "sizeof (", db.Names.back(), ")"); 2380 first = t; 2381 } 2382 } 2383 return first; 2384 } 2385 2386 // sz <expr> # sizeof (a expression) 2387 2388 const char* 2389 parse_sizeof_expr_expr(const char* first, const char* last, Db& db) 2390 { 2391 if (last - first >= 3 && first[0] == 's' && first[1] == 'z') 2392 { 2393 const char* t = parse_expression(first+2, last, db); 2394 if (t != first+2) 2395 { 2396 if (db.Names.empty()) 2397 return first; 2398 db.Names.back() = db.make<EnclosingExpr>( 2399 "sizeof (", db.Names.back(), ")"); 2400 first = t; 2401 } 2402 } 2403 return first; 2404 } 2405 2406 // sZ <template-param> # size of a parameter pack 2407 2408 const char* 2409 parse_sizeof_param_pack_expr(const char* first, const char* last, Db& db) 2410 { 2411 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T') 2412 { 2413 size_t k0 = db.Names.size(); 2414 const char* t = parse_template_param(first+2, last, db); 2415 size_t k1 = db.Names.size(); 2416 if (t != first+2 && k0 <= k1) 2417 { 2418 Node* sizeof_expr = db.make<SizeofParamPackExpr>( 2419 db.popTrailingNodeArray(k0)); 2420 db.Names.push_back(sizeof_expr); 2421 first = t; 2422 } 2423 } 2424 return first; 2425 } 2426 2427 // <function-param> ::= fp <top-level CV-Qualifiers> _ # L == 0, first parameter 2428 // ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters 2429 // ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _ # L > 0, first parameter 2430 // ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters 2431 2432 const char* 2433 parse_function_param(const char* first, const char* last, Db& db) 2434 { 2435 if (last - first >= 3 && *first == 'f') 2436 { 2437 if (first[1] == 'p') 2438 { 2439 Qualifiers cv; 2440 const char* t = parse_cv_qualifiers(first+2, last, cv); 2441 const char* t1 = parse_number(t, last); 2442 if (t1 != last && *t1 == '_') 2443 { 2444 db.Names.push_back( 2445 db.make<FunctionParam>(StringView(t, t1))); 2446 first = t1+1; 2447 } 2448 } 2449 else if (first[1] == 'L') 2450 { 2451 Qualifiers cv; 2452 const char* t0 = parse_number(first+2, last); 2453 if (t0 != last && *t0 == 'p') 2454 { 2455 ++t0; 2456 const char* t = parse_cv_qualifiers(t0, last, cv); 2457 const char* t1 = parse_number(t, last); 2458 if (t1 != last && *t1 == '_') 2459 { 2460 db.Names.push_back( 2461 db.make<FunctionParam>(StringView(t, t1))); 2462 first = t1+1; 2463 } 2464 } 2465 } 2466 } 2467 return first; 2468 } 2469 2470 // sZ <function-param> # size of a function parameter pack 2471 2472 const char* 2473 parse_sizeof_function_param_pack_expr(const char* first, const char* last, Db& db) 2474 { 2475 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f') 2476 { 2477 const char* t = parse_function_param(first+2, last, db); 2478 if (t != first+2) 2479 { 2480 if (db.Names.empty()) 2481 return first; 2482 db.Names.back() = db.make<EnclosingExpr>( 2483 "sizeof...(", db.Names.back(), ")"); 2484 first = t; 2485 } 2486 } 2487 return first; 2488 } 2489 2490 // te <expression> # typeid (expression) 2491 // ti <type> # typeid (type) 2492 2493 const char* 2494 parse_typeid_expr(const char* first, const char* last, Db& db) 2495 { 2496 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i')) 2497 { 2498 const char* t; 2499 if (first[1] == 'e') 2500 t = parse_expression(first+2, last, db); 2501 else 2502 t = parse_type(first+2, last, db); 2503 if (t != first+2) 2504 { 2505 if (db.Names.empty()) 2506 return first; 2507 db.Names.back() = db.make<EnclosingExpr>( 2508 "typeid(", db.Names.back(), ")"); 2509 first = t; 2510 } 2511 } 2512 return first; 2513 } 2514 2515 // tw <expression> # throw expression 2516 2517 const char* 2518 parse_throw_expr(const char* first, const char* last, Db& db) 2519 { 2520 if (last - first >= 3 && first[0] == 't' && first[1] == 'w') 2521 { 2522 const char* t = parse_expression(first+2, last, db); 2523 if (t != first+2) 2524 { 2525 if (db.Names.empty()) 2526 return first; 2527 db.Names.back() = db.make<ThrowExpr>(db.Names.back()); 2528 first = t; 2529 } 2530 } 2531 return first; 2532 } 2533 2534 // ds <expression> <expression> # expr.*expr 2535 2536 const char* 2537 parse_dot_star_expr(const char* first, const char* last, Db& db) 2538 { 2539 if (last - first >= 3 && first[0] == 'd' && first[1] == 's') 2540 { 2541 const char* t = parse_expression(first+2, last, db); 2542 if (t != first+2) 2543 { 2544 const char* t1 = parse_expression(t, last, db); 2545 if (t1 != t) 2546 { 2547 if (db.Names.size() < 2) 2548 return first; 2549 auto rhs_expr = db.Names.back(); 2550 db.Names.pop_back(); 2551 db.Names.back() = db.make<MemberExpr>( 2552 db.Names.back(), ".*", rhs_expr); 2553 first = t1; 2554 } 2555 } 2556 } 2557 return first; 2558 } 2559 2560 // <simple-id> ::= <source-name> [ <template-args> ] 2561 2562 const char* 2563 parse_simple_id(const char* first, const char* last, Db& db) 2564 { 2565 if (first != last) 2566 { 2567 const char* t = parse_source_name(first, last, db); 2568 if (t != first) 2569 { 2570 const char* t1 = parse_template_args(t, last, db); 2571 if (t1 != t) 2572 { 2573 if (db.Names.size() < 2) 2574 return first; 2575 auto args = db.Names.back(); 2576 db.Names.pop_back(); 2577 db.Names.back() = 2578 db.make<NameWithTemplateArgs>(db.Names.back(), args); 2579 } 2580 first = t1; 2581 } 2582 else 2583 first = t; 2584 } 2585 return first; 2586 } 2587 2588 // <unresolved-type> ::= <template-param> 2589 // ::= <decltype> 2590 // ::= <substitution> 2591 2592 const char* 2593 parse_unresolved_type(const char* first, const char* last, Db& db) 2594 { 2595 if (first != last) 2596 { 2597 const char* t = first; 2598 switch (*first) 2599 { 2600 case 'T': 2601 { 2602 size_t k0 = db.Names.size(); 2603 t = parse_template_param(first, last, db); 2604 size_t k1 = db.Names.size(); 2605 if (t != first && k1 == k0 + 1) 2606 { 2607 db.Subs.pushSubstitution(db.Names.back()); 2608 first = t; 2609 } 2610 else 2611 { 2612 for (; k1 != k0; --k1) 2613 db.Names.pop_back(); 2614 } 2615 break; 2616 } 2617 case 'D': 2618 t = parse_decltype(first, last, db); 2619 if (t != first) 2620 { 2621 if (db.Names.empty()) 2622 return first; 2623 db.Subs.pushSubstitution(db.Names.back()); 2624 first = t; 2625 } 2626 break; 2627 case 'S': 2628 t = parse_substitution(first, last, db); 2629 if (t != first) 2630 first = t; 2631 else 2632 { 2633 if (last - first > 2 && first[1] == 't') 2634 { 2635 t = parse_unqualified_name(first+2, last, db); 2636 if (t != first+2) 2637 { 2638 if (db.Names.empty()) 2639 return first; 2640 db.Names.back() = 2641 db.make<StdQualifiedName>(db.Names.back()); 2642 db.Subs.pushSubstitution(db.Names.back()); 2643 first = t; 2644 } 2645 } 2646 } 2647 break; 2648 } 2649 } 2650 return first; 2651 } 2652 2653 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) 2654 // ::= <simple-id> # e.g., ~A<2*N> 2655 2656 const char* 2657 parse_destructor_name(const char* first, const char* last, Db& db) 2658 { 2659 if (first != last) 2660 { 2661 const char* t = parse_unresolved_type(first, last, db); 2662 if (t == first) 2663 t = parse_simple_id(first, last, db); 2664 if (t != first) 2665 { 2666 if (db.Names.empty()) 2667 return first; 2668 db.Names.back() = db.make<DtorName>(db.Names.back()); 2669 first = t; 2670 } 2671 } 2672 return first; 2673 } 2674 2675 // <base-unresolved-name> ::= <simple-id> # unresolved name 2676 // extension ::= <operator-name> # unresolved operator-function-id 2677 // extension ::= <operator-name> <template-args> # unresolved operator template-id 2678 // ::= on <operator-name> # unresolved operator-function-id 2679 // ::= on <operator-name> <template-args> # unresolved operator template-id 2680 // ::= dn <destructor-name> # destructor or pseudo-destructor; 2681 // # e.g. ~X or ~X<N-1> 2682 2683 const char* 2684 parse_base_unresolved_name(const char* first, const char* last, Db& db) 2685 { 2686 if (last - first >= 2) 2687 { 2688 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n') 2689 { 2690 if (first[0] == 'o') 2691 { 2692 const char* t = parse_operator_name(first+2, last, db); 2693 if (t != first+2) 2694 { 2695 first = parse_template_args(t, last, db); 2696 if (first != t) 2697 { 2698 if (db.Names.size() < 2) 2699 return first; 2700 auto args = db.Names.back(); 2701 db.Names.pop_back(); 2702 db.Names.back() = 2703 db.make<NameWithTemplateArgs>( 2704 db.Names.back(), args); 2705 } 2706 } 2707 } 2708 else 2709 { 2710 const char* t = parse_destructor_name(first+2, last, db); 2711 if (t != first+2) 2712 first = t; 2713 } 2714 } 2715 else 2716 { 2717 const char* t = parse_simple_id(first, last, db); 2718 if (t == first) 2719 { 2720 t = parse_operator_name(first, last, db); 2721 if (t != first) 2722 { 2723 first = parse_template_args(t, last, db); 2724 if (first != t) 2725 { 2726 if (db.Names.size() < 2) 2727 return first; 2728 auto args = db.Names.back(); 2729 db.Names.pop_back(); 2730 db.Names.back() = 2731 db.make<NameWithTemplateArgs>( 2732 db.Names.back(), args); 2733 } 2734 } 2735 } 2736 else 2737 first = t; 2738 } 2739 } 2740 return first; 2741 } 2742 2743 // <unresolved-qualifier-level> ::= <simple-id> 2744 2745 const char* 2746 parse_unresolved_qualifier_level(const char* first, const char* last, Db& db) 2747 { 2748 return parse_simple_id(first, last, db); 2749 } 2750 2751 // <unresolved-name> 2752 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> 2753 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x 2754 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> 2755 // # A::x, N::y, A<T>::z; "gs" means leading "::" 2756 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x 2757 // extension ::= sr <unresolved-type> <template-args> <base-unresolved-name> 2758 // # T::N::x /decltype(p)::N::x 2759 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> 2760 2761 const char* 2762 parse_unresolved_name(const char* first, const char* last, Db& db) 2763 { 2764 if (last - first > 2) 2765 { 2766 const char* t = first; 2767 bool global = false; 2768 if (t[0] == 'g' && t[1] == 's') 2769 { 2770 global = true; 2771 t += 2; 2772 } 2773 const char* t2 = parse_base_unresolved_name(t, last, db); 2774 if (t2 != t) 2775 { 2776 if (global) 2777 { 2778 if (db.Names.empty()) 2779 return first; 2780 db.Names.back() = 2781 db.make<GlobalQualifiedName>(db.Names.back()); 2782 } 2783 first = t2; 2784 } 2785 else if (last - t > 2 && t[0] == 's' && t[1] == 'r') 2786 { 2787 if (t[2] == 'N') 2788 { 2789 t += 3; 2790 const char* t1 = parse_unresolved_type(t, last, db); 2791 if (t1 == t || t1 == last) 2792 return first; 2793 t = t1; 2794 t1 = parse_template_args(t, last, db); 2795 if (t1 != t) 2796 { 2797 if (db.Names.size() < 2) 2798 return first; 2799 auto args = db.Names.back(); 2800 db.Names.pop_back(); 2801 db.Names.back() = db.make<NameWithTemplateArgs>( 2802 db.Names.back(), args); 2803 t = t1; 2804 if (t == last) 2805 { 2806 db.Names.pop_back(); 2807 return first; 2808 } 2809 } 2810 while (*t != 'E') 2811 { 2812 t1 = parse_unresolved_qualifier_level(t, last, db); 2813 if (t1 == t || t1 == last || db.Names.size() < 2) 2814 return first; 2815 auto s = db.Names.back(); 2816 db.Names.pop_back(); 2817 db.Names.back() = 2818 db.make<QualifiedName>(db.Names.back(), s); 2819 t = t1; 2820 } 2821 ++t; 2822 t1 = parse_base_unresolved_name(t, last, db); 2823 if (t1 == t) 2824 { 2825 if (!db.Names.empty()) 2826 db.Names.pop_back(); 2827 return first; 2828 } 2829 if (db.Names.size() < 2) 2830 return first; 2831 auto s = db.Names.back(); 2832 db.Names.pop_back(); 2833 db.Names.back() = 2834 db.make<QualifiedName>(db.Names.back(), s); 2835 first = t1; 2836 } 2837 else 2838 { 2839 t += 2; 2840 const char* t1 = parse_unresolved_type(t, last, db); 2841 if (t1 != t) 2842 { 2843 t = t1; 2844 t1 = parse_template_args(t, last, db); 2845 if (t1 != t) 2846 { 2847 if (db.Names.size() < 2) 2848 return first; 2849 auto args = db.Names.back(); 2850 db.Names.pop_back(); 2851 db.Names.back() = 2852 db.make<NameWithTemplateArgs>( 2853 db.Names.back(), args); 2854 t = t1; 2855 } 2856 t1 = parse_base_unresolved_name(t, last, db); 2857 if (t1 == t) 2858 { 2859 if (!db.Names.empty()) 2860 db.Names.pop_back(); 2861 return first; 2862 } 2863 if (db.Names.size() < 2) 2864 return first; 2865 auto s = db.Names.back(); 2866 db.Names.pop_back(); 2867 db.Names.back() = 2868 db.make<QualifiedName>(db.Names.back(), s); 2869 first = t1; 2870 } 2871 else 2872 { 2873 t1 = parse_unresolved_qualifier_level(t, last, db); 2874 if (t1 == t || t1 == last) 2875 return first; 2876 t = t1; 2877 if (global) 2878 { 2879 if (db.Names.empty()) 2880 return first; 2881 db.Names.back() = 2882 db.make<GlobalQualifiedName>( 2883 db.Names.back()); 2884 } 2885 while (*t != 'E') 2886 { 2887 t1 = parse_unresolved_qualifier_level(t, last, db); 2888 if (t1 == t || t1 == last || db.Names.size() < 2) 2889 return first; 2890 auto s = db.Names.back(); 2891 db.Names.pop_back(); 2892 db.Names.back() = db.make<QualifiedName>( 2893 db.Names.back(), s); 2894 t = t1; 2895 } 2896 ++t; 2897 t1 = parse_base_unresolved_name(t, last, db); 2898 if (t1 == t) 2899 { 2900 if (!db.Names.empty()) 2901 db.Names.pop_back(); 2902 return first; 2903 } 2904 if (db.Names.size() < 2) 2905 return first; 2906 auto s = db.Names.back(); 2907 db.Names.pop_back(); 2908 db.Names.back() = 2909 db.make<QualifiedName>(db.Names.back(), s); 2910 first = t1; 2911 } 2912 } 2913 } 2914 } 2915 return first; 2916 } 2917 2918 // dt <expression> <unresolved-name> # expr.name 2919 2920 const char* 2921 parse_dot_expr(const char* first, const char* last, Db& db) 2922 { 2923 if (last - first >= 3 && first[0] == 'd' && first[1] == 't') 2924 { 2925 const char* t = parse_expression(first+2, last, db); 2926 if (t != first+2) 2927 { 2928 const char* t1 = parse_unresolved_name(t, last, db); 2929 if (t1 != t) 2930 { 2931 if (db.Names.size() < 2) 2932 return first; 2933 auto name = db.Names.back(); 2934 db.Names.pop_back(); 2935 if (db.Names.empty()) 2936 return first; 2937 db.Names.back() = db.make<MemberExpr>(db.Names.back(), ".", name); 2938 first = t1; 2939 } 2940 } 2941 } 2942 return first; 2943 } 2944 2945 // cl <expression>+ E # call 2946 2947 const char* 2948 parse_call_expr(const char* first, const char* last, Db& db) 2949 { 2950 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') 2951 { 2952 const char* t = parse_expression(first+2, last, db); 2953 if (t == last || t == first + 2 || db.Names.empty()) 2954 return first; 2955 Node* callee = db.Names.back(); 2956 db.Names.pop_back(); 2957 size_t args_begin = db.Names.size(); 2958 while (*t != 'E') 2959 { 2960 const char* t1 = parse_expression(t, last, db); 2961 if (t1 == last || t1 == t) 2962 return first; 2963 t = t1; 2964 } 2965 if (db.Names.size() < args_begin) 2966 return first; 2967 ++t; 2968 CallExpr* the_call = db.make<CallExpr>( 2969 callee, db.popTrailingNodeArray(args_begin)); 2970 db.Names.push_back(the_call); 2971 first = t; 2972 } 2973 return first; 2974 } 2975 2976 // [gs] nw <expression>* _ <type> E # new (expr-list) type 2977 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 2978 // [gs] na <expression>* _ <type> E # new[] (expr-list) type 2979 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 2980 // <initializer> ::= pi <expression>* E # parenthesized initialization 2981 2982 const char* 2983 parse_new_expr(const char* first, const char* last, Db& db) 2984 { 2985 if (last - first >= 4) 2986 { 2987 const char* t = first; 2988 bool parsed_gs = false; 2989 if (t[0] == 'g' && t[1] == 's') 2990 { 2991 t += 2; 2992 parsed_gs = true; 2993 } 2994 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a')) 2995 { 2996 bool is_array = t[1] == 'a'; 2997 t += 2; 2998 if (t == last) 2999 return first; 3000 size_t first_expr_in_list = db.Names.size(); 3001 NodeArray ExprList, init_list; 3002 while (*t != '_') 3003 { 3004 const char* t1 = parse_expression(t, last, db); 3005 if (t1 == t || t1 == last) 3006 return first; 3007 t = t1; 3008 } 3009 if (first_expr_in_list > db.Names.size()) 3010 return first; 3011 ExprList = db.popTrailingNodeArray(first_expr_in_list); 3012 ++t; 3013 const char* t1 = parse_type(t, last, db); 3014 if (t1 == t || t1 == last) 3015 return first; 3016 t = t1; 3017 bool has_init = false; 3018 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') 3019 { 3020 t += 2; 3021 has_init = true; 3022 size_t init_list_begin = db.Names.size(); 3023 while (*t != 'E') 3024 { 3025 t1 = parse_expression(t, last, db); 3026 if (t1 == t || t1 == last) 3027 return first; 3028 t = t1; 3029 } 3030 if (init_list_begin > db.Names.size()) 3031 return first; 3032 init_list = db.popTrailingNodeArray(init_list_begin); 3033 } 3034 if (*t != 'E' || db.Names.empty()) 3035 return first; 3036 auto type = db.Names.back(); 3037 db.Names.pop_back(); 3038 db.Names.push_back( 3039 db.make<NewExpr>(ExprList, type, init_list, 3040 parsed_gs, is_array)); 3041 first = t+1; 3042 } 3043 } 3044 return first; 3045 } 3046 3047 // cv <type> <expression> # conversion with one argument 3048 // cv <type> _ <expression>* E # conversion with a different number of arguments 3049 3050 const char* 3051 parse_conversion_expr(const char* first, const char* last, Db& db) 3052 { 3053 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') 3054 { 3055 bool TryToParseTemplateArgs = db.TryToParseTemplateArgs; 3056 db.TryToParseTemplateArgs = false; 3057 size_t type_begin = db.Names.size(); 3058 const char* t = parse_type(first+2, last, db); 3059 db.TryToParseTemplateArgs = TryToParseTemplateArgs; 3060 if (t != first+2 && t != last) 3061 { 3062 size_t expr_list_begin = db.Names.size(); 3063 if (*t != '_') 3064 { 3065 const char* t1 = parse_expression(t, last, db); 3066 if (t1 == t) 3067 return first; 3068 t = t1; 3069 } 3070 else 3071 { 3072 ++t; 3073 if (t == last) 3074 return first; 3075 if (*t != 'E') 3076 { 3077 while (*t != 'E') 3078 { 3079 const char* t1 = parse_expression(t, last, db); 3080 if (t1 == t || t1 == last) 3081 return first; 3082 t = t1; 3083 } 3084 } 3085 ++t; 3086 } 3087 if (db.Names.size() < expr_list_begin || 3088 type_begin > expr_list_begin) 3089 return first; 3090 NodeArray expressions = db.makeNodeArray( 3091 db.Names.begin() + (long)expr_list_begin, db.Names.end()); 3092 NodeArray types = db.makeNodeArray( 3093 db.Names.begin() + (long)type_begin, 3094 db.Names.begin() + (long)expr_list_begin); 3095 auto* conv_expr = db.make<ConversionExpr>( 3096 types, expressions); 3097 db.Names.dropBack(type_begin); 3098 db.Names.push_back(conv_expr); 3099 first = t; 3100 } 3101 } 3102 return first; 3103 } 3104 3105 // pt <expression> <expression> # expr->name 3106 3107 const char* 3108 parse_arrow_expr(const char* first, const char* last, Db& db) 3109 { 3110 if (last - first >= 3 && first[0] == 'p' && first[1] == 't') 3111 { 3112 const char* t = parse_expression(first+2, last, db); 3113 if (t != first+2) 3114 { 3115 const char* t1 = parse_expression(t, last, db); 3116 if (t1 != t) 3117 { 3118 if (db.Names.size() < 2) 3119 return first; 3120 auto tmp = db.Names.back(); 3121 db.Names.pop_back(); 3122 db.Names.back() = db.make<MemberExpr>( 3123 db.Names.back(), "->", tmp); 3124 first = t1; 3125 } 3126 } 3127 } 3128 return first; 3129 } 3130 3131 // <ref-qualifier> ::= R # & ref-qualifier 3132 // <ref-qualifier> ::= O # && ref-qualifier 3133 3134 // <function-type> ::= F [Y] <bare-function-type> [<ref-qualifier>] E 3135 3136 const char* 3137 parse_function_type(const char* first, const char* last, Db& db) 3138 { 3139 if (first != last && *first == 'F') 3140 { 3141 const char* t = first+1; 3142 if (t != last) 3143 { 3144 if (*t == 'Y') 3145 { 3146 /* extern "C" */ 3147 if (++t == last) 3148 return first; 3149 } 3150 const char* t1 = parse_type(t, last, db); 3151 if (t1 != t && !db.Names.empty()) 3152 { 3153 Node* ret_type = db.Names.back(); 3154 db.Names.pop_back(); 3155 size_t params_begin = db.Names.size(); 3156 t = t1; 3157 FunctionRefQual RefQuals = FrefQualNone; 3158 while (true) 3159 { 3160 if (t == last) 3161 { 3162 if (!db.Names.empty()) 3163 db.Names.pop_back(); 3164 return first; 3165 } 3166 if (*t == 'E') 3167 { 3168 ++t; 3169 break; 3170 } 3171 if (*t == 'v') 3172 { 3173 ++t; 3174 continue; 3175 } 3176 if (*t == 'R' && t+1 != last && t[1] == 'E') 3177 { 3178 RefQuals = FrefQualLValue; 3179 ++t; 3180 continue; 3181 } 3182 if (*t == 'O' && t+1 != last && t[1] == 'E') 3183 { 3184 RefQuals = FrefQualRValue; 3185 ++t; 3186 continue; 3187 } 3188 size_t k0 = db.Names.size(); 3189 t1 = parse_type(t, last, db); 3190 size_t k1 = db.Names.size(); 3191 if (t1 == t || t1 == last || k1 < k0) 3192 return first; 3193 t = t1; 3194 } 3195 if (db.Names.empty() || params_begin > db.Names.size()) 3196 return first; 3197 Node* fty = db.make<FunctionType>( 3198 ret_type, db.popTrailingNodeArray(params_begin)); 3199 if (RefQuals) 3200 fty = db.make<FunctionRefQualType>(fty, RefQuals); 3201 db.Names.push_back(fty); 3202 first = t; 3203 } 3204 } 3205 } 3206 return first; 3207 } 3208 3209 // <pointer-to-member-type> ::= M <class type> <member type> 3210 3211 const char* 3212 parse_pointer_to_member_type(const char* first, const char* last, Db& db) 3213 { 3214 if (first != last && *first == 'M') 3215 { 3216 const char* t = parse_type(first+1, last, db); 3217 if (t != first+1) 3218 { 3219 const char* t2 = parse_type(t, last, db); 3220 if (t2 != t) 3221 { 3222 if (db.Names.size() < 2) 3223 return first; 3224 auto func = std::move(db.Names.back()); 3225 db.Names.pop_back(); 3226 auto ClassType = std::move(db.Names.back()); 3227 db.Names.back() = 3228 db.make<PointerToMemberType>(ClassType, func); 3229 first = t2; 3230 } 3231 } 3232 } 3233 return first; 3234 } 3235 3236 // <array-type> ::= A <positive dimension number> _ <element type> 3237 // ::= A [<dimension expression>] _ <element type> 3238 3239 const char* 3240 parse_array_type(const char* first, const char* last, Db& db) 3241 { 3242 if (first != last && *first == 'A' && first+1 != last) 3243 { 3244 if (first[1] == '_') 3245 { 3246 const char* t = parse_type(first+2, last, db); 3247 if (t != first+2) 3248 { 3249 if (db.Names.empty()) 3250 return first; 3251 db.Names.back() = db.make<ArrayType>(db.Names.back()); 3252 first = t; 3253 } 3254 } 3255 else if ('1' <= first[1] && first[1] <= '9') 3256 { 3257 const char* t = parse_number(first+1, last); 3258 if (t != last && *t == '_') 3259 { 3260 const char* t2 = parse_type(t+1, last, db); 3261 if (t2 != t+1) 3262 { 3263 if (db.Names.empty()) 3264 return first; 3265 db.Names.back() = 3266 db.make<ArrayType>(db.Names.back(), 3267 StringView(first + 1, t)); 3268 first = t2; 3269 } 3270 } 3271 } 3272 else 3273 { 3274 const char* t = parse_expression(first+1, last, db); 3275 if (t != first+1 && t != last && *t == '_') 3276 { 3277 const char* t2 = parse_type(++t, last, db); 3278 if (t2 != t) 3279 { 3280 if (db.Names.size() < 2) 3281 return first; 3282 auto base_type = std::move(db.Names.back()); 3283 db.Names.pop_back(); 3284 auto dimension_expr = std::move(db.Names.back()); 3285 db.Names.back() = 3286 db.make<ArrayType>(base_type, dimension_expr); 3287 first = t2; 3288 } 3289 } 3290 } 3291 } 3292 return first; 3293 } 3294 3295 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) 3296 // ::= DT <expression> E # decltype of an expression (C++0x) 3297 3298 const char* 3299 parse_decltype(const char* first, const char* last, Db& db) 3300 { 3301 if (last - first >= 4 && first[0] == 'D') 3302 { 3303 switch (first[1]) 3304 { 3305 case 't': 3306 case 'T': 3307 { 3308 const char* t = parse_expression(first+2, last, db); 3309 if (t != first+2 && t != last && *t == 'E') 3310 { 3311 if (db.Names.empty()) 3312 return first; 3313 db.Names.back() = db.make<EnclosingExpr>( 3314 "decltype(", db.Names.back(), ")"); 3315 first = t+1; 3316 } 3317 } 3318 break; 3319 } 3320 } 3321 return first; 3322 } 3323 3324 // extension: 3325 // <vector-type> ::= Dv <positive dimension number> _ 3326 // <extended element type> 3327 // ::= Dv [<dimension expression>] _ <element type> 3328 // <extended element type> ::= <element type> 3329 // ::= p # AltiVec vector pixel 3330 3331 const char* 3332 parse_vector_type(const char* first, const char* last, Db& db) 3333 { 3334 if (last - first > 3 && first[0] == 'D' && first[1] == 'v') 3335 { 3336 if ('1' <= first[2] && first[2] <= '9') 3337 { 3338 const char* t = parse_number(first+2, last); 3339 if (t == last || *t != '_') 3340 return first; 3341 const char* num = first + 2; 3342 size_t sz = static_cast<size_t>(t - num); 3343 if (++t != last) 3344 { 3345 if (*t != 'p') 3346 { 3347 const char* t1 = parse_type(t, last, db); 3348 if (t1 != t) 3349 { 3350 if (db.Names.empty()) 3351 return first; 3352 db.Names.back() = 3353 db.make<VectorType>(db.Names.back(), 3354 StringView(num, num + sz)); 3355 first = t1; 3356 } 3357 } 3358 else 3359 { 3360 ++t; 3361 db.Names.push_back( 3362 db.make<VectorType>(StringView(num, num + sz))); 3363 first = t; 3364 } 3365 } 3366 } 3367 else 3368 { 3369 Node* num = nullptr; 3370 const char* t1 = first+2; 3371 if (*t1 != '_') 3372 { 3373 const char* t = parse_expression(t1, last, db); 3374 if (t != t1) 3375 { 3376 if (db.Names.empty()) 3377 return first; 3378 num = db.Names.back(); 3379 db.Names.pop_back(); 3380 t1 = t; 3381 } 3382 } 3383 if (t1 != last && *t1 == '_' && ++t1 != last) 3384 { 3385 const char* t = parse_type(t1, last, db); 3386 if (t != t1) 3387 { 3388 if (db.Names.empty()) 3389 return first; 3390 if (num) 3391 db.Names.back() = 3392 db.make<VectorType>(db.Names.back(), num); 3393 else 3394 db.Names.back() = 3395 db.make<VectorType>(db.Names.back(), StringView()); 3396 first = t; 3397 } else if (num) 3398 db.Names.push_back(num); 3399 } 3400 } 3401 } 3402 return first; 3403 } 3404 3405 // <type> ::= <builtin-type> 3406 // ::= <function-type> 3407 // ::= <class-enum-type> 3408 // ::= <array-type> 3409 // ::= <pointer-to-member-type> 3410 // ::= <template-param> 3411 // ::= <template-template-param> <template-args> 3412 // ::= <decltype> 3413 // ::= <substitution> 3414 // ::= <CV-Qualifiers> <type> 3415 // ::= P <type> # pointer-to 3416 // ::= R <type> # reference-to 3417 // ::= O <type> # rvalue reference-to (C++0x) 3418 // ::= C <type> # complex pair (C 2000) 3419 // ::= G <type> # imaginary (C 2000) 3420 // ::= Dp <type> # pack expansion (C++0x) 3421 // ::= U <source-name> <type> # vendor extended type qualifier 3422 // extension := U <objc-name> <objc-type> # objc-type<identifier> 3423 // extension := <vector-type> # <vector-type> starts with Dv 3424 3425 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1 3426 // <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name> 3427 3428 const char* 3429 parse_type(const char* first, const char* last, Db& db) 3430 { 3431 if (first != last) 3432 { 3433 switch (*first) 3434 { 3435 case 'r': 3436 case 'V': 3437 case 'K': 3438 { 3439 Qualifiers cv = QualNone; 3440 const char* t = parse_cv_qualifiers(first, last, cv); 3441 if (t != first) 3442 { 3443 bool is_function = *t == 'F'; 3444 size_t k0 = db.Names.size(); 3445 const char* t1 = parse_type(t, last, db); 3446 size_t k1 = db.Names.size(); 3447 if (t1 != t) 3448 { 3449 if (is_function) 3450 db.Subs.popPack(); 3451 db.Subs.pushPack(); 3452 for (size_t k = k0; k < k1; ++k) 3453 { 3454 if (cv) { 3455 if (is_function) 3456 db.Names[k] = db.make<FunctionQualType>( 3457 db.Names[k], cv); 3458 else 3459 db.Names[k] = 3460 db.make<QualType>(db.Names[k], cv); 3461 } 3462 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3463 } 3464 first = t1; 3465 } 3466 } 3467 } 3468 break; 3469 default: 3470 { 3471 const char* t = parse_builtin_type(first, last, db); 3472 if (t != first) 3473 { 3474 first = t; 3475 } 3476 else 3477 { 3478 switch (*first) 3479 { 3480 case 'A': 3481 t = parse_array_type(first, last, db); 3482 if (t != first) 3483 { 3484 if (db.Names.empty()) 3485 return first; 3486 first = t; 3487 db.Subs.pushSubstitution(db.Names.back()); 3488 } 3489 break; 3490 case 'C': 3491 t = parse_type(first+1, last, db); 3492 if (t != first+1) 3493 { 3494 if (db.Names.empty()) 3495 return first; 3496 db.Names.back() = db.make<PostfixQualifiedType>( 3497 db.Names.back(), " complex"); 3498 first = t; 3499 db.Subs.pushSubstitution(db.Names.back()); 3500 } 3501 break; 3502 case 'F': 3503 t = parse_function_type(first, last, db); 3504 if (t != first) 3505 { 3506 if (db.Names.empty()) 3507 return first; 3508 first = t; 3509 db.Subs.pushSubstitution(db.Names.back()); 3510 } 3511 break; 3512 case 'G': 3513 t = parse_type(first+1, last, db); 3514 if (t != first+1) 3515 { 3516 if (db.Names.empty()) 3517 return first; 3518 db.Names.back() = db.make<PostfixQualifiedType>( 3519 db.Names.back(), " imaginary"); 3520 first = t; 3521 db.Subs.pushSubstitution(db.Names.back()); 3522 } 3523 break; 3524 case 'M': 3525 t = parse_pointer_to_member_type(first, last, db); 3526 if (t != first) 3527 { 3528 if (db.Names.empty()) 3529 return first; 3530 first = t; 3531 db.Subs.pushSubstitution(db.Names.back()); 3532 } 3533 break; 3534 case 'O': 3535 { 3536 size_t k0 = db.Names.size(); 3537 t = parse_type(first+1, last, db); 3538 size_t k1 = db.Names.size(); 3539 if (t != first+1) 3540 { 3541 db.Subs.pushPack(); 3542 for (size_t k = k0; k < k1; ++k) 3543 { 3544 db.Names[k] = 3545 db.make<RValueReferenceType>(db.Names[k]); 3546 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3547 } 3548 first = t; 3549 } 3550 break; 3551 } 3552 case 'P': 3553 { 3554 size_t k0 = db.Names.size(); 3555 t = parse_type(first+1, last, db); 3556 size_t k1 = db.Names.size(); 3557 if (t != first+1) 3558 { 3559 db.Subs.pushPack(); 3560 for (size_t k = k0; k < k1; ++k) 3561 { 3562 db.Names[k] = db.make<PointerType>(db.Names[k]); 3563 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3564 } 3565 first = t; 3566 } 3567 break; 3568 } 3569 case 'R': 3570 { 3571 size_t k0 = db.Names.size(); 3572 t = parse_type(first+1, last, db); 3573 size_t k1 = db.Names.size(); 3574 if (t != first+1) 3575 { 3576 db.Subs.pushPack(); 3577 for (size_t k = k0; k < k1; ++k) 3578 { 3579 db.Names[k] = 3580 db.make<LValueReferenceType>(db.Names[k]); 3581 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3582 } 3583 first = t; 3584 } 3585 break; 3586 } 3587 case 'T': 3588 { 3589 size_t k0 = db.Names.size(); 3590 t = parse_template_param(first, last, db); 3591 size_t k1 = db.Names.size(); 3592 if (t != first) 3593 { 3594 db.Subs.pushPack(); 3595 for (size_t k = k0; k < k1; ++k) 3596 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3597 if (db.TryToParseTemplateArgs && k1 == k0+1) 3598 { 3599 const char* t1 = parse_template_args(t, last, db); 3600 if (t1 != t) 3601 { 3602 auto args = db.Names.back(); 3603 db.Names.pop_back(); 3604 db.Names.back() = db.make< 3605 NameWithTemplateArgs>( 3606 db.Names.back(), args); 3607 db.Subs.pushSubstitution(db.Names.back()); 3608 t = t1; 3609 } 3610 } 3611 first = t; 3612 } 3613 break; 3614 } 3615 case 'U': 3616 if (first+1 != last) 3617 { 3618 t = parse_source_name(first+1, last, db); 3619 if (t != first+1) 3620 { 3621 const char* t2 = parse_type(t, last, db); 3622 if (t2 != t) 3623 { 3624 if (db.Names.size() < 2) 3625 return first; 3626 auto type = db.Names.back(); 3627 db.Names.pop_back(); 3628 if (db.Names.back()->K != Node::KNameType || 3629 !static_cast<NameType*>(db.Names.back())->getName().startsWith("objcproto")) 3630 { 3631 db.Names.back() = db.make<VendorExtQualType>(type, db.Names.back()); 3632 } 3633 else 3634 { 3635 auto* proto = static_cast<NameType*>(db.Names.back()); 3636 db.Names.pop_back(); 3637 t = parse_source_name(proto->getName().begin() + 9, proto->getName().end(), db); 3638 if (t != proto->getName().begin() + 9) 3639 { 3640 db.Names.back() = db.make<ObjCProtoName>(type, db.Names.back()); 3641 } 3642 else 3643 { 3644 db.Names.push_back(db.make<VendorExtQualType>(type, proto)); 3645 } 3646 } 3647 db.Subs.pushSubstitution(db.Names.back()); 3648 first = t2; 3649 } 3650 } 3651 } 3652 break; 3653 case 'S': 3654 if (first+1 != last && first[1] == 't') 3655 { 3656 t = parse_name(first, last, db); 3657 if (t != first) 3658 { 3659 if (db.Names.empty()) 3660 return first; 3661 db.Subs.pushSubstitution(db.Names.back()); 3662 first = t; 3663 } 3664 } 3665 else 3666 { 3667 t = parse_substitution(first, last, db); 3668 if (t != first) 3669 { 3670 first = t; 3671 // Parsed a substitution. If the substitution is a 3672 // <template-param> it might be followed by <template-args>. 3673 if (db.TryToParseTemplateArgs) 3674 { 3675 t = parse_template_args(first, last, db); 3676 if (t != first) 3677 { 3678 if (db.Names.size() < 2) 3679 return first; 3680 auto template_args = db.Names.back(); 3681 db.Names.pop_back(); 3682 db.Names.back() = db.make< 3683 NameWithTemplateArgs>( 3684 db.Names.back(), template_args); 3685 // Need to create substitution for <template-template-param> <template-args> 3686 db.Subs.pushSubstitution(db.Names.back()); 3687 first = t; 3688 } 3689 } 3690 } 3691 } 3692 break; 3693 case 'D': 3694 if (first+1 != last) 3695 { 3696 switch (first[1]) 3697 { 3698 case 'p': 3699 { 3700 size_t k0 = db.Names.size(); 3701 t = parse_type(first+2, last, db); 3702 size_t k1 = db.Names.size(); 3703 if (t != first+2) 3704 { 3705 db.Subs.pushPack(); 3706 for (size_t k = k0; k < k1; ++k) 3707 db.Subs.pushSubstitutionIntoPack(db.Names[k]); 3708 first = t; 3709 return first; 3710 } 3711 break; 3712 } 3713 case 't': 3714 case 'T': 3715 t = parse_decltype(first, last, db); 3716 if (t != first) 3717 { 3718 if (db.Names.empty()) 3719 return first; 3720 db.Subs.pushSubstitution(db.Names.back()); 3721 first = t; 3722 return first; 3723 } 3724 break; 3725 case 'v': 3726 t = parse_vector_type(first, last, db); 3727 if (t != first) 3728 { 3729 if (db.Names.empty()) 3730 return first; 3731 db.Subs.pushSubstitution(db.Names.back()); 3732 first = t; 3733 return first; 3734 } 3735 break; 3736 } 3737 } 3738 _LIBCPP_FALLTHROUGH(); 3739 default: 3740 // must check for builtin-types before class-enum-types to avoid 3741 // ambiguities with operator-names 3742 t = parse_builtin_type(first, last, db); 3743 if (t != first) 3744 { 3745 first = t; 3746 } 3747 else 3748 { 3749 t = parse_name(first, last, db); 3750 if (t != first) 3751 { 3752 if (db.Names.empty()) 3753 return first; 3754 db.Subs.pushSubstitution(db.Names.back()); 3755 first = t; 3756 } 3757 } 3758 break; 3759 } 3760 } 3761 break; 3762 } 3763 } 3764 } 3765 return first; 3766 } 3767 3768 // <operator-name> 3769 // ::= aa # && 3770 // ::= ad # & (unary) 3771 // ::= an # & 3772 // ::= aN # &= 3773 // ::= aS # = 3774 // ::= cl # () 3775 // ::= cm # , 3776 // ::= co # ~ 3777 // ::= cv <type> # (cast) 3778 // ::= da # delete[] 3779 // ::= de # * (unary) 3780 // ::= dl # delete 3781 // ::= dv # / 3782 // ::= dV # /= 3783 // ::= eo # ^ 3784 // ::= eO # ^= 3785 // ::= eq # == 3786 // ::= ge # >= 3787 // ::= gt # > 3788 // ::= ix # [] 3789 // ::= le # <= 3790 // ::= li <source-name> # operator "" 3791 // ::= ls # << 3792 // ::= lS # <<= 3793 // ::= lt # < 3794 // ::= mi # - 3795 // ::= mI # -= 3796 // ::= ml # * 3797 // ::= mL # *= 3798 // ::= mm # -- (postfix in <expression> context) 3799 // ::= na # new[] 3800 // ::= ne # != 3801 // ::= ng # - (unary) 3802 // ::= nt # ! 3803 // ::= nw # new 3804 // ::= oo # || 3805 // ::= or # | 3806 // ::= oR # |= 3807 // ::= pm # ->* 3808 // ::= pl # + 3809 // ::= pL # += 3810 // ::= pp # ++ (postfix in <expression> context) 3811 // ::= ps # + (unary) 3812 // ::= pt # -> 3813 // ::= qu # ? 3814 // ::= rm # % 3815 // ::= rM # %= 3816 // ::= rs # >> 3817 // ::= rS # >>= 3818 // ::= v <digit> <source-name> # vendor extended operator 3819 // extension ::= <operator-name> <abi-tag-seq> 3820 const char* 3821 parse_operator_name(const char* first, const char* last, Db& db) 3822 { 3823 const char* original_first = first; 3824 if (last - first >= 2) 3825 { 3826 switch (first[0]) 3827 { 3828 case 'a': 3829 switch (first[1]) 3830 { 3831 case 'a': 3832 db.Names.push_back(db.make<NameType>("operator&&")); 3833 first += 2; 3834 break; 3835 case 'd': 3836 case 'n': 3837 db.Names.push_back(db.make<NameType>("operator&")); 3838 first += 2; 3839 break; 3840 case 'N': 3841 db.Names.push_back(db.make<NameType>("operator&=")); 3842 first += 2; 3843 break; 3844 case 'S': 3845 db.Names.push_back(db.make<NameType>("operator=")); 3846 first += 2; 3847 break; 3848 } 3849 break; 3850 case 'c': 3851 switch (first[1]) 3852 { 3853 case 'l': 3854 db.Names.push_back(db.make<NameType>("operator()")); 3855 first += 2; 3856 break; 3857 case 'm': 3858 db.Names.push_back(db.make<NameType>("operator,")); 3859 first += 2; 3860 break; 3861 case 'o': 3862 db.Names.push_back(db.make<NameType>("operator~")); 3863 first += 2; 3864 break; 3865 case 'v': 3866 { 3867 bool TryToParseTemplateArgs = db.TryToParseTemplateArgs; 3868 db.TryToParseTemplateArgs = false; 3869 const char* t = parse_type(first+2, last, db); 3870 db.TryToParseTemplateArgs = TryToParseTemplateArgs; 3871 if (t != first+2) 3872 { 3873 if (db.Names.empty()) 3874 return first; 3875 db.Names.back() = 3876 db.make<ConversionOperatorType>(db.Names.back()); 3877 db.ParsedCtorDtorCV = true; 3878 first = t; 3879 } 3880 } 3881 break; 3882 } 3883 break; 3884 case 'd': 3885 switch (first[1]) 3886 { 3887 case 'a': 3888 db.Names.push_back(db.make<NameType>("operator delete[]")); 3889 first += 2; 3890 break; 3891 case 'e': 3892 db.Names.push_back(db.make<NameType>("operator*")); 3893 first += 2; 3894 break; 3895 case 'l': 3896 db.Names.push_back(db.make<NameType>("operator delete")); 3897 first += 2; 3898 break; 3899 case 'v': 3900 db.Names.push_back(db.make<NameType>("operator/")); 3901 first += 2; 3902 break; 3903 case 'V': 3904 db.Names.push_back(db.make<NameType>("operator/=")); 3905 first += 2; 3906 break; 3907 } 3908 break; 3909 case 'e': 3910 switch (first[1]) 3911 { 3912 case 'o': 3913 db.Names.push_back(db.make<NameType>("operator^")); 3914 first += 2; 3915 break; 3916 case 'O': 3917 db.Names.push_back(db.make<NameType>("operator^=")); 3918 first += 2; 3919 break; 3920 case 'q': 3921 db.Names.push_back(db.make<NameType>("operator==")); 3922 first += 2; 3923 break; 3924 } 3925 break; 3926 case 'g': 3927 switch (first[1]) 3928 { 3929 case 'e': 3930 db.Names.push_back(db.make<NameType>("operator>=")); 3931 first += 2; 3932 break; 3933 case 't': 3934 db.Names.push_back(db.make<NameType>("operator>")); 3935 first += 2; 3936 break; 3937 } 3938 break; 3939 case 'i': 3940 if (first[1] == 'x') 3941 { 3942 db.Names.push_back(db.make<NameType>("operator[]")); 3943 first += 2; 3944 } 3945 break; 3946 case 'l': 3947 switch (first[1]) 3948 { 3949 case 'e': 3950 db.Names.push_back(db.make<NameType>("operator<=")); 3951 first += 2; 3952 break; 3953 case 'i': 3954 { 3955 const char* t = parse_source_name(first+2, last, db); 3956 if (t != first+2) 3957 { 3958 if (db.Names.empty()) 3959 return first; 3960 db.Names.back() = 3961 db.make<LiteralOperator>(db.Names.back()); 3962 first = t; 3963 } 3964 } 3965 break; 3966 case 's': 3967 db.Names.push_back(db.make<NameType>("operator<<")); 3968 first += 2; 3969 break; 3970 case 'S': 3971 db.Names.push_back(db.make<NameType>("operator<<=")); 3972 first += 2; 3973 break; 3974 case 't': 3975 db.Names.push_back(db.make<NameType>("operator<")); 3976 first += 2; 3977 break; 3978 } 3979 break; 3980 case 'm': 3981 switch (first[1]) 3982 { 3983 case 'i': 3984 db.Names.push_back(db.make<NameType>("operator-")); 3985 first += 2; 3986 break; 3987 case 'I': 3988 db.Names.push_back(db.make<NameType>("operator-=")); 3989 first += 2; 3990 break; 3991 case 'l': 3992 db.Names.push_back(db.make<NameType>("operator*")); 3993 first += 2; 3994 break; 3995 case 'L': 3996 db.Names.push_back(db.make<NameType>("operator*=")); 3997 first += 2; 3998 break; 3999 case 'm': 4000 db.Names.push_back(db.make<NameType>("operator--")); 4001 first += 2; 4002 break; 4003 } 4004 break; 4005 case 'n': 4006 switch (first[1]) 4007 { 4008 case 'a': 4009 db.Names.push_back(db.make<NameType>("operator new[]")); 4010 first += 2; 4011 break; 4012 case 'e': 4013 db.Names.push_back(db.make<NameType>("operator!=")); 4014 first += 2; 4015 break; 4016 case 'g': 4017 db.Names.push_back(db.make<NameType>("operator-")); 4018 first += 2; 4019 break; 4020 case 't': 4021 db.Names.push_back(db.make<NameType>("operator!")); 4022 first += 2; 4023 break; 4024 case 'w': 4025 db.Names.push_back(db.make<NameType>("operator new")); 4026 first += 2; 4027 break; 4028 } 4029 break; 4030 case 'o': 4031 switch (first[1]) 4032 { 4033 case 'o': 4034 db.Names.push_back(db.make<NameType>("operator||")); 4035 first += 2; 4036 break; 4037 case 'r': 4038 db.Names.push_back(db.make<NameType>("operator|")); 4039 first += 2; 4040 break; 4041 case 'R': 4042 db.Names.push_back(db.make<NameType>("operator|=")); 4043 first += 2; 4044 break; 4045 } 4046 break; 4047 case 'p': 4048 switch (first[1]) 4049 { 4050 case 'm': 4051 db.Names.push_back(db.make<NameType>("operator->*")); 4052 first += 2; 4053 break; 4054 case 'l': 4055 db.Names.push_back(db.make<NameType>("operator+")); 4056 first += 2; 4057 break; 4058 case 'L': 4059 db.Names.push_back(db.make<NameType>("operator+=")); 4060 first += 2; 4061 break; 4062 case 'p': 4063 db.Names.push_back(db.make<NameType>("operator++")); 4064 first += 2; 4065 break; 4066 case 's': 4067 db.Names.push_back(db.make<NameType>("operator+")); 4068 first += 2; 4069 break; 4070 case 't': 4071 db.Names.push_back(db.make<NameType>("operator->")); 4072 first += 2; 4073 break; 4074 } 4075 break; 4076 case 'q': 4077 if (first[1] == 'u') 4078 { 4079 db.Names.push_back(db.make<NameType>("operator?")); 4080 first += 2; 4081 } 4082 break; 4083 case 'r': 4084 switch (first[1]) 4085 { 4086 case 'm': 4087 db.Names.push_back(db.make<NameType>("operator%")); 4088 first += 2; 4089 break; 4090 case 'M': 4091 db.Names.push_back(db.make<NameType>("operator%=")); 4092 first += 2; 4093 break; 4094 case 's': 4095 db.Names.push_back(db.make<NameType>("operator>>")); 4096 first += 2; 4097 break; 4098 case 'S': 4099 db.Names.push_back(db.make<NameType>("operator>>=")); 4100 first += 2; 4101 break; 4102 } 4103 break; 4104 case 'v': 4105 if (std::isdigit(first[1])) 4106 { 4107 const char* t = parse_source_name(first+2, last, db); 4108 if (t != first+2) 4109 { 4110 if (db.Names.empty()) 4111 return first; 4112 db.Names.back() = 4113 db.make<ConversionOperatorType>(db.Names.back()); 4114 first = t; 4115 } 4116 } 4117 break; 4118 } 4119 } 4120 4121 if (original_first != first) 4122 first = parse_abi_tag_seq(first, last, db); 4123 4124 return first; 4125 } 4126 4127 const char* 4128 parse_integer_literal(const char* first, const char* last, StringView lit, Db& db) 4129 { 4130 const char* t = parse_number(first, last); 4131 if (t != first && t != last && *t == 'E') 4132 { 4133 db.Names.push_back( 4134 db.make<IntegerExpr>(lit, StringView(first, t))); 4135 first = t+1; 4136 } 4137 return first; 4138 } 4139 4140 // <expr-primary> ::= L <type> <value number> E # integer literal 4141 // ::= L <type> <value float> E # floating literal 4142 // ::= L <string type> E # string literal 4143 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") 4144 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) 4145 // ::= L <mangled-name> E # external name 4146 4147 const char* 4148 parse_expr_primary(const char* first, const char* last, Db& db) 4149 { 4150 if (last - first >= 4 && *first == 'L') 4151 { 4152 switch (first[1]) 4153 { 4154 case 'w': 4155 { 4156 const char* t = parse_integer_literal(first+2, last, "wchar_t", db); 4157 if (t != first+2) 4158 first = t; 4159 } 4160 break; 4161 case 'b': 4162 if (first[3] == 'E') 4163 { 4164 switch (first[2]) 4165 { 4166 case '0': 4167 db.Names.push_back(db.make<BoolExpr>(0)); 4168 first += 4; 4169 break; 4170 case '1': 4171 db.Names.push_back(db.make<BoolExpr>(1)); 4172 first += 4; 4173 break; 4174 } 4175 } 4176 break; 4177 case 'c': 4178 { 4179 const char* t = parse_integer_literal(first+2, last, "char", db); 4180 if (t != first+2) 4181 first = t; 4182 } 4183 break; 4184 case 'a': 4185 { 4186 const char* t = parse_integer_literal(first+2, last, "signed char", db); 4187 if (t != first+2) 4188 first = t; 4189 } 4190 break; 4191 case 'h': 4192 { 4193 const char* t = parse_integer_literal(first+2, last, "unsigned char", db); 4194 if (t != first+2) 4195 first = t; 4196 } 4197 break; 4198 case 's': 4199 { 4200 const char* t = parse_integer_literal(first+2, last, "short", db); 4201 if (t != first+2) 4202 first = t; 4203 } 4204 break; 4205 case 't': 4206 { 4207 const char* t = parse_integer_literal(first+2, last, "unsigned short", db); 4208 if (t != first+2) 4209 first = t; 4210 } 4211 break; 4212 case 'i': 4213 { 4214 const char* t = parse_integer_literal(first+2, last, "", db); 4215 if (t != first+2) 4216 first = t; 4217 } 4218 break; 4219 case 'j': 4220 { 4221 const char* t = parse_integer_literal(first+2, last, "u", db); 4222 if (t != first+2) 4223 first = t; 4224 } 4225 break; 4226 case 'l': 4227 { 4228 const char* t = parse_integer_literal(first+2, last, "l", db); 4229 if (t != first+2) 4230 first = t; 4231 } 4232 break; 4233 case 'm': 4234 { 4235 const char* t = parse_integer_literal(first+2, last, "ul", db); 4236 if (t != first+2) 4237 first = t; 4238 } 4239 break; 4240 case 'x': 4241 { 4242 const char* t = parse_integer_literal(first+2, last, "ll", db); 4243 if (t != first+2) 4244 first = t; 4245 } 4246 break; 4247 case 'y': 4248 { 4249 const char* t = parse_integer_literal(first+2, last, "ull", db); 4250 if (t != first+2) 4251 first = t; 4252 } 4253 break; 4254 case 'n': 4255 { 4256 const char* t = parse_integer_literal(first+2, last, "__int128", db); 4257 if (t != first+2) 4258 first = t; 4259 } 4260 break; 4261 case 'o': 4262 { 4263 const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db); 4264 if (t != first+2) 4265 first = t; 4266 } 4267 break; 4268 case 'f': 4269 { 4270 const char* t = parse_floating_number<float>(first+2, last, db); 4271 if (t != first+2) 4272 first = t; 4273 } 4274 break; 4275 case 'd': 4276 { 4277 const char* t = parse_floating_number<double>(first+2, last, db); 4278 if (t != first+2) 4279 first = t; 4280 } 4281 break; 4282 case 'e': 4283 { 4284 const char* t = parse_floating_number<long double>(first+2, last, db); 4285 if (t != first+2) 4286 first = t; 4287 } 4288 break; 4289 case '_': 4290 if (first[2] == 'Z') 4291 { 4292 const char* t = parse_encoding(first+3, last, db); 4293 if (t != first+3 && t != last && *t == 'E') 4294 first = t+1; 4295 } 4296 break; 4297 case 'T': 4298 // Invalid mangled name per 4299 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html 4300 break; 4301 default: 4302 { 4303 // might be named type 4304 const char* t = parse_type(first+1, last, db); 4305 if (t != first+1 && t != last) 4306 { 4307 if (*t != 'E') 4308 { 4309 const char* n = t; 4310 for (; n != last && isdigit(*n); ++n) 4311 ; 4312 if (n != t && n != last && *n == 'E') 4313 { 4314 if (db.Names.empty()) 4315 return first; 4316 db.Names.back() = db.make<IntegerCastExpr>( 4317 db.Names.back(), StringView(t, n)); 4318 first = n+1; 4319 break; 4320 } 4321 } 4322 else 4323 { 4324 first = t+1; 4325 break; 4326 } 4327 } 4328 } 4329 } 4330 } 4331 return first; 4332 } 4333 4334 Node* maybe_change_special_sub_name(Node* inp, Db& db) 4335 { 4336 if (inp->K != Node::KSpecialSubstitution) 4337 return inp; 4338 auto Kind = static_cast<SpecialSubstitution*>(inp)->SSK; 4339 switch (Kind) 4340 { 4341 case SpecialSubKind::string: 4342 case SpecialSubKind::istream: 4343 case SpecialSubKind::ostream: 4344 case SpecialSubKind::iostream: 4345 return db.make<ExpandedSpecialSubstitution>(Kind); 4346 default: 4347 break; 4348 } 4349 return inp; 4350 } 4351 4352 // <ctor-dtor-name> ::= C1 # complete object constructor 4353 // ::= C2 # base object constructor 4354 // ::= C3 # complete object allocating constructor 4355 // extension ::= C5 # ? 4356 // ::= D0 # deleting destructor 4357 // ::= D1 # complete object destructor 4358 // ::= D2 # base object destructor 4359 // extension ::= D5 # ? 4360 // extension ::= <ctor-dtor-name> <abi-tag-seq> 4361 const char* 4362 parse_ctor_dtor_name(const char* first, const char* last, Db& db) 4363 { 4364 if (last-first >= 2 && !db.Names.empty()) 4365 { 4366 switch (first[0]) 4367 { 4368 case 'C': 4369 switch (first[1]) 4370 { 4371 case '1': 4372 case '2': 4373 case '3': 4374 case '5': 4375 if (db.Names.empty()) 4376 return first; 4377 db.Names.back() = 4378 maybe_change_special_sub_name(db.Names.back(), db); 4379 db.Names.push_back( 4380 db.make<CtorDtorName>(db.Names.back(), false)); 4381 first += 2; 4382 first = parse_abi_tag_seq(first, last, db); 4383 db.ParsedCtorDtorCV = true; 4384 break; 4385 } 4386 break; 4387 case 'D': 4388 switch (first[1]) 4389 { 4390 case '0': 4391 case '1': 4392 case '2': 4393 case '5': 4394 if (db.Names.empty()) 4395 return first; 4396 db.Names.push_back( 4397 db.make<CtorDtorName>(db.Names.back(), true)); 4398 first += 2; 4399 first = parse_abi_tag_seq(first, last, db); 4400 db.ParsedCtorDtorCV = true; 4401 break; 4402 } 4403 break; 4404 } 4405 } 4406 return first; 4407 } 4408 4409 // <unnamed-type-name> ::= Ut [<nonnegative number>] _ [<abi-tag-seq>] 4410 // ::= <closure-type-name> 4411 // 4412 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ 4413 // 4414 // <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters 4415 const char* 4416 parse_unnamed_type_name(const char* first, const char* last, Db& db) 4417 { 4418 if (last - first > 2 && first[0] == 'U') 4419 { 4420 char type = first[1]; 4421 switch (type) 4422 { 4423 case 't': 4424 { 4425 const char* t0 = first+2; 4426 if (t0 == last) 4427 return first; 4428 StringView count; 4429 if (std::isdigit(*t0)) 4430 { 4431 const char* t1 = t0 + 1; 4432 while (t1 != last && std::isdigit(*t1)) 4433 ++t1; 4434 count = StringView(t0, t1); 4435 t0 = t1; 4436 } 4437 if (t0 == last || *t0 != '_') 4438 return first; 4439 db.Names.push_back(db.make<UnnamedTypeName>(count)); 4440 first = t0 + 1; 4441 first = parse_abi_tag_seq(first, last, db); 4442 } 4443 break; 4444 case 'l': 4445 { 4446 size_t begin_pos = db.Names.size(); 4447 const char* t0 = first+2; 4448 NodeArray lambda_params; 4449 if (first[2] == 'v') 4450 { 4451 ++t0; 4452 } 4453 else 4454 { 4455 while (true) 4456 { 4457 const char* t1 = parse_type(t0, last, db); 4458 if (t1 == t0) 4459 break; 4460 t0 = t1; 4461 } 4462 if (db.Names.size() < begin_pos) 4463 return first; 4464 lambda_params = db.popTrailingNodeArray(begin_pos); 4465 } 4466 if (t0 == last || *t0 != 'E') 4467 return first; 4468 ++t0; 4469 if (t0 == last) 4470 return first; 4471 StringView count; 4472 if (std::isdigit(*t0)) 4473 { 4474 const char* t1 = t0 + 1; 4475 while (t1 != last && std::isdigit(*t1)) 4476 ++t1; 4477 count = StringView(t0, t1); 4478 t0 = t1; 4479 } 4480 if (t0 == last || *t0 != '_') 4481 return first; 4482 db.Names.push_back(db.make<LambdaTypeName>(lambda_params, count)); 4483 first = t0 + 1; 4484 } 4485 break; 4486 } 4487 } 4488 return first; 4489 } 4490 4491 // <unqualified-name> ::= <operator-name> 4492 // ::= <ctor-dtor-name> 4493 // ::= <source-name> 4494 // ::= <unnamed-type-name> 4495 4496 const char* 4497 parse_unqualified_name(const char* first, const char* last, Db& db) 4498 { 4499 if (first != last) 4500 { 4501 const char* t; 4502 switch (*first) 4503 { 4504 case 'C': 4505 case 'D': 4506 t = parse_ctor_dtor_name(first, last, db); 4507 if (t != first) 4508 first = t; 4509 break; 4510 case 'U': 4511 t = parse_unnamed_type_name(first, last, db); 4512 if (t != first) 4513 first = t; 4514 break; 4515 case '1': 4516 case '2': 4517 case '3': 4518 case '4': 4519 case '5': 4520 case '6': 4521 case '7': 4522 case '8': 4523 case '9': 4524 t = parse_source_name(first, last, db); 4525 if (t != first) 4526 first = t; 4527 break; 4528 default: 4529 t = parse_operator_name(first, last, db); 4530 if (t != first) 4531 first = t; 4532 break; 4533 }; 4534 } 4535 return first; 4536 } 4537 4538 // <unscoped-name> ::= <unqualified-name> 4539 // ::= St <unqualified-name> # ::std:: 4540 // extension ::= StL<unqualified-name> 4541 4542 const char* 4543 parse_unscoped_name(const char* first, const char* last, Db& db) 4544 { 4545 if (last - first >= 2) 4546 { 4547 const char* t0 = first; 4548 bool St = false; 4549 if (first[0] == 'S' && first[1] == 't') 4550 { 4551 t0 += 2; 4552 St = true; 4553 if (t0 != last && *t0 == 'L') 4554 ++t0; 4555 } 4556 const char* t1 = parse_unqualified_name(t0, last, db); 4557 if (t1 != t0) 4558 { 4559 if (St) 4560 { 4561 if (db.Names.empty()) 4562 return first; 4563 db.Names.back() = 4564 db.make<StdQualifiedName>(db.Names.back()); 4565 } 4566 first = t1; 4567 } 4568 } 4569 return first; 4570 } 4571 4572 // at <type> # alignof (a type) 4573 4574 const char* 4575 parse_alignof_type(const char* first, const char* last, Db& db) 4576 { 4577 if (last - first >= 3 && first[0] == 'a' && first[1] == 't') 4578 { 4579 const char* t = parse_type(first+2, last, db); 4580 if (t != first+2) 4581 { 4582 if (db.Names.empty()) 4583 return first; 4584 db.Names.back() = 4585 db.make<EnclosingExpr>("alignof (", db.Names.back(), ")"); 4586 first = t; 4587 } 4588 } 4589 return first; 4590 } 4591 4592 // az <expression> # alignof (a expression) 4593 4594 const char* 4595 parse_alignof_expr(const char* first, const char* last, Db& db) 4596 { 4597 if (last - first >= 3 && first[0] == 'a' && first[1] == 'z') 4598 { 4599 const char* t = parse_expression(first+2, last, db); 4600 if (t != first+2) 4601 { 4602 if (db.Names.empty()) 4603 return first; 4604 db.Names.back() = 4605 db.make<EnclosingExpr>("alignof (", db.Names.back(), ")"); 4606 first = t; 4607 } 4608 } 4609 return first; 4610 } 4611 4612 const char* 4613 parse_noexcept_expression(const char* first, const char* last, Db& db) 4614 { 4615 const char* t1 = parse_expression(first, last, db); 4616 if (t1 != first) 4617 { 4618 if (db.Names.empty()) 4619 return first; 4620 db.Names.back() = 4621 db.make<EnclosingExpr>("noexcept (", db.Names.back(), ")"); 4622 first = t1; 4623 } 4624 return first; 4625 } 4626 4627 const char* 4628 parse_prefix_expression(const char* first, const char* last, StringView op, Db& db) 4629 { 4630 const char* t1 = parse_expression(first, last, db); 4631 if (t1 != first) 4632 { 4633 if (db.Names.empty()) 4634 return first; 4635 db.Names.back() = db.make<PrefixExpr>(op, db.Names.back()); 4636 first = t1; 4637 } 4638 return first; 4639 } 4640 4641 const char* 4642 parse_binary_expression(const char* first, const char* last, StringView op, Db& db) 4643 { 4644 const char* t1 = parse_expression(first, last, db); 4645 if (t1 != first) 4646 { 4647 const char* t2 = parse_expression(t1, last, db); 4648 if (t2 != t1) 4649 { 4650 if (db.Names.size() < 2) 4651 return first; 4652 auto op2 = db.Names.back(); 4653 db.Names.pop_back(); 4654 auto op1 = db.Names.back(); 4655 db.Names.back() = db.make<BinaryExpr>(op1, op, op2); 4656 first = t2; 4657 } 4658 } 4659 return first; 4660 } 4661 4662 // <expression> ::= <unary operator-name> <expression> 4663 // ::= <binary operator-name> <expression> <expression> 4664 // ::= <ternary operator-name> <expression> <expression> <expression> 4665 // ::= cl <expression>+ E # call 4666 // ::= cv <type> <expression> # conversion with one argument 4667 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments 4668 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type 4669 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 4670 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type 4671 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 4672 // ::= [gs] dl <expression> # delete expression 4673 // ::= [gs] da <expression> # delete[] expression 4674 // ::= pp_ <expression> # prefix ++ 4675 // ::= mm_ <expression> # prefix -- 4676 // ::= ti <type> # typeid (type) 4677 // ::= te <expression> # typeid (expression) 4678 // ::= dc <type> <expression> # dynamic_cast<type> (expression) 4679 // ::= sc <type> <expression> # static_cast<type> (expression) 4680 // ::= cc <type> <expression> # const_cast<type> (expression) 4681 // ::= rc <type> <expression> # reinterpret_cast<type> (expression) 4682 // ::= st <type> # sizeof (a type) 4683 // ::= sz <expression> # sizeof (an expression) 4684 // ::= at <type> # alignof (a type) 4685 // ::= az <expression> # alignof (an expression) 4686 // ::= nx <expression> # noexcept (expression) 4687 // ::= <template-param> 4688 // ::= <function-param> 4689 // ::= dt <expression> <unresolved-name> # expr.name 4690 // ::= pt <expression> <unresolved-name> # expr->name 4691 // ::= ds <expression> <expression> # expr.*expr 4692 // ::= sZ <template-param> # size of a parameter pack 4693 // ::= sZ <function-param> # size of a function parameter pack 4694 // ::= sp <expression> # pack expansion 4695 // ::= tw <expression> # throw expression 4696 // ::= tr # throw with no operand (rethrow) 4697 // ::= <unresolved-name> # f(p), N::f(p), ::f(p), 4698 // # freestanding dependent name (e.g., T::x), 4699 // # objectless nonstatic member reference 4700 // ::= <expr-primary> 4701 4702 const char* 4703 parse_expression(const char* first, const char* last, Db& db) 4704 { 4705 if (last - first >= 2) 4706 { 4707 const char* t = first; 4708 bool parsed_gs = false; 4709 if (last - first >= 4 && t[0] == 'g' && t[1] == 's') 4710 { 4711 t += 2; 4712 parsed_gs = true; 4713 } 4714 switch (*t) 4715 { 4716 case 'L': 4717 first = parse_expr_primary(first, last, db); 4718 break; 4719 case 'T': 4720 first = parse_template_param(first, last, db); 4721 break; 4722 case 'f': 4723 first = parse_function_param(first, last, db); 4724 break; 4725 case 'a': 4726 switch (t[1]) 4727 { 4728 case 'a': 4729 t = parse_binary_expression(first+2, last, "&&", db); 4730 if (t != first+2) 4731 first = t; 4732 break; 4733 case 'd': 4734 t = parse_prefix_expression(first+2, last, "&", db); 4735 if (t != first+2) 4736 first = t; 4737 break; 4738 case 'n': 4739 t = parse_binary_expression(first+2, last, "&", db); 4740 if (t != first+2) 4741 first = t; 4742 break; 4743 case 'N': 4744 t = parse_binary_expression(first+2, last, "&=", db); 4745 if (t != first+2) 4746 first = t; 4747 break; 4748 case 'S': 4749 t = parse_binary_expression(first+2, last, "=", db); 4750 if (t != first+2) 4751 first = t; 4752 break; 4753 case 't': 4754 first = parse_alignof_type(first, last, db); 4755 break; 4756 case 'z': 4757 first = parse_alignof_expr(first, last, db); 4758 break; 4759 } 4760 break; 4761 case 'c': 4762 switch (t[1]) 4763 { 4764 case 'c': 4765 first = parse_const_cast_expr(first, last, db); 4766 break; 4767 case 'l': 4768 first = parse_call_expr(first, last, db); 4769 break; 4770 case 'm': 4771 t = parse_binary_expression(first+2, last, ",", db); 4772 if (t != first+2) 4773 first = t; 4774 break; 4775 case 'o': 4776 t = parse_prefix_expression(first+2, last, "~", db); 4777 if (t != first+2) 4778 first = t; 4779 break; 4780 case 'v': 4781 first = parse_conversion_expr(first, last, db); 4782 break; 4783 } 4784 break; 4785 case 'd': 4786 switch (t[1]) 4787 { 4788 case 'a': 4789 { 4790 const char* t1 = parse_expression(t+2, last, db); 4791 if (t1 != t+2) 4792 { 4793 if (db.Names.empty()) 4794 return first; 4795 db.Names.back() = db.make<DeleteExpr>( 4796 db.Names.back(), parsed_gs, /*is_array=*/true); 4797 first = t1; 4798 } 4799 } 4800 break; 4801 case 'c': 4802 first = parse_dynamic_cast_expr(first, last, db); 4803 break; 4804 case 'e': 4805 t = parse_prefix_expression(first+2, last, "*", db); 4806 if (t != first+2) 4807 first = t; 4808 break; 4809 case 'l': 4810 { 4811 const char* t1 = parse_expression(t+2, last, db); 4812 if (t1 != t+2) 4813 { 4814 if (db.Names.empty()) 4815 return first; 4816 db.Names.back() = db.make<DeleteExpr>( 4817 db.Names.back(), parsed_gs, /*is_array=*/false); 4818 first = t1; 4819 } 4820 } 4821 break; 4822 case 'n': 4823 return parse_unresolved_name(first, last, db); 4824 case 's': 4825 first = parse_dot_star_expr(first, last, db); 4826 break; 4827 case 't': 4828 first = parse_dot_expr(first, last, db); 4829 break; 4830 case 'v': 4831 t = parse_binary_expression(first+2, last, "/", db); 4832 if (t != first+2) 4833 first = t; 4834 break; 4835 case 'V': 4836 t = parse_binary_expression(first+2, last, "/=", db); 4837 if (t != first+2) 4838 first = t; 4839 break; 4840 } 4841 break; 4842 case 'e': 4843 switch (t[1]) 4844 { 4845 case 'o': 4846 t = parse_binary_expression(first+2, last, "^", db); 4847 if (t != first+2) 4848 first = t; 4849 break; 4850 case 'O': 4851 t = parse_binary_expression(first+2, last, "^=", db); 4852 if (t != first+2) 4853 first = t; 4854 break; 4855 case 'q': 4856 t = parse_binary_expression(first+2, last, "==", db); 4857 if (t != first+2) 4858 first = t; 4859 break; 4860 } 4861 break; 4862 case 'g': 4863 switch (t[1]) 4864 { 4865 case 'e': 4866 t = parse_binary_expression(first+2, last, ">=", db); 4867 if (t != first+2) 4868 first = t; 4869 break; 4870 case 't': 4871 t = parse_binary_expression(first+2, last, ">", db); 4872 if (t != first+2) 4873 first = t; 4874 break; 4875 } 4876 break; 4877 case 'i': 4878 if (t[1] == 'x') 4879 { 4880 const char* t1 = parse_expression(first+2, last, db); 4881 if (t1 != first+2) 4882 { 4883 const char* t2 = parse_expression(t1, last, db); 4884 if (t2 != t1) 4885 { 4886 if (db.Names.size() < 2) 4887 return first; 4888 auto op2 = db.Names.back(); 4889 db.Names.pop_back(); 4890 auto op1 = db.Names.back(); 4891 db.Names.back() = 4892 db.make<ArraySubscriptExpr>(op1, op2); 4893 first = t2; 4894 } 4895 else if (!db.Names.empty()) 4896 db.Names.pop_back(); 4897 } 4898 } 4899 break; 4900 case 'l': 4901 switch (t[1]) 4902 { 4903 case 'e': 4904 t = parse_binary_expression(first+2, last, "<=", db); 4905 if (t != first+2) 4906 first = t; 4907 break; 4908 case 's': 4909 t = parse_binary_expression(first+2, last, "<<", db); 4910 if (t != first+2) 4911 first = t; 4912 break; 4913 case 'S': 4914 t = parse_binary_expression(first+2, last, "<<=", db); 4915 if (t != first+2) 4916 first = t; 4917 break; 4918 case 't': 4919 t = parse_binary_expression(first+2, last, "<", db); 4920 if (t != first+2) 4921 first = t; 4922 break; 4923 } 4924 break; 4925 case 'm': 4926 switch (t[1]) 4927 { 4928 case 'i': 4929 t = parse_binary_expression(first+2, last, "-", db); 4930 if (t != first+2) 4931 first = t; 4932 break; 4933 case 'I': 4934 t = parse_binary_expression(first+2, last, "-=", db); 4935 if (t != first+2) 4936 first = t; 4937 break; 4938 case 'l': 4939 t = parse_binary_expression(first+2, last, "*", db); 4940 if (t != first+2) 4941 first = t; 4942 break; 4943 case 'L': 4944 t = parse_binary_expression(first+2, last, "*=", db); 4945 if (t != first+2) 4946 first = t; 4947 break; 4948 case 'm': 4949 if (first+2 != last && first[2] == '_') 4950 { 4951 t = parse_prefix_expression(first+3, last, "--", db); 4952 if (t != first+3) 4953 first = t; 4954 } 4955 else 4956 { 4957 const char* t1 = parse_expression(first+2, last, db); 4958 if (t1 != first+2) 4959 { 4960 if (db.Names.empty()) 4961 return first; 4962 db.Names.back() = 4963 db.make<PostfixExpr>(db.Names.back(), "--"); 4964 first = t1; 4965 } 4966 } 4967 break; 4968 } 4969 break; 4970 case 'n': 4971 switch (t[1]) 4972 { 4973 case 'a': 4974 case 'w': 4975 first = parse_new_expr(first, last, db); 4976 break; 4977 case 'e': 4978 t = parse_binary_expression(first+2, last, "!=", db); 4979 if (t != first+2) 4980 first = t; 4981 break; 4982 case 'g': 4983 t = parse_prefix_expression(first+2, last, "-", db); 4984 if (t != first+2) 4985 first = t; 4986 break; 4987 case 't': 4988 t = parse_prefix_expression(first+2, last, "!", db); 4989 if (t != first+2) 4990 first = t; 4991 break; 4992 case 'x': 4993 t = parse_noexcept_expression(first+2, last, db); 4994 if (t != first+2) 4995 first = t; 4996 break; 4997 } 4998 break; 4999 case 'o': 5000 switch (t[1]) 5001 { 5002 case 'n': 5003 return parse_unresolved_name(first, last, db); 5004 case 'o': 5005 t = parse_binary_expression(first+2, last, "||", db); 5006 if (t != first+2) 5007 first = t; 5008 break; 5009 case 'r': 5010 t = parse_binary_expression(first+2, last, "|", db); 5011 if (t != first+2) 5012 first = t; 5013 break; 5014 case 'R': 5015 t = parse_binary_expression(first+2, last, "|=", db); 5016 if (t != first+2) 5017 first = t; 5018 break; 5019 } 5020 break; 5021 case 'p': 5022 switch (t[1]) 5023 { 5024 case 'm': 5025 t = parse_binary_expression(first+2, last, "->*", db); 5026 if (t != first+2) 5027 first = t; 5028 break; 5029 case 'l': 5030 t = parse_binary_expression(first+2, last, "+", db); 5031 if (t != first+2) 5032 first = t; 5033 break; 5034 case 'L': 5035 t = parse_binary_expression(first+2, last, "+=", db); 5036 if (t != first+2) 5037 first = t; 5038 break; 5039 case 'p': 5040 if (first+2 != last && first[2] == '_') 5041 { 5042 t = parse_prefix_expression(first+3, last, "++", db); 5043 if (t != first+3) 5044 first = t; 5045 } 5046 else 5047 { 5048 const char* t1 = parse_expression(first+2, last, db); 5049 if (t1 != first+2) 5050 { 5051 if (db.Names.empty()) 5052 return first; 5053 db.Names.back() = 5054 db.make<PostfixExpr>(db.Names.back(), "++"); 5055 first = t1; 5056 } 5057 } 5058 break; 5059 case 's': 5060 t = parse_prefix_expression(first+2, last, "+", db); 5061 if (t != first+2) 5062 first = t; 5063 break; 5064 case 't': 5065 first = parse_arrow_expr(first, last, db); 5066 break; 5067 } 5068 break; 5069 case 'q': 5070 if (t[1] == 'u') 5071 { 5072 const char* t1 = parse_expression(first+2, last, db); 5073 if (t1 != first+2) 5074 { 5075 const char* t2 = parse_expression(t1, last, db); 5076 if (t2 != t1) 5077 { 5078 const char* t3 = parse_expression(t2, last, db); 5079 if (t3 != t2) 5080 { 5081 if (db.Names.size() < 3) 5082 return first; 5083 auto op3 = db.Names.back(); 5084 db.Names.pop_back(); 5085 auto op2 = db.Names.back(); 5086 db.Names.pop_back(); 5087 auto op1 = db.Names.back(); 5088 db.Names.back() = 5089 db.make<ConditionalExpr>(op1, op2, op3); 5090 first = t3; 5091 } 5092 else 5093 { 5094 if (db.Names.size() < 2) 5095 return first; 5096 db.Names.pop_back(); 5097 db.Names.pop_back(); 5098 } 5099 } 5100 else if (!db.Names.empty()) 5101 db.Names.pop_back(); 5102 } 5103 } 5104 break; 5105 case 'r': 5106 switch (t[1]) 5107 { 5108 case 'c': 5109 first = parse_reinterpret_cast_expr(first, last, db); 5110 break; 5111 case 'm': 5112 t = parse_binary_expression(first+2, last, "%", db); 5113 if (t != first+2) 5114 first = t; 5115 break; 5116 case 'M': 5117 t = parse_binary_expression(first+2, last, "%=", db); 5118 if (t != first+2) 5119 first = t; 5120 break; 5121 case 's': 5122 t = parse_binary_expression(first+2, last, ">>", db); 5123 if (t != first+2) 5124 first = t; 5125 break; 5126 case 'S': 5127 t = parse_binary_expression(first+2, last, ">>=", db); 5128 if (t != first+2) 5129 first = t; 5130 break; 5131 } 5132 break; 5133 case 's': 5134 switch (t[1]) 5135 { 5136 case 'c': 5137 first = parse_static_cast_expr(first, last, db); 5138 break; 5139 case 'p': 5140 first = parse_pack_expansion(first, last, db); 5141 break; 5142 case 'r': 5143 return parse_unresolved_name(first, last, db); 5144 case 't': 5145 first = parse_sizeof_type_expr(first, last, db); 5146 break; 5147 case 'z': 5148 first = parse_sizeof_expr_expr(first, last, db); 5149 break; 5150 case 'Z': 5151 if (last - t >= 3) 5152 { 5153 switch (t[2]) 5154 { 5155 case 'T': 5156 first = parse_sizeof_param_pack_expr(first, last, db); 5157 break; 5158 case 'f': 5159 first = parse_sizeof_function_param_pack_expr(first, last, db); 5160 break; 5161 } 5162 } 5163 break; 5164 } 5165 break; 5166 case 't': 5167 switch (t[1]) 5168 { 5169 case 'e': 5170 case 'i': 5171 first = parse_typeid_expr(first, last, db); 5172 break; 5173 case 'r': 5174 db.Names.push_back(db.make<NameType>("throw")); 5175 first += 2; 5176 break; 5177 case 'w': 5178 first = parse_throw_expr(first, last, db); 5179 break; 5180 } 5181 break; 5182 case '1': 5183 case '2': 5184 case '3': 5185 case '4': 5186 case '5': 5187 case '6': 5188 case '7': 5189 case '8': 5190 case '9': 5191 return parse_unresolved_name(first, last, db); 5192 } 5193 } 5194 return first; 5195 } 5196 5197 // <template-arg> ::= <type> # type or template 5198 // ::= X <expression> E # expression 5199 // ::= <expr-primary> # simple expressions 5200 // ::= J <template-arg>* E # argument pack 5201 // ::= LZ <encoding> E # extension 5202 5203 const char* 5204 parse_template_arg(const char* first, const char* last, Db& db) 5205 { 5206 if (first != last) 5207 { 5208 const char* t; 5209 switch (*first) 5210 { 5211 case 'X': 5212 t = parse_expression(first+1, last, db); 5213 if (t != first+1) 5214 { 5215 if (t != last && *t == 'E') 5216 first = t+1; 5217 } 5218 break; 5219 case 'J': 5220 t = first+1; 5221 if (t == last) 5222 return first; 5223 while (*t != 'E') 5224 { 5225 const char* t1 = parse_template_arg(t, last, db); 5226 if (t1 == t) 5227 return first; 5228 t = t1; 5229 } 5230 first = t+1; 5231 break; 5232 case 'L': 5233 // <expr-primary> or LZ <encoding> E 5234 if (first+1 != last && first[1] == 'Z') 5235 { 5236 t = parse_encoding(first+2, last, db); 5237 if (t != first+2 && t != last && *t == 'E') 5238 first = t+1; 5239 } 5240 else 5241 first = parse_expr_primary(first, last, db); 5242 break; 5243 default: 5244 // <type> 5245 first = parse_type(first, last, db); 5246 break; 5247 } 5248 } 5249 return first; 5250 } 5251 5252 // <template-args> ::= I <template-arg>* E 5253 // extension, the abi says <template-arg>+ 5254 5255 const char* 5256 parse_template_args(const char* first, const char* last, Db& db) 5257 { 5258 if (last - first >= 2 && *first == 'I') 5259 { 5260 if (db.TagTemplates) 5261 db.TemplateParams.clear(); 5262 const char* t = first+1; 5263 size_t begin_idx = db.Names.size(); 5264 while (*t != 'E') 5265 { 5266 if (db.TagTemplates) 5267 { 5268 auto TmpParams = std::move(db.TemplateParams); 5269 size_t k0 = db.Names.size(); 5270 const char* t1 = parse_template_arg(t, last, db); 5271 size_t k1 = db.Names.size(); 5272 db.TemplateParams = std::move(TmpParams); 5273 5274 if (t1 == t || t1 == last || k0 > k1) 5275 return first; 5276 db.TemplateParams.pushPack(); 5277 for (size_t k = k0; k < k1; ++k) 5278 db.TemplateParams.pushSubstitutionIntoPack(db.Names[k]); 5279 t = t1; 5280 continue; 5281 } 5282 size_t k0 = db.Names.size(); 5283 const char* t1 = parse_template_arg(t, last, db); 5284 size_t k1 = db.Names.size(); 5285 if (t1 == t || t1 == last || k0 > k1) 5286 return first; 5287 t = t1; 5288 } 5289 if (begin_idx > db.Names.size()) 5290 return first; 5291 first = t + 1; 5292 TemplateParams* tp = db.make<TemplateParams>( 5293 db.popTrailingNodeArray(begin_idx)); 5294 db.Names.push_back(tp); 5295 } 5296 return first; 5297 } 5298 5299 // <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E 5300 // ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E 5301 // 5302 // <prefix> ::= <prefix> <unqualified-name> 5303 // ::= <template-prefix> <template-args> 5304 // ::= <template-param> 5305 // ::= <decltype> 5306 // ::= # empty 5307 // ::= <substitution> 5308 // ::= <prefix> <data-member-prefix> 5309 // extension ::= L 5310 // 5311 // <template-prefix> ::= <prefix> <template unqualified-name> 5312 // ::= <template-param> 5313 // ::= <substitution> 5314 5315 const char* 5316 parse_nested_name(const char* first, const char* last, Db& db, 5317 bool* ends_with_template_args) 5318 { 5319 if (first != last && *first == 'N') 5320 { 5321 Qualifiers cv; 5322 const char* t0 = parse_cv_qualifiers(first+1, last, cv); 5323 if (t0 == last) 5324 return first; 5325 db.RefQuals = FrefQualNone; 5326 if (*t0 == 'R') 5327 { 5328 db.RefQuals = FrefQualLValue; 5329 ++t0; 5330 } 5331 else if (*t0 == 'O') 5332 { 5333 db.RefQuals = FrefQualRValue; 5334 ++t0; 5335 } 5336 db.Names.push_back(db.make<EmptyName>()); 5337 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') 5338 { 5339 t0 += 2; 5340 db.Names.back() = db.make<NameType>("std"); 5341 } 5342 if (t0 == last) 5343 return first; 5344 bool pop_subs = false; 5345 bool component_ends_with_template_args = false; 5346 while (*t0 != 'E') 5347 { 5348 component_ends_with_template_args = false; 5349 const char* t1; 5350 switch (*t0) 5351 { 5352 case 'S': 5353 if (t0 + 1 != last && t0[1] == 't') 5354 goto do_parse_unqualified_name; 5355 t1 = parse_substitution(t0, last, db); 5356 if (t1 != t0 && t1 != last) 5357 { 5358 if (db.Names.size() < 2) 5359 return first; 5360 auto name = db.Names.back(); 5361 db.Names.pop_back(); 5362 if (db.Names.back()->K != Node::KEmptyName) 5363 { 5364 db.Names.back() = db.make<QualifiedName>( 5365 db.Names.back(), name); 5366 db.Subs.pushSubstitution(db.Names.back()); 5367 } 5368 else 5369 db.Names.back() = name; 5370 pop_subs = true; 5371 t0 = t1; 5372 } 5373 else 5374 return first; 5375 break; 5376 case 'T': 5377 t1 = parse_template_param(t0, last, db); 5378 if (t1 != t0 && t1 != last) 5379 { 5380 if (db.Names.size() < 2) 5381 return first; 5382 auto name = db.Names.back(); 5383 db.Names.pop_back(); 5384 if (db.Names.back()->K != Node::KEmptyName) 5385 db.Names.back() = 5386 db.make<QualifiedName>(db.Names.back(), name); 5387 else 5388 db.Names.back() = name; 5389 db.Subs.pushSubstitution(db.Names.back()); 5390 pop_subs = true; 5391 t0 = t1; 5392 } 5393 else 5394 return first; 5395 break; 5396 case 'D': 5397 if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T') 5398 goto do_parse_unqualified_name; 5399 t1 = parse_decltype(t0, last, db); 5400 if (t1 != t0 && t1 != last) 5401 { 5402 if (db.Names.size() < 2) 5403 return first; 5404 auto name = db.Names.back(); 5405 db.Names.pop_back(); 5406 if (db.Names.back()->K != Node::KEmptyName) 5407 db.Names.back() = 5408 db.make<QualifiedName>(db.Names.back(), name); 5409 else 5410 db.Names.back() = name; 5411 db.Subs.pushSubstitution(db.Names.back()); 5412 pop_subs = true; 5413 t0 = t1; 5414 } 5415 else 5416 return first; 5417 break; 5418 case 'I': 5419 t1 = parse_template_args(t0, last, db); 5420 if (t1 != t0 && t1 != last) 5421 { 5422 if (db.Names.size() < 2) 5423 return first; 5424 auto name = db.Names.back(); 5425 db.Names.pop_back(); 5426 db.Names.back() = db.make<NameWithTemplateArgs>( 5427 db.Names.back(), name); 5428 db.Subs.pushSubstitution(db.Names.back()); 5429 t0 = t1; 5430 component_ends_with_template_args = true; 5431 } 5432 else 5433 return first; 5434 break; 5435 case 'L': 5436 if (++t0 == last) 5437 return first; 5438 break; 5439 default: 5440 do_parse_unqualified_name: 5441 t1 = parse_unqualified_name(t0, last, db); 5442 if (t1 != t0 && t1 != last) 5443 { 5444 if (db.Names.size() < 2) 5445 return first; 5446 auto name = db.Names.back(); 5447 db.Names.pop_back(); 5448 if (db.Names.back()->K != Node::KEmptyName) 5449 db.Names.back() = 5450 db.make<QualifiedName>(db.Names.back(), name); 5451 else 5452 db.Names.back() = name; 5453 db.Subs.pushSubstitution(db.Names.back()); 5454 pop_subs = true; 5455 t0 = t1; 5456 } 5457 else 5458 return first; 5459 } 5460 } 5461 first = t0 + 1; 5462 db.CV = cv; 5463 if (pop_subs && !db.Subs.empty()) 5464 db.Subs.popPack(); 5465 if (ends_with_template_args) 5466 *ends_with_template_args = component_ends_with_template_args; 5467 } 5468 return first; 5469 } 5470 5471 // <discriminator> := _ <non-negative number> # when number < 10 5472 // := __ <non-negative number> _ # when number >= 10 5473 // extension := decimal-digit+ # at the end of string 5474 5475 const char* 5476 parse_discriminator(const char* first, const char* last) 5477 { 5478 // parse but ignore discriminator 5479 if (first != last) 5480 { 5481 if (*first == '_') 5482 { 5483 const char* t1 = first+1; 5484 if (t1 != last) 5485 { 5486 if (std::isdigit(*t1)) 5487 first = t1+1; 5488 else if (*t1 == '_') 5489 { 5490 for (++t1; t1 != last && std::isdigit(*t1); ++t1) 5491 ; 5492 if (t1 != last && *t1 == '_') 5493 first = t1 + 1; 5494 } 5495 } 5496 } 5497 else if (std::isdigit(*first)) 5498 { 5499 const char* t1 = first+1; 5500 for (; t1 != last && std::isdigit(*t1); ++t1) 5501 ; 5502 if (t1 == last) 5503 first = last; 5504 } 5505 } 5506 return first; 5507 } 5508 5509 // <local-name> := Z <function encoding> E <entity name> [<discriminator>] 5510 // := Z <function encoding> E s [<discriminator>] 5511 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name> 5512 5513 const char* 5514 parse_local_name(const char* first, const char* last, Db& db, 5515 bool* ends_with_template_args) 5516 { 5517 if (first != last && *first == 'Z') 5518 { 5519 const char* t = parse_encoding(first+1, last, db); 5520 if (t != first+1 && t != last && *t == 'E' && ++t != last) 5521 { 5522 switch (*t) 5523 { 5524 case 's': 5525 first = parse_discriminator(t+1, last); 5526 if (db.Names.empty()) 5527 return first; 5528 db.Names.back() = db.make<QualifiedName>( 5529 db.Names.back(), db.make<NameType>("string literal")); 5530 break; 5531 case 'd': 5532 if (++t != last) 5533 { 5534 const char* t1 = parse_number(t, last); 5535 if (t1 != last && *t1 == '_') 5536 { 5537 t = t1 + 1; 5538 t1 = parse_name(t, last, db, 5539 ends_with_template_args); 5540 if (t1 != t) 5541 { 5542 if (db.Names.size() < 2) 5543 return first; 5544 auto name = db.Names.back(); 5545 db.Names.pop_back(); 5546 if (db.Names.empty()) 5547 return first; 5548 db.Names.back() = 5549 db.make<QualifiedName>(db.Names.back(), name); 5550 first = t1; 5551 } 5552 else if (!db.Names.empty()) 5553 db.Names.pop_back(); 5554 } 5555 } 5556 break; 5557 default: 5558 { 5559 const char* t1 = parse_name(t, last, db, 5560 ends_with_template_args); 5561 if (t1 != t) 5562 { 5563 // parse but ignore discriminator 5564 first = parse_discriminator(t1, last); 5565 if (db.Names.size() < 2) 5566 return first; 5567 auto name = db.Names.back(); 5568 db.Names.pop_back(); 5569 if (db.Names.empty()) 5570 return first; 5571 db.Names.back() = 5572 db.make<QualifiedName>(db.Names.back(), name); 5573 } 5574 else if (!db.Names.empty()) 5575 db.Names.pop_back(); 5576 } 5577 break; 5578 } 5579 } 5580 } 5581 return first; 5582 } 5583 5584 // <name> ::= <nested-name> // N 5585 // ::= <local-name> # See Scope Encoding below // Z 5586 // ::= <unscoped-template-name> <template-args> 5587 // ::= <unscoped-name> 5588 5589 // <unscoped-template-name> ::= <unscoped-name> 5590 // ::= <substitution> 5591 5592 const char* 5593 parse_name(const char* first, const char* last, Db& db, 5594 bool* ends_with_template_args) 5595 { 5596 if (last - first >= 2) 5597 { 5598 const char* t0 = first; 5599 // extension: ignore L here 5600 if (*t0 == 'L') 5601 ++t0; 5602 switch (*t0) 5603 { 5604 case 'N': 5605 { 5606 const char* t1 = parse_nested_name(t0, last, db, 5607 ends_with_template_args); 5608 if (t1 != t0) 5609 first = t1; 5610 break; 5611 } 5612 case 'Z': 5613 { 5614 const char* t1 = parse_local_name(t0, last, db, 5615 ends_with_template_args); 5616 if (t1 != t0) 5617 first = t1; 5618 break; 5619 } 5620 default: 5621 { 5622 const char* t1 = parse_unscoped_name(t0, last, db); 5623 if (t1 != t0) 5624 { 5625 if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args> 5626 { 5627 if (db.Names.empty()) 5628 return first; 5629 db.Subs.pushSubstitution(db.Names.back()); 5630 t0 = t1; 5631 t1 = parse_template_args(t0, last, db); 5632 if (t1 != t0) 5633 { 5634 if (db.Names.size() < 2) 5635 return first; 5636 auto tmp = db.Names.back(); 5637 db.Names.pop_back(); 5638 if (db.Names.empty()) 5639 return first; 5640 db.Names.back() = 5641 db.make<NameWithTemplateArgs>( 5642 db.Names.back(), tmp); 5643 first = t1; 5644 if (ends_with_template_args) 5645 *ends_with_template_args = true; 5646 } 5647 } 5648 else // <unscoped-name> 5649 first = t1; 5650 } 5651 else 5652 { // try <substitution> <template-args> 5653 t1 = parse_substitution(t0, last, db); 5654 if (t1 != t0 && t1 != last && *t1 == 'I') 5655 { 5656 t0 = t1; 5657 t1 = parse_template_args(t0, last, db); 5658 if (t1 != t0) 5659 { 5660 if (db.Names.size() < 2) 5661 return first; 5662 auto tmp = db.Names.back(); 5663 db.Names.pop_back(); 5664 if (db.Names.empty()) 5665 return first; 5666 db.Names.back() = 5667 db.make<NameWithTemplateArgs>( 5668 db.Names.back(), tmp); 5669 first = t1; 5670 if (ends_with_template_args) 5671 *ends_with_template_args = true; 5672 } 5673 } 5674 } 5675 break; 5676 } 5677 } 5678 } 5679 return first; 5680 } 5681 5682 // <call-offset> ::= h <nv-offset> _ 5683 // ::= v <v-offset> _ 5684 // 5685 // <nv-offset> ::= <offset number> 5686 // # non-virtual base override 5687 // 5688 // <v-offset> ::= <offset number> _ <virtual offset number> 5689 // # virtual base override, with vcall offset 5690 5691 const char* 5692 parse_call_offset(const char* first, const char* last) 5693 { 5694 if (first != last) 5695 { 5696 switch (*first) 5697 { 5698 case 'h': 5699 { 5700 const char* t = parse_number(first + 1, last); 5701 if (t != first + 1 && t != last && *t == '_') 5702 first = t + 1; 5703 } 5704 break; 5705 case 'v': 5706 { 5707 const char* t = parse_number(first + 1, last); 5708 if (t != first + 1 && t != last && *t == '_') 5709 { 5710 const char* t2 = parse_number(++t, last); 5711 if (t2 != t && t2 != last && *t2 == '_') 5712 first = t2 + 1; 5713 } 5714 } 5715 break; 5716 } 5717 } 5718 return first; 5719 } 5720 5721 // <special-name> ::= TV <type> # virtual table 5722 // ::= TT <type> # VTT structure (construction vtable index) 5723 // ::= TI <type> # typeinfo structure 5724 // ::= TS <type> # typeinfo name (null-terminated byte string) 5725 // ::= Tc <call-offset> <call-offset> <base encoding> 5726 // # base is the nominal target function of thunk 5727 // # first call-offset is 'this' adjustment 5728 // # second call-offset is result adjustment 5729 // ::= T <call-offset> <base encoding> 5730 // # base is the nominal target function of thunk 5731 // ::= GV <object name> # Guard variable for one-time initialization 5732 // # No <type> 5733 // ::= TW <object name> # Thread-local wrapper 5734 // ::= TH <object name> # Thread-local initialization 5735 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first 5736 // extension ::= GR <object name> # reference temporary for object 5737 5738 const char* 5739 parse_special_name(const char* first, const char* last, Db& db) 5740 { 5741 if (last - first > 2) 5742 { 5743 const char* t; 5744 switch (*first) 5745 { 5746 case 'T': 5747 switch (first[1]) 5748 { 5749 case 'V': 5750 // TV <type> # virtual table 5751 t = parse_type(first+2, last, db); 5752 if (t != first+2) 5753 { 5754 if (db.Names.empty()) 5755 return first; 5756 db.Names.back() = 5757 db.make<SpecialName>("vtable for ", db.Names.back()); 5758 first = t; 5759 } 5760 break; 5761 case 'T': 5762 // TT <type> # VTT structure (construction vtable index) 5763 t = parse_type(first+2, last, db); 5764 if (t != first+2) 5765 { 5766 if (db.Names.empty()) 5767 return first; 5768 db.Names.back() = 5769 db.make<SpecialName>("VTT for ", db.Names.back()); 5770 first = t; 5771 } 5772 break; 5773 case 'I': 5774 // TI <type> # typeinfo structure 5775 t = parse_type(first+2, last, db); 5776 if (t != first+2) 5777 { 5778 if (db.Names.empty()) 5779 return first; 5780 db.Names.back() = 5781 db.make<SpecialName>("typeinfo for ", db.Names.back()); 5782 first = t; 5783 } 5784 break; 5785 case 'S': 5786 // TS <type> # typeinfo name (null-terminated byte string) 5787 t = parse_type(first+2, last, db); 5788 if (t != first+2) 5789 { 5790 if (db.Names.empty()) 5791 return first; 5792 db.Names.back() = 5793 db.make<SpecialName>("typeinfo name for ", db.Names.back()); 5794 first = t; 5795 } 5796 break; 5797 case 'c': 5798 // Tc <call-offset> <call-offset> <base encoding> 5799 { 5800 const char* t0 = parse_call_offset(first+2, last); 5801 if (t0 == first+2) 5802 break; 5803 const char* t1 = parse_call_offset(t0, last); 5804 if (t1 == t0) 5805 break; 5806 t = parse_encoding(t1, last, db); 5807 if (t != t1) 5808 { 5809 if (db.Names.empty()) 5810 return first; 5811 db.Names.back() = 5812 db.make<SpecialName>("covariant return thunk to ", 5813 db.Names.back()); 5814 first = t; 5815 } 5816 } 5817 break; 5818 case 'C': 5819 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first 5820 t = parse_type(first+2, last, db); 5821 if (t != first+2) 5822 { 5823 const char* t0 = parse_number(t, last); 5824 if (t0 != t && t0 != last && *t0 == '_') 5825 { 5826 const char* t1 = parse_type(++t0, last, db); 5827 if (t1 != t0) 5828 { 5829 if (db.Names.size() < 2) 5830 return first; 5831 auto left = db.Names.back(); 5832 db.Names.pop_back(); 5833 if (db.Names.empty()) 5834 return first; 5835 db.Names.back() = db.make<CtorVtableSpecialName>( 5836 left, db.Names.back()); 5837 first = t1; 5838 } 5839 } 5840 } 5841 break; 5842 case 'W': 5843 // TW <object name> # Thread-local wrapper 5844 t = parse_name(first + 2, last, db); 5845 if (t != first + 2) 5846 { 5847 if (db.Names.empty()) 5848 return first; 5849 db.Names.back() = 5850 db.make<SpecialName>("thread-local wrapper routine for ", 5851 db.Names.back()); 5852 first = t; 5853 } 5854 break; 5855 case 'H': 5856 //TH <object name> # Thread-local initialization 5857 t = parse_name(first + 2, last, db); 5858 if (t != first + 2) 5859 { 5860 if (db.Names.empty()) 5861 return first; 5862 db.Names.back() = db.make<SpecialName>( 5863 "thread-local initialization routine for ", db.Names.back()); 5864 first = t; 5865 } 5866 break; 5867 default: 5868 // T <call-offset> <base encoding> 5869 { 5870 const char* t0 = parse_call_offset(first+1, last); 5871 if (t0 == first+1) 5872 break; 5873 t = parse_encoding(t0, last, db); 5874 if (t != t0) 5875 { 5876 if (db.Names.empty()) 5877 return first; 5878 if (first[1] == 'v') 5879 { 5880 db.Names.back() = 5881 db.make<SpecialName>("virtual thunk to ", 5882 db.Names.back()); 5883 first = t; 5884 } 5885 else 5886 { 5887 db.Names.back() = 5888 db.make<SpecialName>("non-virtual thunk to ", 5889 db.Names.back()); 5890 first = t; 5891 } 5892 } 5893 } 5894 break; 5895 } 5896 break; 5897 case 'G': 5898 switch (first[1]) 5899 { 5900 case 'V': 5901 // GV <object name> # Guard variable for one-time initialization 5902 t = parse_name(first+2, last, db); 5903 if (t != first+2) 5904 { 5905 if (db.Names.empty()) 5906 return first; 5907 db.Names.back() = 5908 db.make<SpecialName>("guard variable for ", db.Names.back()); 5909 first = t; 5910 } 5911 break; 5912 case 'R': 5913 // extension ::= GR <object name> # reference temporary for object 5914 t = parse_name(first+2, last, db); 5915 if (t != first+2) 5916 { 5917 if (db.Names.empty()) 5918 return first; 5919 db.Names.back() = 5920 db.make<SpecialName>("reference temporary for ", 5921 db.Names.back()); 5922 first = t; 5923 } 5924 break; 5925 } 5926 break; 5927 } 5928 } 5929 return first; 5930 } 5931 5932 template <class T> 5933 class save_value 5934 { 5935 T& restore_; 5936 T original_value_; 5937 public: 5938 save_value(T& restore) 5939 : restore_(restore), 5940 original_value_(restore) 5941 {} 5942 5943 ~save_value() 5944 { 5945 restore_ = std::move(original_value_); 5946 } 5947 5948 save_value(const save_value&) = delete; 5949 save_value& operator=(const save_value&) = delete; 5950 }; 5951 5952 // <encoding> ::= <function name> <bare-function-type> 5953 // ::= <data name> 5954 // ::= <special-name> 5955 5956 const char* 5957 parse_encoding(const char* first, const char* last, Db& db) 5958 { 5959 if (first != last) 5960 { 5961 save_value<decltype(db.EncodingDepth)> su(db.EncodingDepth); 5962 ++db.EncodingDepth; 5963 save_value<decltype(db.TagTemplates)> sb(db.TagTemplates); 5964 if (db.EncodingDepth > 1) 5965 db.TagTemplates = true; 5966 save_value<decltype(db.ParsedCtorDtorCV)> sp(db.ParsedCtorDtorCV); 5967 db.ParsedCtorDtorCV = false; 5968 switch (*first) 5969 { 5970 case 'G': 5971 case 'T': 5972 first = parse_special_name(first, last, db); 5973 break; 5974 default: 5975 { 5976 bool ends_with_template_args = false; 5977 const char* t = parse_name(first, last, db, 5978 &ends_with_template_args); 5979 if (db.Names.empty()) 5980 return first; 5981 Qualifiers cv = db.CV; 5982 FunctionRefQual ref = db.RefQuals; 5983 if (t != first) 5984 { 5985 if (t != last && *t != 'E' && *t != '.') 5986 { 5987 save_value<bool> sb2(db.TagTemplates); 5988 db.TagTemplates = false; 5989 const char* t2; 5990 if (db.Names.empty()) 5991 return first; 5992 if (!db.Names.back()) 5993 return first; 5994 Node* return_type = nullptr; 5995 if (!db.ParsedCtorDtorCV && ends_with_template_args) 5996 { 5997 t2 = parse_type(t, last, db); 5998 if (t2 == t) 5999 return first; 6000 if (db.Names.size() < 1) 6001 return first; 6002 return_type = db.Names.back(); 6003 db.Names.pop_back(); 6004 t = t2; 6005 } 6006 6007 Node* result = nullptr; 6008 6009 if (t != last && *t == 'v') 6010 { 6011 ++t; 6012 if (db.Names.empty()) 6013 return first; 6014 Node* name = db.Names.back(); 6015 db.Names.pop_back(); 6016 result = db.make<TopLevelFunctionDecl>( 6017 return_type, name, NodeArray()); 6018 } 6019 else 6020 { 6021 size_t params_begin = db.Names.size(); 6022 while (true) 6023 { 6024 t2 = parse_type(t, last, db); 6025 if (t2 == t) 6026 break; 6027 t = t2; 6028 } 6029 if (db.Names.size() < params_begin) 6030 return first; 6031 NodeArray params = 6032 db.popTrailingNodeArray(params_begin); 6033 if (db.Names.empty()) 6034 return first; 6035 Node* name = db.Names.back(); 6036 db.Names.pop_back(); 6037 result = db.make<TopLevelFunctionDecl>( 6038 return_type, name, params); 6039 } 6040 if (ref != FrefQualNone) 6041 result = db.make<FunctionRefQualType>(result, ref); 6042 if (cv != QualNone) 6043 result = db.make<FunctionQualType>(result, cv); 6044 db.Names.push_back(result); 6045 first = t; 6046 } 6047 else 6048 first = t; 6049 } 6050 break; 6051 } 6052 } 6053 } 6054 return first; 6055 } 6056 6057 // _block_invoke 6058 // _block_invoke<decimal-digit>+ 6059 // _block_invoke_<decimal-digit>+ 6060 6061 const char* 6062 parse_block_invoke(const char* first, const char* last, Db& db) 6063 { 6064 if (last - first >= 13) 6065 { 6066 // FIXME: strcmp? 6067 const char test[] = "_block_invoke"; 6068 const char* t = first; 6069 for (int i = 0; i < 13; ++i, ++t) 6070 { 6071 if (*t != test[i]) 6072 return first; 6073 } 6074 if (t != last) 6075 { 6076 if (*t == '_') 6077 { 6078 // must have at least 1 decimal digit 6079 if (++t == last || !std::isdigit(*t)) 6080 return first; 6081 ++t; 6082 } 6083 // parse zero or more digits 6084 while (t != last && isdigit(*t)) 6085 ++t; 6086 } 6087 if (db.Names.empty()) 6088 return first; 6089 db.Names.back() = 6090 db.make<SpecialName>("invocation function for block in ", 6091 db.Names.back()); 6092 first = t; 6093 } 6094 return first; 6095 } 6096 6097 // extension 6098 // <dot-suffix> := .<anything and everything> 6099 6100 const char* 6101 parse_dot_suffix(const char* first, const char* last, Db& db) 6102 { 6103 if (first != last && *first == '.') 6104 { 6105 if (db.Names.empty()) 6106 return first; 6107 db.Names.back() = 6108 db.make<DotSuffix>(db.Names.back(), StringView(first, last)); 6109 first = last; 6110 } 6111 return first; 6112 } 6113 6114 // <block-involcaton-function> ___Z<encoding>_block_invoke 6115 // <block-involcaton-function> ___Z<encoding>_block_invoke<decimal-digit>+ 6116 // <block-involcaton-function> ___Z<encoding>_block_invoke_<decimal-digit>+ 6117 // <mangled-name> ::= _Z<encoding> 6118 // ::= <type> 6119 6120 void 6121 demangle(const char* first, const char* last, Db& db, int& status) 6122 { 6123 if (first >= last) 6124 { 6125 status = invalid_mangled_name; 6126 return; 6127 } 6128 if (*first == '_') 6129 { 6130 if (last - first >= 4) 6131 { 6132 if (first[1] == 'Z') 6133 { 6134 const char* t = parse_encoding(first+2, last, db); 6135 if (t != first+2 && t != last && *t == '.') 6136 t = parse_dot_suffix(t, last, db); 6137 if (t != last) 6138 status = invalid_mangled_name; 6139 } 6140 else if (first[1] == '_' && first[2] == '_' && first[3] == 'Z') 6141 { 6142 const char* t = parse_encoding(first+4, last, db); 6143 if (t != first+4 && t != last) 6144 { 6145 const char* t1 = parse_block_invoke(t, last, db); 6146 if (t1 != last) 6147 status = invalid_mangled_name; 6148 } 6149 else 6150 status = invalid_mangled_name; 6151 } 6152 else 6153 status = invalid_mangled_name; 6154 } 6155 else 6156 status = invalid_mangled_name; 6157 } 6158 else 6159 { 6160 const char* t = parse_type(first, last, db); 6161 if (t != last) 6162 status = invalid_mangled_name; 6163 } 6164 if (status == success && db.Names.empty()) 6165 status = invalid_mangled_name; 6166 } 6167 6168 } // unnamed namespace 6169 6170 extern "C" _LIBCXXABI_FUNC_VIS char * 6171 __cxa_demangle(const char *mangled_name, char *buf, size_t *n, int *status) { 6172 if (mangled_name == nullptr || (buf != nullptr && n == nullptr)) 6173 { 6174 if (status) 6175 *status = invalid_args; 6176 return nullptr; 6177 } 6178 6179 size_t internal_size = buf != nullptr ? *n : 0; 6180 Db db; 6181 int internal_status = success; 6182 size_t len = std::strlen(mangled_name); 6183 demangle(mangled_name, mangled_name + len, db, 6184 internal_status); 6185 6186 if (internal_status == success && db.FixForwardReferences && 6187 !db.TemplateParams.empty()) 6188 { 6189 db.FixForwardReferences = false; 6190 db.TagTemplates = false; 6191 db.Names.clear(); 6192 db.Subs.clear(); 6193 demangle(mangled_name, mangled_name + len, db, internal_status); 6194 if (db.FixForwardReferences) 6195 internal_status = invalid_mangled_name; 6196 } 6197 6198 if (internal_status == success) 6199 { 6200 if (!buf) 6201 { 6202 internal_size = 1024; 6203 buf = static_cast<char*>(std::malloc(internal_size)); 6204 } 6205 6206 if (buf) 6207 { 6208 OutputStream s(buf, internal_size); 6209 db.Names.back()->print(s); 6210 s += '\0'; 6211 if (n) *n = s.getCurrentPosition(); 6212 buf = s.getBuffer(); 6213 } 6214 else 6215 internal_status = memory_alloc_failure; 6216 } 6217 else 6218 buf = nullptr; 6219 if (status) 6220 *status = internal_status; 6221 return buf; 6222 } 6223 6224 } // __cxxabiv1 6225