1 //===------------------------- ItaniumDemangle.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 // - C++ modules TS 13 14 #include "llvm/Demangle/Demangle.h" 15 16 #include <algorithm> 17 #include <cassert> 18 #include <cctype> 19 #include <cstdio> 20 #include <cstdlib> 21 #include <cstring> 22 #include <numeric> 23 #include <vector> 24 25 #ifdef _MSC_VER 26 // snprintf is implemented in VS 2015 27 #if _MSC_VER < 1900 28 #define snprintf _snprintf_s 29 #endif 30 #endif 31 32 // A variety of feature test macros copied from include/llvm/Support/Compiler.h 33 #ifndef __has_feature 34 #define __has_feature(x) 0 35 #endif 36 37 #ifndef __has_cpp_attribute 38 #define __has_cpp_attribute(x) 0 39 #endif 40 41 #ifndef __has_attribute 42 #define __has_attribute(x) 0 43 #endif 44 45 #ifndef __has_builtin 46 #define __has_builtin(x) 0 47 #endif 48 49 #ifndef LLVM_GNUC_PREREQ 50 #if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) 51 #define LLVM_GNUC_PREREQ(maj, min, patch) \ 52 ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \ 53 ((maj) << 20) + ((min) << 10) + (patch)) 54 #elif defined(__GNUC__) && defined(__GNUC_MINOR__) 55 #define LLVM_GNUC_PREREQ(maj, min, patch) \ 56 ((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10)) 57 #else 58 #define LLVM_GNUC_PREREQ(maj, min, patch) 0 59 #endif 60 #endif 61 62 #if __has_attribute(used) || LLVM_GNUC_PREREQ(3, 1, 0) 63 #define LLVM_ATTRIBUTE_USED __attribute__((__used__)) 64 #else 65 #define LLVM_ATTRIBUTE_USED 66 #endif 67 68 #if __has_builtin(__builtin_unreachable) || LLVM_GNUC_PREREQ(4, 5, 0) 69 #define LLVM_BUILTIN_UNREACHABLE __builtin_unreachable() 70 #elif defined(_MSC_VER) 71 #define LLVM_BUILTIN_UNREACHABLE __assume(false) 72 #endif 73 74 #if __has_attribute(noinline) || LLVM_GNUC_PREREQ(3, 4, 0) 75 #define LLVM_ATTRIBUTE_NOINLINE __attribute__((noinline)) 76 #elif defined(_MSC_VER) 77 #define LLVM_ATTRIBUTE_NOINLINE __declspec(noinline) 78 #else 79 #define LLVM_ATTRIBUTE_NOINLINE 80 #endif 81 82 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 83 #define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED 84 #else 85 #define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE 86 #endif 87 88 #if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) 89 #define LLVM_FALLTHROUGH [[fallthrough]] 90 #elif __has_cpp_attribute(gnu::fallthrough) 91 #define LLVM_FALLTHROUGH [[gnu::fallthrough]] 92 #elif !__cplusplus 93 // Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious 94 // error when __has_cpp_attribute is given a scoped attribute in C mode. 95 #define LLVM_FALLTHROUGH 96 #elif __has_cpp_attribute(clang::fallthrough) 97 #define LLVM_FALLTHROUGH [[clang::fallthrough]] 98 #else 99 #define LLVM_FALLTHROUGH 100 #endif 101 102 namespace { 103 104 class StringView { 105 const char *First; 106 const char *Last; 107 108 public: 109 template <size_t N> 110 StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {} 111 StringView(const char *First_, const char *Last_) : First(First_), Last(Last_) {} 112 StringView() : First(nullptr), Last(nullptr) {} 113 114 StringView substr(size_t From, size_t To) { 115 if (To >= size()) 116 To = size() - 1; 117 if (From >= size()) 118 From = size() - 1; 119 return StringView(First + From, First + To); 120 } 121 122 StringView dropFront(size_t N) const { 123 if (N >= size()) 124 N = size() - 1; 125 return StringView(First + N, Last); 126 } 127 128 bool startsWith(StringView Str) const { 129 if (Str.size() > size()) 130 return false; 131 return std::equal(Str.begin(), Str.end(), begin()); 132 } 133 134 const char &operator[](size_t Idx) const { return *(begin() + Idx); } 135 136 const char *begin() const { return First; } 137 const char *end() const { return Last; } 138 size_t size() const { return static_cast<size_t>(Last - First); } 139 bool empty() const { return First == Last; } 140 }; 141 142 bool operator==(const StringView &LHS, const StringView &RHS) { 143 return LHS.size() == RHS.size() && 144 std::equal(LHS.begin(), LHS.end(), RHS.begin()); 145 } 146 147 // Stream that AST nodes write their string representation into after the AST 148 // has been parsed. 149 class OutputStream { 150 char *Buffer; 151 size_t CurrentPosition; 152 size_t BufferCapacity; 153 154 // Ensure there is at least n more positions in buffer. 155 void grow(size_t N) { 156 if (N + CurrentPosition >= BufferCapacity) { 157 BufferCapacity *= 2; 158 if (BufferCapacity < N + CurrentPosition) 159 BufferCapacity = N + CurrentPosition; 160 Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity)); 161 } 162 } 163 164 public: 165 OutputStream(char *StartBuf, size_t Size) 166 : Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {} 167 OutputStream() = default; 168 void reset(char *Buffer_, size_t BufferCapacity_) { 169 CurrentPosition = 0; 170 Buffer = Buffer_; 171 BufferCapacity = BufferCapacity_; 172 } 173 174 /// If a ParameterPackExpansion (or similar type) is encountered, the offset 175 /// into the pack that we're currently printing. 176 unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max(); 177 unsigned CurrentPackMax = std::numeric_limits<unsigned>::max(); 178 179 OutputStream &operator+=(StringView R) { 180 size_t Size = R.size(); 181 if (Size == 0) 182 return *this; 183 grow(Size); 184 memmove(Buffer + CurrentPosition, R.begin(), Size); 185 CurrentPosition += Size; 186 return *this; 187 } 188 189 OutputStream &operator+=(char C) { 190 grow(1); 191 Buffer[CurrentPosition++] = C; 192 return *this; 193 } 194 195 size_t getCurrentPosition() const { return CurrentPosition; } 196 void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; } 197 198 char back() const { 199 return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0'; 200 } 201 202 bool empty() const { return CurrentPosition == 0; } 203 204 char *getBuffer() { return Buffer; } 205 char *getBufferEnd() { return Buffer + CurrentPosition - 1; } 206 size_t getBufferCapacity() { return BufferCapacity; } 207 }; 208 209 template <class T> 210 class SwapAndRestore { 211 T &Restore; 212 T OriginalValue; 213 public: 214 SwapAndRestore(T& Restore_, T NewVal) 215 : Restore(Restore_), OriginalValue(Restore) { 216 Restore = std::move(NewVal); 217 } 218 ~SwapAndRestore() { Restore = std::move(OriginalValue); } 219 220 SwapAndRestore(const SwapAndRestore &) = delete; 221 SwapAndRestore &operator=(const SwapAndRestore &) = delete; 222 }; 223 224 // Base class of all AST nodes. The AST is built by the parser, then is 225 // traversed by the printLeft/Right functions to produce a demangled string. 226 class Node { 227 public: 228 enum Kind : unsigned char { 229 KNodeArrayNode, 230 KDotSuffix, 231 KVendorExtQualType, 232 KQualType, 233 KConversionOperatorType, 234 KPostfixQualifiedType, 235 KElaboratedTypeSpefType, 236 KNameType, 237 KAbiTagAttr, 238 KEnableIfAttr, 239 KObjCProtoName, 240 KPointerType, 241 KLValueReferenceType, 242 KRValueReferenceType, 243 KPointerToMemberType, 244 KArrayType, 245 KFunctionType, 246 KNoexceptSpec, 247 KDynamicExceptionSpec, 248 KFunctionEncoding, 249 KLiteralOperator, 250 KSpecialName, 251 KCtorVtableSpecialName, 252 KQualifiedName, 253 KNestedName, 254 KLocalName, 255 KVectorType, 256 KParameterPack, 257 KTemplateArgumentPack, 258 KParameterPackExpansion, 259 KTemplateArgs, 260 KForwardTemplateReference, 261 KNameWithTemplateArgs, 262 KGlobalQualifiedName, 263 KStdQualifiedName, 264 KExpandedSpecialSubstitution, 265 KSpecialSubstitution, 266 KCtorDtorName, 267 KDtorName, 268 KUnnamedTypeName, 269 KClosureTypeName, 270 KStructuredBindingName, 271 KExpr, 272 KBracedExpr, 273 KBracedRangeExpr, 274 }; 275 276 Kind K; 277 278 /// Three-way bool to track a cached value. Unknown is possible if this node 279 /// has an unexpanded parameter pack below it that may affect this cache. 280 enum class Cache : unsigned char { Yes, No, Unknown, }; 281 282 /// Tracks if this node has a component on its right side, in which case we 283 /// need to call printRight. 284 Cache RHSComponentCache; 285 286 /// Track if this node is a (possibly qualified) array type. This can affect 287 /// how we format the output string. 288 Cache ArrayCache; 289 290 /// Track if this node is a (possibly qualified) function type. This can 291 /// affect how we format the output string. 292 Cache FunctionCache; 293 294 Node(Kind K_, Cache RHSComponentCache_ = Cache::No, 295 Cache ArrayCache_ = Cache::No, Cache FunctionCache_ = Cache::No) 296 : K(K_), RHSComponentCache(RHSComponentCache_), ArrayCache(ArrayCache_), 297 FunctionCache(FunctionCache_) {} 298 299 bool hasRHSComponent(OutputStream &S) const { 300 if (RHSComponentCache != Cache::Unknown) 301 return RHSComponentCache == Cache::Yes; 302 return hasRHSComponentSlow(S); 303 } 304 305 bool hasArray(OutputStream &S) const { 306 if (ArrayCache != Cache::Unknown) 307 return ArrayCache == Cache::Yes; 308 return hasArraySlow(S); 309 } 310 311 bool hasFunction(OutputStream &S) const { 312 if (FunctionCache != Cache::Unknown) 313 return FunctionCache == Cache::Yes; 314 return hasFunctionSlow(S); 315 } 316 317 Kind getKind() const { return K; } 318 319 virtual bool hasRHSComponentSlow(OutputStream &) const { return false; } 320 virtual bool hasArraySlow(OutputStream &) const { return false; } 321 virtual bool hasFunctionSlow(OutputStream &) const { return false; } 322 323 void print(OutputStream &S) const { 324 printLeft(S); 325 if (RHSComponentCache != Cache::No) 326 printRight(S); 327 } 328 329 // Print the "left" side of this Node into OutputStream. 330 virtual void printLeft(OutputStream &) const = 0; 331 332 // Print the "right". This distinction is necessary to represent C++ types 333 // that appear on the RHS of their subtype, such as arrays or functions. 334 // Since most types don't have such a component, provide a default 335 // implemenation. 336 virtual void printRight(OutputStream &) const {} 337 338 virtual StringView getBaseName() const { return StringView(); } 339 340 // Silence compiler warnings, this dtor will never be called. 341 virtual ~Node() = default; 342 343 #ifndef NDEBUG 344 LLVM_DUMP_METHOD void dump() const { 345 char *Buffer = static_cast<char*>(std::malloc(1024)); 346 OutputStream S(Buffer, 1024); 347 print(S); 348 S += '\0'; 349 printf("Symbol dump for %p: %s\n", (const void*)this, S.getBuffer()); 350 std::free(S.getBuffer()); 351 } 352 #endif 353 }; 354 355 class NodeArray { 356 Node **Elements; 357 size_t NumElements; 358 359 public: 360 NodeArray() : Elements(nullptr), NumElements(0) {} 361 NodeArray(Node **Elements_, size_t NumElements_) 362 : Elements(Elements_), NumElements(NumElements_) {} 363 364 bool empty() const { return NumElements == 0; } 365 size_t size() const { return NumElements; } 366 367 Node **begin() const { return Elements; } 368 Node **end() const { return Elements + NumElements; } 369 370 Node *operator[](size_t Idx) const { return Elements[Idx]; } 371 372 void printWithComma(OutputStream &S) const { 373 bool FirstElement = true; 374 for (size_t Idx = 0; Idx != NumElements; ++Idx) { 375 size_t BeforeComma = S.getCurrentPosition(); 376 if (!FirstElement) 377 S += ", "; 378 size_t AfterComma = S.getCurrentPosition(); 379 Elements[Idx]->print(S); 380 381 // Elements[Idx] is an empty parameter pack expansion, we should erase the 382 // comma we just printed. 383 if (AfterComma == S.getCurrentPosition()) { 384 S.setCurrentPosition(BeforeComma); 385 continue; 386 } 387 388 FirstElement = false; 389 } 390 } 391 }; 392 393 struct NodeArrayNode : Node { 394 NodeArray Array; 395 NodeArrayNode(NodeArray Array_) : Node(KNodeArrayNode), Array(Array_) {} 396 void printLeft(OutputStream &S) const override { 397 Array.printWithComma(S); 398 } 399 }; 400 401 class DotSuffix final : public Node { 402 const Node *Prefix; 403 const StringView Suffix; 404 405 public: 406 DotSuffix(Node *Prefix_, StringView Suffix_) 407 : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {} 408 409 void printLeft(OutputStream &s) const override { 410 Prefix->print(s); 411 s += " ("; 412 s += Suffix; 413 s += ")"; 414 } 415 }; 416 417 class VendorExtQualType final : public Node { 418 const Node *Ty; 419 StringView Ext; 420 421 public: 422 VendorExtQualType(Node *Ty_, StringView Ext_) 423 : Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_) {} 424 425 void printLeft(OutputStream &S) const override { 426 Ty->print(S); 427 S += " "; 428 S += Ext; 429 } 430 }; 431 432 enum FunctionRefQual : unsigned char { 433 FrefQualNone, 434 FrefQualLValue, 435 FrefQualRValue, 436 }; 437 438 enum Qualifiers { 439 QualNone = 0, 440 QualConst = 0x1, 441 QualVolatile = 0x2, 442 QualRestrict = 0x4, 443 }; 444 445 void addQualifiers(Qualifiers &Q1, Qualifiers Q2) { 446 Q1 = static_cast<Qualifiers>(Q1 | Q2); 447 } 448 449 class QualType : public Node { 450 protected: 451 const Qualifiers Quals; 452 const Node *Child; 453 454 void printQuals(OutputStream &S) const { 455 if (Quals & QualConst) 456 S += " const"; 457 if (Quals & QualVolatile) 458 S += " volatile"; 459 if (Quals & QualRestrict) 460 S += " restrict"; 461 } 462 463 public: 464 QualType(Node *Child_, Qualifiers Quals_) 465 : Node(KQualType, Child_->RHSComponentCache, 466 Child_->ArrayCache, Child_->FunctionCache), 467 Quals(Quals_), Child(Child_) {} 468 469 bool hasRHSComponentSlow(OutputStream &S) const override { 470 return Child->hasRHSComponent(S); 471 } 472 bool hasArraySlow(OutputStream &S) const override { 473 return Child->hasArray(S); 474 } 475 bool hasFunctionSlow(OutputStream &S) const override { 476 return Child->hasFunction(S); 477 } 478 479 void printLeft(OutputStream &S) const override { 480 Child->printLeft(S); 481 printQuals(S); 482 } 483 484 void printRight(OutputStream &S) const override { Child->printRight(S); } 485 }; 486 487 class ConversionOperatorType final : public Node { 488 const Node *Ty; 489 490 public: 491 ConversionOperatorType(Node *Ty_) 492 : Node(KConversionOperatorType), Ty(Ty_) {} 493 494 void printLeft(OutputStream &S) const override { 495 S += "operator "; 496 Ty->print(S); 497 } 498 }; 499 500 class PostfixQualifiedType final : public Node { 501 const Node *Ty; 502 const StringView Postfix; 503 504 public: 505 PostfixQualifiedType(Node *Ty_, StringView Postfix_) 506 : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {} 507 508 void printLeft(OutputStream &s) const override { 509 Ty->printLeft(s); 510 s += Postfix; 511 } 512 }; 513 514 class NameType final : public Node { 515 const StringView Name; 516 517 public: 518 NameType(StringView Name_) : Node(KNameType), Name(Name_) {} 519 520 StringView getName() const { return Name; } 521 StringView getBaseName() const override { return Name; } 522 523 void printLeft(OutputStream &s) const override { s += Name; } 524 }; 525 526 class ElaboratedTypeSpefType : public Node { 527 StringView Kind; 528 Node *Child; 529 public: 530 ElaboratedTypeSpefType(StringView Kind_, Node *Child_) 531 : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) {} 532 533 void printLeft(OutputStream &S) const override { 534 S += Kind; 535 S += ' '; 536 Child->print(S); 537 } 538 }; 539 540 struct AbiTagAttr : Node { 541 Node *Base; 542 StringView Tag; 543 544 AbiTagAttr(Node* Base_, StringView Tag_) 545 : Node(KAbiTagAttr, Base_->RHSComponentCache, 546 Base_->ArrayCache, Base_->FunctionCache), 547 Base(Base_), Tag(Tag_) {} 548 549 void printLeft(OutputStream &S) const override { 550 Base->printLeft(S); 551 S += "[abi:"; 552 S += Tag; 553 S += "]"; 554 } 555 }; 556 557 class EnableIfAttr : public Node { 558 NodeArray Conditions; 559 public: 560 EnableIfAttr(NodeArray Conditions_) 561 : Node(KEnableIfAttr), Conditions(Conditions_) {} 562 563 void printLeft(OutputStream &S) const override { 564 S += " [enable_if:"; 565 Conditions.printWithComma(S); 566 S += ']'; 567 } 568 }; 569 570 class ObjCProtoName : public Node { 571 Node *Ty; 572 StringView Protocol; 573 574 friend class PointerType; 575 576 public: 577 ObjCProtoName(Node *Ty_, StringView Protocol_) 578 : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {} 579 580 bool isObjCObject() const { 581 return Ty->getKind() == KNameType && 582 static_cast<NameType *>(Ty)->getName() == "objc_object"; 583 } 584 585 void printLeft(OutputStream &S) const override { 586 Ty->print(S); 587 S += "<"; 588 S += Protocol; 589 S += ">"; 590 } 591 }; 592 593 class PointerType final : public Node { 594 const Node *Pointee; 595 596 public: 597 PointerType(Node *Pointee_) 598 : Node(KPointerType, Pointee_->RHSComponentCache), 599 Pointee(Pointee_) {} 600 601 bool hasRHSComponentSlow(OutputStream &S) const override { 602 return Pointee->hasRHSComponent(S); 603 } 604 605 void printLeft(OutputStream &s) const override { 606 // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>. 607 if (Pointee->getKind() != KObjCProtoName || 608 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { 609 Pointee->printLeft(s); 610 if (Pointee->hasArray(s)) 611 s += " "; 612 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 613 s += "("; 614 s += "*"; 615 } else { 616 const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee); 617 s += "id<"; 618 s += objcProto->Protocol; 619 s += ">"; 620 } 621 } 622 623 void printRight(OutputStream &s) const override { 624 if (Pointee->getKind() != KObjCProtoName || 625 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) { 626 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 627 s += ")"; 628 Pointee->printRight(s); 629 } 630 } 631 }; 632 633 class LValueReferenceType final : public Node { 634 const Node *Pointee; 635 636 public: 637 LValueReferenceType(Node *Pointee_) 638 : Node(KLValueReferenceType, Pointee_->RHSComponentCache), 639 Pointee(Pointee_) {} 640 641 bool hasRHSComponentSlow(OutputStream &S) const override { 642 return Pointee->hasRHSComponent(S); 643 } 644 645 void printLeft(OutputStream &s) const override { 646 Pointee->printLeft(s); 647 if (Pointee->hasArray(s)) 648 s += " "; 649 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 650 s += "(&"; 651 else 652 s += "&"; 653 } 654 void printRight(OutputStream &s) const override { 655 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 656 s += ")"; 657 Pointee->printRight(s); 658 } 659 }; 660 661 class RValueReferenceType final : public Node { 662 const Node *Pointee; 663 664 public: 665 RValueReferenceType(Node *Pointee_) 666 : Node(KRValueReferenceType, Pointee_->RHSComponentCache), 667 Pointee(Pointee_) {} 668 669 bool hasRHSComponentSlow(OutputStream &S) const override { 670 return Pointee->hasRHSComponent(S); 671 } 672 673 void printLeft(OutputStream &s) const override { 674 Pointee->printLeft(s); 675 if (Pointee->hasArray(s)) 676 s += " "; 677 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 678 s += "(&&"; 679 else 680 s += "&&"; 681 } 682 683 void printRight(OutputStream &s) const override { 684 if (Pointee->hasArray(s) || Pointee->hasFunction(s)) 685 s += ")"; 686 Pointee->printRight(s); 687 } 688 }; 689 690 class PointerToMemberType final : public Node { 691 const Node *ClassType; 692 const Node *MemberType; 693 694 public: 695 PointerToMemberType(Node *ClassType_, Node *MemberType_) 696 : Node(KPointerToMemberType, MemberType_->RHSComponentCache), 697 ClassType(ClassType_), MemberType(MemberType_) {} 698 699 bool hasRHSComponentSlow(OutputStream &S) const override { 700 return MemberType->hasRHSComponent(S); 701 } 702 703 void printLeft(OutputStream &s) const override { 704 MemberType->printLeft(s); 705 if (MemberType->hasArray(s) || MemberType->hasFunction(s)) 706 s += "("; 707 else 708 s += " "; 709 ClassType->print(s); 710 s += "::*"; 711 } 712 713 void printRight(OutputStream &s) const override { 714 if (MemberType->hasArray(s) || MemberType->hasFunction(s)) 715 s += ")"; 716 MemberType->printRight(s); 717 } 718 }; 719 720 class NodeOrString { 721 const void *First; 722 const void *Second; 723 724 public: 725 /* implicit */ NodeOrString(StringView Str) { 726 const char *FirstChar = Str.begin(); 727 const char *SecondChar = Str.end(); 728 if (SecondChar == nullptr) { 729 assert(FirstChar == SecondChar); 730 ++FirstChar, ++SecondChar; 731 } 732 First = static_cast<const void *>(FirstChar); 733 Second = static_cast<const void *>(SecondChar); 734 } 735 736 /* implicit */ NodeOrString(Node *N) 737 : First(static_cast<const void *>(N)), Second(nullptr) {} 738 NodeOrString() : First(nullptr), Second(nullptr) {} 739 740 bool isString() const { return Second && First; } 741 bool isNode() const { return First && !Second; } 742 bool isEmpty() const { return !First && !Second; } 743 744 StringView asString() const { 745 assert(isString()); 746 return StringView(static_cast<const char *>(First), 747 static_cast<const char *>(Second)); 748 } 749 750 const Node *asNode() const { 751 assert(isNode()); 752 return static_cast<const Node *>(First); 753 } 754 }; 755 756 class ArrayType final : public Node { 757 Node *Base; 758 NodeOrString Dimension; 759 760 public: 761 ArrayType(Node *Base_, NodeOrString Dimension_) 762 : Node(KArrayType, 763 /*RHSComponentCache=*/Cache::Yes, 764 /*ArrayCache=*/Cache::Yes), 765 Base(Base_), Dimension(Dimension_) {} 766 767 // Incomplete array type. 768 ArrayType(Node *Base_) 769 : Node(KArrayType, 770 /*RHSComponentCache=*/Cache::Yes, 771 /*ArrayCache=*/Cache::Yes), 772 Base(Base_) {} 773 774 bool hasRHSComponentSlow(OutputStream &) const override { return true; } 775 bool hasArraySlow(OutputStream &) const override { return true; } 776 777 void printLeft(OutputStream &S) const override { Base->printLeft(S); } 778 779 void printRight(OutputStream &S) const override { 780 if (S.back() != ']') 781 S += " "; 782 S += "["; 783 if (Dimension.isString()) 784 S += Dimension.asString(); 785 else if (Dimension.isNode()) 786 Dimension.asNode()->print(S); 787 S += "]"; 788 Base->printRight(S); 789 } 790 }; 791 792 class FunctionType final : public Node { 793 Node *Ret; 794 NodeArray Params; 795 Qualifiers CVQuals; 796 FunctionRefQual RefQual; 797 Node *ExceptionSpec; 798 799 public: 800 FunctionType(Node *Ret_, NodeArray Params_, Qualifiers CVQuals_, 801 FunctionRefQual RefQual_, Node *ExceptionSpec_) 802 : Node(KFunctionType, 803 /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, 804 /*FunctionCache=*/Cache::Yes), 805 Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_), 806 ExceptionSpec(ExceptionSpec_) {} 807 808 bool hasRHSComponentSlow(OutputStream &) const override { return true; } 809 bool hasFunctionSlow(OutputStream &) const override { return true; } 810 811 // Handle C++'s ... quirky decl grammer by using the left & right 812 // distinction. Consider: 813 // int (*f(float))(char) {} 814 // f is a function that takes a float and returns a pointer to a function 815 // that takes a char and returns an int. If we're trying to print f, start 816 // by printing out the return types's left, then print our parameters, then 817 // finally print right of the return type. 818 void printLeft(OutputStream &S) const override { 819 Ret->printLeft(S); 820 S += " "; 821 } 822 823 void printRight(OutputStream &S) const override { 824 S += "("; 825 Params.printWithComma(S); 826 S += ")"; 827 Ret->printRight(S); 828 829 if (CVQuals & QualConst) 830 S += " const"; 831 if (CVQuals & QualVolatile) 832 S += " volatile"; 833 if (CVQuals & QualRestrict) 834 S += " restrict"; 835 836 if (RefQual == FrefQualLValue) 837 S += " &"; 838 else if (RefQual == FrefQualRValue) 839 S += " &&"; 840 841 if (ExceptionSpec != nullptr) { 842 S += ' '; 843 ExceptionSpec->print(S); 844 } 845 } 846 }; 847 848 class NoexceptSpec : public Node { 849 Node *E; 850 public: 851 NoexceptSpec(Node *E_) : Node(KNoexceptSpec), E(E_) {} 852 853 void printLeft(OutputStream &S) const override { 854 S += "noexcept("; 855 E->print(S); 856 S += ")"; 857 } 858 }; 859 860 class DynamicExceptionSpec : public Node { 861 NodeArray Types; 862 public: 863 DynamicExceptionSpec(NodeArray Types_) 864 : Node(KDynamicExceptionSpec), Types(Types_) {} 865 866 void printLeft(OutputStream &S) const override { 867 S += "throw("; 868 Types.printWithComma(S); 869 S += ')'; 870 } 871 }; 872 873 class FunctionEncoding final : public Node { 874 Node *Ret; 875 Node *Name; 876 NodeArray Params; 877 Node *Attrs; 878 Qualifiers CVQuals; 879 FunctionRefQual RefQual; 880 881 public: 882 FunctionEncoding(Node *Ret_, Node *Name_, NodeArray Params_, 883 Node *Attrs_, Qualifiers CVQuals_, FunctionRefQual RefQual_) 884 : Node(KFunctionEncoding, 885 /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No, 886 /*FunctionCache=*/Cache::Yes), 887 Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_), 888 CVQuals(CVQuals_), RefQual(RefQual_) {} 889 890 Qualifiers getCVQuals() const { return CVQuals; } 891 FunctionRefQual getRefQual() const { return RefQual; } 892 NodeArray getParams() const { return Params; } 893 Node *getReturnType() const { return Ret; } 894 895 bool hasRHSComponentSlow(OutputStream &) const override { return true; } 896 bool hasFunctionSlow(OutputStream &) const override { return true; } 897 898 Node *getName() { return const_cast<Node *>(Name); } 899 900 void printLeft(OutputStream &S) const override { 901 if (Ret) { 902 Ret->printLeft(S); 903 if (!Ret->hasRHSComponent(S)) 904 S += " "; 905 } 906 Name->print(S); 907 } 908 909 void printRight(OutputStream &S) const override { 910 S += "("; 911 Params.printWithComma(S); 912 S += ")"; 913 if (Ret) 914 Ret->printRight(S); 915 916 if (CVQuals & QualConst) 917 S += " const"; 918 if (CVQuals & QualVolatile) 919 S += " volatile"; 920 if (CVQuals & QualRestrict) 921 S += " restrict"; 922 923 if (RefQual == FrefQualLValue) 924 S += " &"; 925 else if (RefQual == FrefQualRValue) 926 S += " &&"; 927 928 if (Attrs != nullptr) 929 Attrs->print(S); 930 } 931 }; 932 933 class LiteralOperator : public Node { 934 const Node *OpName; 935 936 public: 937 LiteralOperator(Node *OpName_) : Node(KLiteralOperator), OpName(OpName_) {} 938 939 void printLeft(OutputStream &S) const override { 940 S += "operator\"\" "; 941 OpName->print(S); 942 } 943 }; 944 945 class SpecialName final : public Node { 946 const StringView Special; 947 const Node *Child; 948 949 public: 950 SpecialName(StringView Special_, Node* Child_) 951 : Node(KSpecialName), Special(Special_), Child(Child_) {} 952 953 void printLeft(OutputStream &S) const override { 954 S += Special; 955 Child->print(S); 956 } 957 }; 958 959 class CtorVtableSpecialName final : public Node { 960 const Node *FirstType; 961 const Node *SecondType; 962 963 public: 964 CtorVtableSpecialName(Node *FirstType_, Node *SecondType_) 965 : Node(KCtorVtableSpecialName), 966 FirstType(FirstType_), SecondType(SecondType_) {} 967 968 void printLeft(OutputStream &S) const override { 969 S += "construction vtable for "; 970 FirstType->print(S); 971 S += "-in-"; 972 SecondType->print(S); 973 } 974 }; 975 976 struct NestedName : Node { 977 Node *Qual; 978 Node *Name; 979 980 NestedName(Node *Qual_, Node *Name_) 981 : Node(KNestedName), Qual(Qual_), Name(Name_) {} 982 983 StringView getBaseName() const override { return Name->getBaseName(); } 984 985 void printLeft(OutputStream &S) const override { 986 Qual->print(S); 987 S += "::"; 988 Name->print(S); 989 } 990 }; 991 992 struct LocalName : Node { 993 Node *Encoding; 994 Node *Entity; 995 996 LocalName(Node *Encoding_, Node *Entity_) 997 : Node(KLocalName), Encoding(Encoding_), Entity(Entity_) {} 998 999 void printLeft(OutputStream &S) const override { 1000 Encoding->print(S); 1001 S += "::"; 1002 Entity->print(S); 1003 } 1004 }; 1005 1006 class QualifiedName final : public Node { 1007 // qualifier::name 1008 const Node *Qualifier; 1009 const Node *Name; 1010 1011 public: 1012 QualifiedName(Node* Qualifier_, Node* Name_) 1013 : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {} 1014 1015 StringView getBaseName() const override { return Name->getBaseName(); } 1016 1017 void printLeft(OutputStream &S) const override { 1018 Qualifier->print(S); 1019 S += "::"; 1020 Name->print(S); 1021 } 1022 }; 1023 1024 class VectorType final : public Node { 1025 const Node *BaseType; 1026 const NodeOrString Dimension; 1027 const bool IsPixel; 1028 1029 public: 1030 VectorType(NodeOrString Dimension_) 1031 : Node(KVectorType), BaseType(nullptr), Dimension(Dimension_), 1032 IsPixel(true) {} 1033 VectorType(Node *BaseType_, NodeOrString Dimension_) 1034 : Node(KVectorType), BaseType(BaseType_), 1035 Dimension(Dimension_), IsPixel(false) {} 1036 1037 void printLeft(OutputStream &S) const override { 1038 if (IsPixel) { 1039 S += "pixel vector["; 1040 S += Dimension.asString(); 1041 S += "]"; 1042 } else { 1043 BaseType->print(S); 1044 S += " vector["; 1045 if (Dimension.isNode()) 1046 Dimension.asNode()->print(S); 1047 else if (Dimension.isString()) 1048 S += Dimension.asString(); 1049 S += "]"; 1050 } 1051 } 1052 }; 1053 1054 /// An unexpanded parameter pack (either in the expression or type context). If 1055 /// this AST is correct, this node will have a ParameterPackExpansion node above 1056 /// it. 1057 /// 1058 /// This node is created when some <template-args> are found that apply to an 1059 /// <encoding>, and is stored in the TemplateParams table. In order for this to 1060 /// appear in the final AST, it has to referenced via a <template-param> (ie, 1061 /// T_). 1062 class ParameterPack final : public Node { 1063 NodeArray Data; 1064 1065 // Setup OutputStream for a pack expansion unless we're already expanding one. 1066 void initializePackExpansion(OutputStream &S) const { 1067 if (S.CurrentPackMax == std::numeric_limits<unsigned>::max()) { 1068 S.CurrentPackMax = static_cast<unsigned>(Data.size()); 1069 S.CurrentPackIndex = 0; 1070 } 1071 } 1072 1073 public: 1074 ParameterPack(NodeArray Data_) : Node(KParameterPack), Data(Data_) { 1075 ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown; 1076 if (std::all_of(Data.begin(), Data.end(), [](Node* P) { 1077 return P->ArrayCache == Cache::No; 1078 })) 1079 ArrayCache = Cache::No; 1080 if (std::all_of(Data.begin(), Data.end(), [](Node* P) { 1081 return P->FunctionCache == Cache::No; 1082 })) 1083 FunctionCache = Cache::No; 1084 if (std::all_of(Data.begin(), Data.end(), [](Node* P) { 1085 return P->RHSComponentCache == Cache::No; 1086 })) 1087 RHSComponentCache = Cache::No; 1088 } 1089 1090 bool hasRHSComponentSlow(OutputStream &S) const override { 1091 initializePackExpansion(S); 1092 size_t Idx = S.CurrentPackIndex; 1093 return Idx < Data.size() && Data[Idx]->hasRHSComponent(S); 1094 } 1095 bool hasArraySlow(OutputStream &S) const override { 1096 initializePackExpansion(S); 1097 size_t Idx = S.CurrentPackIndex; 1098 return Idx < Data.size() && Data[Idx]->hasArray(S); 1099 } 1100 bool hasFunctionSlow(OutputStream &S) const override { 1101 initializePackExpansion(S); 1102 size_t Idx = S.CurrentPackIndex; 1103 return Idx < Data.size() && Data[Idx]->hasFunction(S); 1104 } 1105 1106 void printLeft(OutputStream &S) const override { 1107 initializePackExpansion(S); 1108 size_t Idx = S.CurrentPackIndex; 1109 if (Idx < Data.size()) 1110 Data[Idx]->printLeft(S); 1111 } 1112 void printRight(OutputStream &S) const override { 1113 initializePackExpansion(S); 1114 size_t Idx = S.CurrentPackIndex; 1115 if (Idx < Data.size()) 1116 Data[Idx]->printRight(S); 1117 } 1118 }; 1119 1120 /// A variadic template argument. This node represents an occurance of 1121 /// J<something>E in some <template-args>. It isn't itself unexpanded, unless 1122 /// one of it's Elements is. The parser inserts a ParameterPack into the 1123 /// TemplateParams table if the <template-args> this pack belongs to apply to an 1124 /// <encoding>. 1125 class TemplateArgumentPack final : public Node { 1126 NodeArray Elements; 1127 public: 1128 TemplateArgumentPack(NodeArray Elements_) 1129 : Node(KTemplateArgumentPack), Elements(Elements_) {} 1130 1131 NodeArray getElements() const { return Elements; } 1132 1133 void printLeft(OutputStream &S) const override { 1134 Elements.printWithComma(S); 1135 } 1136 }; 1137 1138 /// A pack expansion. Below this node, there are some unexpanded ParameterPacks 1139 /// which each have Child->ParameterPackSize elements. 1140 class ParameterPackExpansion final : public Node { 1141 const Node *Child; 1142 1143 public: 1144 ParameterPackExpansion(Node* Child_) 1145 : Node(KParameterPackExpansion), Child(Child_) {} 1146 1147 const Node *getChild() const { return Child; } 1148 1149 void printLeft(OutputStream &S) const override { 1150 constexpr unsigned Max = std::numeric_limits<unsigned>::max(); 1151 SwapAndRestore<unsigned> SavePackIdx(S.CurrentPackIndex, Max); 1152 SwapAndRestore<unsigned> SavePackMax(S.CurrentPackMax, Max); 1153 size_t StreamPos = S.getCurrentPosition(); 1154 1155 // Print the first element in the pack. If Child contains a ParameterPack, 1156 // it will set up S.CurrentPackMax and print the first element. 1157 Child->print(S); 1158 1159 // No ParameterPack was found in Child. This can occur if we've found a pack 1160 // expansion on a <function-param>. 1161 if (S.CurrentPackMax == Max) { 1162 S += "..."; 1163 return; 1164 } 1165 1166 // We found a ParameterPack, but it has no elements. Erase whatever we may 1167 // of printed. 1168 if (S.CurrentPackMax == 0) { 1169 S.setCurrentPosition(StreamPos); 1170 return; 1171 } 1172 1173 // Else, iterate through the rest of the elements in the pack. 1174 for (unsigned I = 1, E = S.CurrentPackMax; I < E; ++I) { 1175 S += ", "; 1176 S.CurrentPackIndex = I; 1177 Child->print(S); 1178 } 1179 } 1180 }; 1181 1182 class TemplateArgs final : public Node { 1183 NodeArray Params; 1184 1185 public: 1186 TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {} 1187 1188 NodeArray getParams() { return Params; } 1189 1190 void printLeft(OutputStream &S) const override { 1191 S += "<"; 1192 Params.printWithComma(S); 1193 if (S.back() == '>') 1194 S += " "; 1195 S += ">"; 1196 } 1197 }; 1198 1199 struct ForwardTemplateReference : Node { 1200 size_t Index; 1201 Node *Ref = nullptr; 1202 1203 // If we're currently printing this node. It is possible (though invalid) for 1204 // a forward template reference to refer to itself via a substitution. This 1205 // creates a cyclic AST, which will stack overflow printing. To fix this, bail 1206 // out if more than one print* function is active. 1207 mutable bool Printing = false; 1208 1209 ForwardTemplateReference(size_t Index_) 1210 : Node(KForwardTemplateReference, Cache::Unknown, Cache::Unknown, 1211 Cache::Unknown), 1212 Index(Index_) {} 1213 1214 bool hasRHSComponentSlow(OutputStream &S) const override { 1215 if (Printing) 1216 return false; 1217 SwapAndRestore<bool> SavePrinting(Printing, true); 1218 return Ref->hasRHSComponent(S); 1219 } 1220 bool hasArraySlow(OutputStream &S) const override { 1221 if (Printing) 1222 return false; 1223 SwapAndRestore<bool> SavePrinting(Printing, true); 1224 return Ref->hasArray(S); 1225 } 1226 bool hasFunctionSlow(OutputStream &S) const override { 1227 if (Printing) 1228 return false; 1229 SwapAndRestore<bool> SavePrinting(Printing, true); 1230 return Ref->hasFunction(S); 1231 } 1232 1233 void printLeft(OutputStream &S) const override { 1234 if (Printing) 1235 return; 1236 SwapAndRestore<bool> SavePrinting(Printing, true); 1237 Ref->printLeft(S); 1238 } 1239 void printRight(OutputStream &S) const override { 1240 if (Printing) 1241 return; 1242 SwapAndRestore<bool> SavePrinting(Printing, true); 1243 Ref->printRight(S); 1244 } 1245 }; 1246 1247 struct NameWithTemplateArgs : Node { 1248 // name<template_args> 1249 Node *Name; 1250 Node *TemplateArgs; 1251 1252 NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_) 1253 : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {} 1254 1255 StringView getBaseName() const override { return Name->getBaseName(); } 1256 1257 void printLeft(OutputStream &S) const override { 1258 Name->print(S); 1259 TemplateArgs->print(S); 1260 } 1261 }; 1262 1263 class GlobalQualifiedName final : public Node { 1264 Node *Child; 1265 1266 public: 1267 GlobalQualifiedName(Node* Child_) 1268 : Node(KGlobalQualifiedName), Child(Child_) {} 1269 1270 StringView getBaseName() const override { return Child->getBaseName(); } 1271 1272 void printLeft(OutputStream &S) const override { 1273 S += "::"; 1274 Child->print(S); 1275 } 1276 }; 1277 1278 struct StdQualifiedName : Node { 1279 Node *Child; 1280 1281 StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {} 1282 1283 StringView getBaseName() const override { return Child->getBaseName(); } 1284 1285 void printLeft(OutputStream &S) const override { 1286 S += "std::"; 1287 Child->print(S); 1288 } 1289 }; 1290 1291 enum class SpecialSubKind { 1292 allocator, 1293 basic_string, 1294 string, 1295 istream, 1296 ostream, 1297 iostream, 1298 }; 1299 1300 class ExpandedSpecialSubstitution final : public Node { 1301 SpecialSubKind SSK; 1302 1303 public: 1304 ExpandedSpecialSubstitution(SpecialSubKind SSK_) 1305 : Node(KExpandedSpecialSubstitution), SSK(SSK_) {} 1306 1307 StringView getBaseName() const override { 1308 switch (SSK) { 1309 case SpecialSubKind::allocator: 1310 return StringView("allocator"); 1311 case SpecialSubKind::basic_string: 1312 return StringView("basic_string"); 1313 case SpecialSubKind::string: 1314 return StringView("basic_string"); 1315 case SpecialSubKind::istream: 1316 return StringView("basic_istream"); 1317 case SpecialSubKind::ostream: 1318 return StringView("basic_ostream"); 1319 case SpecialSubKind::iostream: 1320 return StringView("basic_iostream"); 1321 } 1322 LLVM_BUILTIN_UNREACHABLE; 1323 } 1324 1325 void printLeft(OutputStream &S) const override { 1326 switch (SSK) { 1327 case SpecialSubKind::allocator: 1328 S += "std::basic_string<char, std::char_traits<char>, " 1329 "std::allocator<char> >"; 1330 break; 1331 case SpecialSubKind::basic_string: 1332 case SpecialSubKind::string: 1333 S += "std::basic_string<char, std::char_traits<char>, " 1334 "std::allocator<char> >"; 1335 break; 1336 case SpecialSubKind::istream: 1337 S += "std::basic_istream<char, std::char_traits<char> >"; 1338 break; 1339 case SpecialSubKind::ostream: 1340 S += "std::basic_ostream<char, std::char_traits<char> >"; 1341 break; 1342 case SpecialSubKind::iostream: 1343 S += "std::basic_iostream<char, std::char_traits<char> >"; 1344 break; 1345 } 1346 } 1347 }; 1348 1349 class SpecialSubstitution final : public Node { 1350 public: 1351 SpecialSubKind SSK; 1352 1353 SpecialSubstitution(SpecialSubKind SSK_) 1354 : Node(KSpecialSubstitution), SSK(SSK_) {} 1355 1356 StringView getBaseName() const override { 1357 switch (SSK) { 1358 case SpecialSubKind::allocator: 1359 return StringView("allocator"); 1360 case SpecialSubKind::basic_string: 1361 return StringView("basic_string"); 1362 case SpecialSubKind::string: 1363 return StringView("string"); 1364 case SpecialSubKind::istream: 1365 return StringView("istream"); 1366 case SpecialSubKind::ostream: 1367 return StringView("ostream"); 1368 case SpecialSubKind::iostream: 1369 return StringView("iostream"); 1370 } 1371 LLVM_BUILTIN_UNREACHABLE; 1372 } 1373 1374 void printLeft(OutputStream &S) const override { 1375 switch (SSK) { 1376 case SpecialSubKind::allocator: 1377 S += "std::allocator"; 1378 break; 1379 case SpecialSubKind::basic_string: 1380 S += "std::basic_string"; 1381 break; 1382 case SpecialSubKind::string: 1383 S += "std::string"; 1384 break; 1385 case SpecialSubKind::istream: 1386 S += "std::istream"; 1387 break; 1388 case SpecialSubKind::ostream: 1389 S += "std::ostream"; 1390 break; 1391 case SpecialSubKind::iostream: 1392 S += "std::iostream"; 1393 break; 1394 } 1395 } 1396 }; 1397 1398 class CtorDtorName final : public Node { 1399 const Node *Basename; 1400 const bool IsDtor; 1401 1402 public: 1403 CtorDtorName(Node *Basename_, bool IsDtor_) 1404 : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_) {} 1405 1406 void printLeft(OutputStream &S) const override { 1407 if (IsDtor) 1408 S += "~"; 1409 S += Basename->getBaseName(); 1410 } 1411 }; 1412 1413 class DtorName : public Node { 1414 const Node *Base; 1415 1416 public: 1417 DtorName(Node *Base_) : Node(KDtorName), Base(Base_) {} 1418 1419 void printLeft(OutputStream &S) const override { 1420 S += "~"; 1421 Base->printLeft(S); 1422 } 1423 }; 1424 1425 class UnnamedTypeName : public Node { 1426 const StringView Count; 1427 1428 public: 1429 UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {} 1430 1431 void printLeft(OutputStream &S) const override { 1432 S += "'unnamed"; 1433 S += Count; 1434 S += "\'"; 1435 } 1436 }; 1437 1438 class ClosureTypeName : public Node { 1439 NodeArray Params; 1440 StringView Count; 1441 1442 public: 1443 ClosureTypeName(NodeArray Params_, StringView Count_) 1444 : Node(KClosureTypeName), Params(Params_), Count(Count_) {} 1445 1446 void printLeft(OutputStream &S) const override { 1447 S += "\'lambda"; 1448 S += Count; 1449 S += "\'("; 1450 Params.printWithComma(S); 1451 S += ")"; 1452 } 1453 }; 1454 1455 class StructuredBindingName : public Node { 1456 NodeArray Bindings; 1457 public: 1458 StructuredBindingName(NodeArray Bindings_) 1459 : Node(KStructuredBindingName), Bindings(Bindings_) {} 1460 1461 void printLeft(OutputStream &S) const override { 1462 S += '['; 1463 Bindings.printWithComma(S); 1464 S += ']'; 1465 } 1466 }; 1467 1468 // -- Expression Nodes -- 1469 1470 struct Expr : public Node { 1471 Expr(Kind K = KExpr) : Node(K) {} 1472 }; 1473 1474 class BinaryExpr : public Expr { 1475 const Node *LHS; 1476 const StringView InfixOperator; 1477 const Node *RHS; 1478 1479 public: 1480 BinaryExpr(Node *LHS_, StringView InfixOperator_, Node *RHS_) 1481 : LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) {} 1482 1483 void printLeft(OutputStream &S) const override { 1484 // might be a template argument expression, then we need to disambiguate 1485 // with parens. 1486 if (InfixOperator == ">") 1487 S += "("; 1488 1489 S += "("; 1490 LHS->print(S); 1491 S += ") "; 1492 S += InfixOperator; 1493 S += " ("; 1494 RHS->print(S); 1495 S += ")"; 1496 1497 if (InfixOperator == ">") 1498 S += ")"; 1499 } 1500 }; 1501 1502 class ArraySubscriptExpr : public Expr { 1503 const Node *Op1; 1504 const Node *Op2; 1505 1506 public: 1507 ArraySubscriptExpr(Node *Op1_, Node *Op2_) : Op1(Op1_), Op2(Op2_) {} 1508 1509 void printLeft(OutputStream &S) const override { 1510 S += "("; 1511 Op1->print(S); 1512 S += ")["; 1513 Op2->print(S); 1514 S += "]"; 1515 } 1516 }; 1517 1518 class PostfixExpr : public Expr { 1519 const Node *Child; 1520 const StringView Operand; 1521 1522 public: 1523 PostfixExpr(Node *Child_, StringView Operand_) 1524 : Child(Child_), Operand(Operand_) {} 1525 1526 void printLeft(OutputStream &S) const override { 1527 S += "("; 1528 Child->print(S); 1529 S += ")"; 1530 S += Operand; 1531 } 1532 }; 1533 1534 class ConditionalExpr : public Expr { 1535 const Node *Cond; 1536 const Node *Then; 1537 const Node *Else; 1538 1539 public: 1540 ConditionalExpr(Node *Cond_, Node *Then_, Node *Else_) 1541 : Cond(Cond_), Then(Then_), Else(Else_) {} 1542 1543 void printLeft(OutputStream &S) const override { 1544 S += "("; 1545 Cond->print(S); 1546 S += ") ? ("; 1547 Then->print(S); 1548 S += ") : ("; 1549 Else->print(S); 1550 S += ")"; 1551 } 1552 }; 1553 1554 class MemberExpr : public Expr { 1555 const Node *LHS; 1556 const StringView Kind; 1557 const Node *RHS; 1558 1559 public: 1560 MemberExpr(Node *LHS_, StringView Kind_, Node *RHS_) 1561 : LHS(LHS_), Kind(Kind_), RHS(RHS_) {} 1562 1563 void printLeft(OutputStream &S) const override { 1564 LHS->print(S); 1565 S += Kind; 1566 RHS->print(S); 1567 } 1568 }; 1569 1570 class EnclosingExpr : public Expr { 1571 const StringView Prefix; 1572 const Node *Infix; 1573 const StringView Postfix; 1574 1575 public: 1576 EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_) 1577 : Prefix(Prefix_), Infix(Infix_), Postfix(Postfix_) {} 1578 1579 void printLeft(OutputStream &S) const override { 1580 S += Prefix; 1581 Infix->print(S); 1582 S += Postfix; 1583 } 1584 }; 1585 1586 class CastExpr : public Expr { 1587 // cast_kind<to>(from) 1588 const StringView CastKind; 1589 const Node *To; 1590 const Node *From; 1591 1592 public: 1593 CastExpr(StringView CastKind_, Node *To_, Node *From_) 1594 : CastKind(CastKind_), To(To_), From(From_) {} 1595 1596 void printLeft(OutputStream &S) const override { 1597 S += CastKind; 1598 S += "<"; 1599 To->printLeft(S); 1600 S += ">("; 1601 From->printLeft(S); 1602 S += ")"; 1603 } 1604 }; 1605 1606 class SizeofParamPackExpr : public Expr { 1607 Node *Pack; 1608 1609 public: 1610 SizeofParamPackExpr(Node *Pack_) : Pack(Pack_) {} 1611 1612 void printLeft(OutputStream &S) const override { 1613 S += "sizeof...("; 1614 ParameterPackExpansion PPE(Pack); 1615 PPE.printLeft(S); 1616 S += ")"; 1617 } 1618 }; 1619 1620 class CallExpr : public Expr { 1621 const Node *Callee; 1622 NodeArray Args; 1623 1624 public: 1625 CallExpr(Node *Callee_, NodeArray Args_) : Callee(Callee_), Args(Args_) {} 1626 1627 void printLeft(OutputStream &S) const override { 1628 Callee->print(S); 1629 S += "("; 1630 Args.printWithComma(S); 1631 S += ")"; 1632 } 1633 }; 1634 1635 class NewExpr : public Expr { 1636 // new (expr_list) type(init_list) 1637 NodeArray ExprList; 1638 Node *Type; 1639 NodeArray InitList; 1640 bool IsGlobal; // ::operator new ? 1641 bool IsArray; // new[] ? 1642 public: 1643 NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_, 1644 bool IsArray_) 1645 : ExprList(ExprList_), Type(Type_), InitList(InitList_), 1646 IsGlobal(IsGlobal_), IsArray(IsArray_) {} 1647 1648 void printLeft(OutputStream &S) const override { 1649 if (IsGlobal) 1650 S += "::operator "; 1651 S += "new"; 1652 if (IsArray) 1653 S += "[]"; 1654 S += ' '; 1655 if (!ExprList.empty()) { 1656 S += "("; 1657 ExprList.printWithComma(S); 1658 S += ")"; 1659 } 1660 Type->print(S); 1661 if (!InitList.empty()) { 1662 S += "("; 1663 InitList.printWithComma(S); 1664 S += ")"; 1665 } 1666 1667 } 1668 }; 1669 1670 class DeleteExpr : public Expr { 1671 Node *Op; 1672 bool IsGlobal; 1673 bool IsArray; 1674 1675 public: 1676 DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_) 1677 : Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {} 1678 1679 void printLeft(OutputStream &S) const override { 1680 if (IsGlobal) 1681 S += "::"; 1682 S += "delete"; 1683 if (IsArray) 1684 S += "[] "; 1685 Op->print(S); 1686 } 1687 }; 1688 1689 class PrefixExpr : public Expr { 1690 StringView Prefix; 1691 Node *Child; 1692 1693 public: 1694 PrefixExpr(StringView Prefix_, Node *Child_) : Prefix(Prefix_), Child(Child_) {} 1695 1696 void printLeft(OutputStream &S) const override { 1697 S += Prefix; 1698 S += "("; 1699 Child->print(S); 1700 S += ")"; 1701 } 1702 }; 1703 1704 class FunctionParam : public Expr { 1705 StringView Number; 1706 1707 public: 1708 FunctionParam(StringView Number_) : Number(Number_) {} 1709 1710 void printLeft(OutputStream &S) const override { 1711 S += "fp"; 1712 S += Number; 1713 } 1714 }; 1715 1716 class ConversionExpr : public Expr { 1717 const Node *Type; 1718 NodeArray Expressions; 1719 1720 public: 1721 ConversionExpr(const Node *Type_, NodeArray Expressions_) 1722 : Type(Type_), Expressions(Expressions_) {} 1723 1724 void printLeft(OutputStream &S) const override { 1725 S += "("; 1726 Type->print(S); 1727 S += ")("; 1728 Expressions.printWithComma(S); 1729 S += ")"; 1730 } 1731 }; 1732 1733 class InitListExpr : public Expr { 1734 Node *Ty; 1735 NodeArray Inits; 1736 public: 1737 InitListExpr(Node *Ty_, NodeArray Inits_) : Ty(Ty_), Inits(Inits_) {} 1738 1739 void printLeft(OutputStream &S) const override { 1740 if (Ty) 1741 Ty->print(S); 1742 S += '{'; 1743 Inits.printWithComma(S); 1744 S += '}'; 1745 } 1746 }; 1747 1748 class BracedExpr : public Expr { 1749 Node *Elem; 1750 Node *Init; 1751 bool IsArray; 1752 public: 1753 BracedExpr(Node *Elem_, Node *Init_, bool IsArray_) 1754 : Expr(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {} 1755 1756 void printLeft(OutputStream &S) const override { 1757 if (IsArray) { 1758 S += '['; 1759 Elem->print(S); 1760 S += ']'; 1761 } else { 1762 S += '.'; 1763 Elem->print(S); 1764 } 1765 if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) 1766 S += " = "; 1767 Init->print(S); 1768 } 1769 }; 1770 1771 class BracedRangeExpr : public Expr { 1772 Node *First; 1773 Node *Last; 1774 Node *Init; 1775 public: 1776 BracedRangeExpr(Node *First_, Node *Last_, Node *Init_) 1777 : Expr(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {} 1778 1779 void printLeft(OutputStream &S) const override { 1780 S += '['; 1781 First->print(S); 1782 S += " ... "; 1783 Last->print(S); 1784 S += ']'; 1785 if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr) 1786 S += " = "; 1787 Init->print(S); 1788 } 1789 }; 1790 1791 struct FoldExpr : Expr { 1792 Node *Pack, *Init; 1793 StringView OperatorName; 1794 bool IsLeftFold; 1795 1796 FoldExpr(bool IsLeftFold_, StringView OperatorName_, Node *Pack_, Node *Init_) 1797 : Pack(Pack_), Init(Init_), OperatorName(OperatorName_), 1798 IsLeftFold(IsLeftFold_) {} 1799 1800 void printLeft(OutputStream &S) const override { 1801 auto PrintPack = [&] { 1802 S += '('; 1803 ParameterPackExpansion(Pack).print(S); 1804 S += ')'; 1805 }; 1806 1807 S += '('; 1808 1809 if (IsLeftFold) { 1810 // init op ... op pack 1811 if (Init != nullptr) { 1812 Init->print(S); 1813 S += ' '; 1814 S += OperatorName; 1815 S += ' '; 1816 } 1817 // ... op pack 1818 S += "... "; 1819 S += OperatorName; 1820 S += ' '; 1821 PrintPack(); 1822 } else { // !IsLeftFold 1823 // pack op ... 1824 PrintPack(); 1825 S += ' '; 1826 S += OperatorName; 1827 S += " ..."; 1828 // pack op ... op init 1829 if (Init != nullptr) { 1830 S += ' '; 1831 S += OperatorName; 1832 S += ' '; 1833 Init->print(S); 1834 } 1835 } 1836 S += ')'; 1837 } 1838 }; 1839 1840 class ThrowExpr : public Expr { 1841 const Node *Op; 1842 1843 public: 1844 ThrowExpr(Node *Op_) : Op(Op_) {} 1845 1846 void printLeft(OutputStream &S) const override { 1847 S += "throw "; 1848 Op->print(S); 1849 } 1850 }; 1851 1852 class BoolExpr : public Expr { 1853 bool Value; 1854 1855 public: 1856 BoolExpr(bool Value_) : Value(Value_) {} 1857 1858 void printLeft(OutputStream &S) const override { 1859 S += Value ? StringView("true") : StringView("false"); 1860 } 1861 }; 1862 1863 class IntegerCastExpr : public Expr { 1864 // ty(integer) 1865 Node *Ty; 1866 StringView Integer; 1867 1868 public: 1869 IntegerCastExpr(Node *Ty_, StringView Integer_) 1870 : Ty(Ty_), Integer(Integer_) {} 1871 1872 void printLeft(OutputStream &S) const override { 1873 S += "("; 1874 Ty->print(S); 1875 S += ")"; 1876 S += Integer; 1877 } 1878 }; 1879 1880 class IntegerExpr : public Expr { 1881 StringView Type; 1882 StringView Value; 1883 1884 public: 1885 IntegerExpr(StringView Type_, StringView Value_) : Type(Type_), Value(Value_) {} 1886 1887 void printLeft(OutputStream &S) const override { 1888 if (Type.size() > 3) { 1889 S += "("; 1890 S += Type; 1891 S += ")"; 1892 } 1893 1894 if (Value[0] == 'n') { 1895 S += "-"; 1896 S += Value.dropFront(1); 1897 } else 1898 S += Value; 1899 1900 if (Type.size() <= 3) 1901 S += Type; 1902 } 1903 }; 1904 1905 template <class Float> struct FloatData; 1906 1907 template <class Float> class FloatExpr : public Expr { 1908 const StringView Contents; 1909 1910 public: 1911 FloatExpr(StringView Contents_) : Contents(Contents_) {} 1912 1913 void printLeft(OutputStream &s) const override { 1914 const char *first = Contents.begin(); 1915 const char *last = Contents.end() + 1; 1916 1917 const size_t N = FloatData<Float>::mangled_size; 1918 if (static_cast<std::size_t>(last - first) > N) { 1919 last = first + N; 1920 union { 1921 Float value; 1922 char buf[sizeof(Float)]; 1923 }; 1924 const char *t = first; 1925 char *e = buf; 1926 for (; t != last; ++t, ++e) { 1927 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') 1928 : static_cast<unsigned>(*t - 'a' + 10); 1929 ++t; 1930 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') 1931 : static_cast<unsigned>(*t - 'a' + 10); 1932 *e = static_cast<char>((d1 << 4) + d0); 1933 } 1934 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ 1935 std::reverse(buf, e); 1936 #endif 1937 char num[FloatData<Float>::max_demangled_size] = {0}; 1938 int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value); 1939 s += StringView(num, num + n); 1940 } 1941 } 1942 }; 1943 1944 class BumpPointerAllocator { 1945 struct BlockMeta { 1946 BlockMeta* Next; 1947 size_t Current; 1948 }; 1949 1950 static constexpr size_t AllocSize = 4096; 1951 static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta); 1952 1953 alignas(16) char InitialBuffer[AllocSize]; 1954 BlockMeta* BlockList = nullptr; 1955 1956 void grow() { 1957 char* NewMeta = new char[AllocSize]; 1958 BlockList = new (NewMeta) BlockMeta{BlockList, 0}; 1959 } 1960 1961 void* allocateMassive(size_t NBytes) { 1962 NBytes += sizeof(BlockMeta); 1963 BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(new char[NBytes]); 1964 BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0}; 1965 return static_cast<void*>(NewMeta + 1); 1966 } 1967 1968 public: 1969 BumpPointerAllocator() 1970 : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {} 1971 1972 void* allocate(size_t N) { 1973 N = (N + 15u) & ~15u; 1974 if (N + BlockList->Current >= UsableAllocSize) { 1975 if (N > UsableAllocSize) 1976 return allocateMassive(N); 1977 grow(); 1978 } 1979 BlockList->Current += N; 1980 return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) + 1981 BlockList->Current - N); 1982 } 1983 1984 void reset() { 1985 while (BlockList) { 1986 BlockMeta* Tmp = BlockList; 1987 BlockList = BlockList->Next; 1988 if (reinterpret_cast<char*>(Tmp) != InitialBuffer) 1989 delete[] reinterpret_cast<char*>(Tmp); 1990 } 1991 BlockList = new (InitialBuffer) BlockMeta{nullptr, 0}; 1992 } 1993 1994 ~BumpPointerAllocator() { reset(); } 1995 }; 1996 1997 template <class T, size_t N> 1998 class PODSmallVector { 1999 static_assert(std::is_pod<T>::value, 2000 "T is required to be a plain old data type"); 2001 2002 T* First; 2003 T* Last; 2004 T* Cap; 2005 T Inline[N]; 2006 2007 bool isInline() const { return First == Inline; } 2008 2009 void clearInline() { 2010 First = Inline; 2011 Last = Inline; 2012 Cap = Inline + N; 2013 } 2014 2015 void reserve(size_t NewCap) { 2016 size_t S = size(); 2017 if (isInline()) { 2018 auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T))); 2019 std::copy(First, Last, Tmp); 2020 First = Tmp; 2021 } else 2022 First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T))); 2023 Last = First + S; 2024 Cap = First + NewCap; 2025 } 2026 2027 public: 2028 PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {} 2029 2030 PODSmallVector(const PODSmallVector&) = delete; 2031 PODSmallVector& operator=(const PODSmallVector&) = delete; 2032 2033 PODSmallVector(PODSmallVector&& Other) : PODSmallVector() { 2034 if (Other.isInline()) { 2035 std::copy(Other.begin(), Other.end(), First); 2036 Last = First + Other.size(); 2037 Other.clear(); 2038 return; 2039 } 2040 2041 First = Other.First; 2042 Last = Other.Last; 2043 Cap = Other.Cap; 2044 Other.clearInline(); 2045 } 2046 2047 PODSmallVector& operator=(PODSmallVector&& Other) { 2048 if (Other.isInline()) { 2049 if (!isInline()) { 2050 std::free(First); 2051 clearInline(); 2052 } 2053 std::copy(Other.begin(), Other.end(), First); 2054 Last = First + Other.size(); 2055 Other.clear(); 2056 return *this; 2057 } 2058 2059 if (isInline()) { 2060 First = Other.First; 2061 Last = Other.Last; 2062 Cap = Other.Cap; 2063 Other.clearInline(); 2064 return *this; 2065 } 2066 2067 std::swap(First, Other.First); 2068 std::swap(Last, Other.Last); 2069 std::swap(Cap, Other.Cap); 2070 Other.clear(); 2071 return *this; 2072 } 2073 2074 void push_back(const T& Elem) { 2075 if (Last == Cap) 2076 reserve(size() * 2); 2077 *Last++ = Elem; 2078 } 2079 2080 void pop_back() { 2081 assert(Last != First && "Popping empty vector!"); 2082 --Last; 2083 } 2084 2085 void dropBack(size_t Index) { 2086 assert(Index <= size() && "dropBack() can't expand!"); 2087 Last = First + Index; 2088 } 2089 2090 T* begin() { return First; } 2091 T* end() { return Last; } 2092 2093 bool empty() const { return First == Last; } 2094 size_t size() const { return static_cast<size_t>(Last - First); } 2095 T& back() { 2096 assert(Last != First && "Calling back() on empty vector!"); 2097 return *(Last - 1); 2098 } 2099 T& operator[](size_t Index) { 2100 assert(Index < size() && "Invalid access!"); 2101 return *(begin() + Index); 2102 } 2103 void clear() { Last = First; } 2104 2105 ~PODSmallVector() { 2106 if (!isInline()) 2107 std::free(First); 2108 } 2109 }; 2110 2111 struct Db { 2112 const char *First; 2113 const char *Last; 2114 2115 // Name stack, this is used by the parser to hold temporary names that were 2116 // parsed. The parser colapses multiple names into new nodes to construct 2117 // the AST. Once the parser is finished, names.size() == 1. 2118 PODSmallVector<Node *, 32> Names; 2119 2120 // Substitution table. Itanium supports name substitutions as a means of 2121 // compression. The string "S42_" refers to the 44nd entry (base-36) in this 2122 // table. 2123 PODSmallVector<Node *, 32> Subs; 2124 2125 // Template parameter table. Like the above, but referenced like "T42_". 2126 // This has a smaller size compared to Subs and Names because it can be 2127 // stored on the stack. 2128 PODSmallVector<Node *, 8> TemplateParams; 2129 2130 // Set of unresolved forward <template-param> references. These can occur in a 2131 // conversion operator's type, and are resolved in the enclosing <encoding>. 2132 PODSmallVector<ForwardTemplateReference *, 4> ForwardTemplateRefs; 2133 2134 bool TryToParseTemplateArgs = true; 2135 bool PermitForwardTemplateReferences = false; 2136 bool ParsingLambdaParams = false; 2137 2138 BumpPointerAllocator ASTAllocator; 2139 2140 Db(const char *First_, const char *Last_) : First(First_), Last(Last_) {} 2141 2142 void reset(const char *First_, const char *Last_) { 2143 First = First_; 2144 Last = Last_; 2145 Names.clear(); 2146 Subs.clear(); 2147 TemplateParams.clear(); 2148 ParsingLambdaParams = false; 2149 TryToParseTemplateArgs = true; 2150 PermitForwardTemplateReferences = false; 2151 ASTAllocator.reset(); 2152 } 2153 2154 template <class T, class... Args> T *make(Args &&... args) { 2155 return new (ASTAllocator.allocate(sizeof(T))) 2156 T(std::forward<Args>(args)...); 2157 } 2158 2159 template <class It> NodeArray makeNodeArray(It begin, It end) { 2160 size_t sz = static_cast<size_t>(end - begin); 2161 void *mem = ASTAllocator.allocate(sizeof(Node *) * sz); 2162 Node **data = new (mem) Node *[sz]; 2163 std::copy(begin, end, data); 2164 return NodeArray(data, sz); 2165 } 2166 2167 NodeArray popTrailingNodeArray(size_t FromPosition) { 2168 assert(FromPosition <= Names.size()); 2169 NodeArray res = 2170 makeNodeArray(Names.begin() + (long)FromPosition, Names.end()); 2171 Names.dropBack(FromPosition); 2172 return res; 2173 } 2174 2175 bool consumeIf(StringView S) { 2176 if (StringView(First, Last).startsWith(S)) { 2177 First += S.size(); 2178 return true; 2179 } 2180 return false; 2181 } 2182 2183 bool consumeIf(char C) { 2184 if (First != Last && *First == C) { 2185 ++First; 2186 return true; 2187 } 2188 return false; 2189 } 2190 2191 char consume() { return First != Last ? *First++ : '\0'; } 2192 2193 char look(unsigned Lookahead = 0) { 2194 if (static_cast<size_t>(Last - First) <= Lookahead) 2195 return '\0'; 2196 return First[Lookahead]; 2197 } 2198 2199 size_t numLeft() const { return static_cast<size_t>(Last - First); } 2200 2201 StringView parseNumber(bool AllowNegative = false); 2202 Qualifiers parseCVQualifiers(); 2203 bool parsePositiveInteger(size_t *Out); 2204 StringView parseBareSourceName(); 2205 2206 bool parseSeqId(size_t *Out); 2207 Node *parseSubstitution(); 2208 Node *parseTemplateParam(); 2209 Node *parseTemplateArgs(bool TagTemplates = false); 2210 Node *parseTemplateArg(); 2211 2212 /// Parse the <expr> production. 2213 Node *parseExpr(); 2214 Node *parsePrefixExpr(StringView Kind); 2215 Node *parseBinaryExpr(StringView Kind); 2216 Node *parseIntegerLiteral(StringView Lit); 2217 Node *parseExprPrimary(); 2218 template <class Float> Node *parseFloatingLiteral(); 2219 Node *parseFunctionParam(); 2220 Node *parseNewExpr(); 2221 Node *parseConversionExpr(); 2222 Node *parseBracedExpr(); 2223 Node *parseFoldExpr(); 2224 2225 /// Parse the <type> production. 2226 Node *parseType(); 2227 Node *parseFunctionType(); 2228 Node *parseVectorType(); 2229 Node *parseDecltype(); 2230 Node *parseArrayType(); 2231 Node *parsePointerToMemberType(); 2232 Node *parseClassEnumType(); 2233 Node *parseQualifiedType(); 2234 2235 Node *parseEncoding(); 2236 bool parseCallOffset(); 2237 Node *parseSpecialName(); 2238 2239 /// Holds some extra information about a <name> that is being parsed. This 2240 /// information is only pertinent if the <name> refers to an <encoding>. 2241 struct NameState { 2242 bool CtorDtorConversion = false; 2243 bool EndsWithTemplateArgs = false; 2244 Qualifiers CVQualifiers = QualNone; 2245 FunctionRefQual ReferenceQualifier = FrefQualNone; 2246 size_t ForwardTemplateRefsBegin; 2247 2248 NameState(Db *Enclosing) 2249 : ForwardTemplateRefsBegin(Enclosing->ForwardTemplateRefs.size()) {} 2250 }; 2251 2252 bool resolveForwardTemplateRefs(NameState &State) { 2253 size_t I = State.ForwardTemplateRefsBegin; 2254 size_t E = ForwardTemplateRefs.size(); 2255 for (; I < E; ++I) { 2256 size_t Idx = ForwardTemplateRefs[I]->Index; 2257 if (Idx >= TemplateParams.size()) 2258 return true; 2259 ForwardTemplateRefs[I]->Ref = TemplateParams[Idx]; 2260 } 2261 ForwardTemplateRefs.dropBack(State.ForwardTemplateRefsBegin); 2262 return false; 2263 } 2264 2265 /// Parse the <name> production> 2266 Node *parseName(NameState *State = nullptr); 2267 Node *parseLocalName(NameState *State); 2268 Node *parseOperatorName(NameState *State); 2269 Node *parseUnqualifiedName(NameState *State); 2270 Node *parseUnnamedTypeName(NameState *State); 2271 Node *parseSourceName(NameState *State); 2272 Node *parseUnscopedName(NameState *State); 2273 Node *parseNestedName(NameState *State); 2274 Node *parseCtorDtorName(Node *&SoFar, NameState *State); 2275 2276 Node *parseAbiTags(Node *N); 2277 2278 /// Parse the <unresolved-name> production. 2279 Node *parseUnresolvedName(); 2280 Node *parseSimpleId(); 2281 Node *parseBaseUnresolvedName(); 2282 Node *parseUnresolvedType(); 2283 Node *parseDestructorName(); 2284 2285 /// Top-level entry point into the parser. 2286 Node *parse(); 2287 }; 2288 2289 const char* parse_discriminator(const char* first, const char* last); 2290 2291 // <name> ::= <nested-name> // N 2292 // ::= <local-name> # See Scope Encoding below // Z 2293 // ::= <unscoped-template-name> <template-args> 2294 // ::= <unscoped-name> 2295 // 2296 // <unscoped-template-name> ::= <unscoped-name> 2297 // ::= <substitution> 2298 Node *Db::parseName(NameState *State) { 2299 consumeIf('L'); // extension 2300 2301 if (look() == 'N') 2302 return parseNestedName(State); 2303 if (look() == 'Z') 2304 return parseLocalName(State); 2305 2306 // ::= <unscoped-template-name> <template-args> 2307 if (look() == 'S' && look(1) != 't') { 2308 Node *S = parseSubstitution(); 2309 if (S == nullptr) 2310 return nullptr; 2311 if (look() != 'I') 2312 return nullptr; 2313 Node *TA = parseTemplateArgs(State != nullptr); 2314 if (TA == nullptr) 2315 return nullptr; 2316 if (State) State->EndsWithTemplateArgs = true; 2317 return make<NameWithTemplateArgs>(S, TA); 2318 } 2319 2320 Node *N = parseUnscopedName(State); 2321 if (N == nullptr) 2322 return nullptr; 2323 // ::= <unscoped-template-name> <template-args> 2324 if (look() == 'I') { 2325 Subs.push_back(N); 2326 Node *TA = parseTemplateArgs(State != nullptr); 2327 if (TA == nullptr) 2328 return nullptr; 2329 if (State) State->EndsWithTemplateArgs = true; 2330 return make<NameWithTemplateArgs>(N, TA); 2331 } 2332 // ::= <unscoped-name> 2333 return N; 2334 } 2335 2336 // <local-name> := Z <function encoding> E <entity name> [<discriminator>] 2337 // := Z <function encoding> E s [<discriminator>] 2338 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name> 2339 Node *Db::parseLocalName(NameState *State) { 2340 if (!consumeIf('Z')) 2341 return nullptr; 2342 Node *Encoding = parseEncoding(); 2343 if (Encoding == nullptr || !consumeIf('E')) 2344 return nullptr; 2345 2346 if (consumeIf('s')) { 2347 First = parse_discriminator(First, Last); 2348 return make<LocalName>(Encoding, make<NameType>("string literal")); 2349 } 2350 2351 if (consumeIf('d')) { 2352 parseNumber(true); 2353 if (!consumeIf('_')) 2354 return nullptr; 2355 Node *N = parseName(State); 2356 if (N == nullptr) 2357 return nullptr; 2358 return make<LocalName>(Encoding, N); 2359 } 2360 2361 Node *Entity = parseName(State); 2362 if (Entity == nullptr) 2363 return nullptr; 2364 First = parse_discriminator(First, Last); 2365 return make<LocalName>(Encoding, Entity); 2366 } 2367 2368 // <unscoped-name> ::= <unqualified-name> 2369 // ::= St <unqualified-name> # ::std:: 2370 // extension ::= StL<unqualified-name> 2371 Node *Db::parseUnscopedName(NameState *State) { 2372 if (consumeIf("StL") || consumeIf("St")) { 2373 Node *R = parseUnqualifiedName(State); 2374 if (R == nullptr) 2375 return nullptr; 2376 return make<StdQualifiedName>(R); 2377 } 2378 return parseUnqualifiedName(State); 2379 } 2380 2381 // <unqualified-name> ::= <operator-name> [abi-tags] 2382 // ::= <ctor-dtor-name> 2383 // ::= <source-name> 2384 // ::= <unnamed-type-name> 2385 // ::= DC <source-name>+ E # structured binding declaration 2386 Node *Db::parseUnqualifiedName(NameState *State) { 2387 // <ctor-dtor-name>s are special-cased in parseNestedName(). 2388 Node *Result; 2389 if (look() == 'U') 2390 Result = parseUnnamedTypeName(State); 2391 else if (look() >= '1' && look() <= '9') 2392 Result = parseSourceName(State); 2393 else if (consumeIf("DC")) { 2394 size_t BindingsBegin = Names.size(); 2395 do { 2396 Node *Binding = parseSourceName(State); 2397 if (Binding == nullptr) 2398 return nullptr; 2399 Names.push_back(Binding); 2400 } while (!consumeIf('E')); 2401 Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin)); 2402 } else 2403 Result = parseOperatorName(State); 2404 if (Result != nullptr) 2405 Result = parseAbiTags(Result); 2406 return Result; 2407 } 2408 2409 // <unnamed-type-name> ::= Ut [<nonnegative number>] _ 2410 // ::= <closure-type-name> 2411 // 2412 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ 2413 // 2414 // <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters 2415 Node *Db::parseUnnamedTypeName(NameState *) { 2416 if (consumeIf("Ut")) { 2417 StringView Count = parseNumber(); 2418 if (!consumeIf('_')) 2419 return nullptr; 2420 return make<UnnamedTypeName>(Count); 2421 } 2422 if (consumeIf("Ul")) { 2423 NodeArray Params; 2424 SwapAndRestore<bool> SwapParams(ParsingLambdaParams, true); 2425 if (!consumeIf("vE")) { 2426 size_t ParamsBegin = Names.size(); 2427 do { 2428 Node *P = parseType(); 2429 if (P == nullptr) 2430 return nullptr; 2431 Names.push_back(P); 2432 } while (!consumeIf('E')); 2433 Params = popTrailingNodeArray(ParamsBegin); 2434 } 2435 StringView Count = parseNumber(); 2436 if (!consumeIf('_')) 2437 return nullptr; 2438 return make<ClosureTypeName>(Params, Count); 2439 } 2440 return nullptr; 2441 } 2442 2443 // <source-name> ::= <positive length number> <identifier> 2444 Node *Db::parseSourceName(NameState *) { 2445 size_t Length = 0; 2446 if (parsePositiveInteger(&Length)) 2447 return nullptr; 2448 if (numLeft() < Length || Length == 0) 2449 return nullptr; 2450 StringView Name(First, First + Length); 2451 First += Length; 2452 if (Name.startsWith("_GLOBAL__N")) 2453 return make<NameType>("(anonymous namespace)"); 2454 return make<NameType>(Name); 2455 } 2456 2457 // <operator-name> ::= aa # && 2458 // ::= ad # & (unary) 2459 // ::= an # & 2460 // ::= aN # &= 2461 // ::= aS # = 2462 // ::= cl # () 2463 // ::= cm # , 2464 // ::= co # ~ 2465 // ::= cv <type> # (cast) 2466 // ::= da # delete[] 2467 // ::= de # * (unary) 2468 // ::= dl # delete 2469 // ::= dv # / 2470 // ::= dV # /= 2471 // ::= eo # ^ 2472 // ::= eO # ^= 2473 // ::= eq # == 2474 // ::= ge # >= 2475 // ::= gt # > 2476 // ::= ix # [] 2477 // ::= le # <= 2478 // ::= li <source-name> # operator "" 2479 // ::= ls # << 2480 // ::= lS # <<= 2481 // ::= lt # < 2482 // ::= mi # - 2483 // ::= mI # -= 2484 // ::= ml # * 2485 // ::= mL # *= 2486 // ::= mm # -- (postfix in <expression> context) 2487 // ::= na # new[] 2488 // ::= ne # != 2489 // ::= ng # - (unary) 2490 // ::= nt # ! 2491 // ::= nw # new 2492 // ::= oo # || 2493 // ::= or # | 2494 // ::= oR # |= 2495 // ::= pm # ->* 2496 // ::= pl # + 2497 // ::= pL # += 2498 // ::= pp # ++ (postfix in <expression> context) 2499 // ::= ps # + (unary) 2500 // ::= pt # -> 2501 // ::= qu # ? 2502 // ::= rm # % 2503 // ::= rM # %= 2504 // ::= rs # >> 2505 // ::= rS # >>= 2506 // ::= ss # <=> C++2a 2507 // ::= v <digit> <source-name> # vendor extended operator 2508 Node *Db::parseOperatorName(NameState *State) { 2509 switch (look()) { 2510 case 'a': 2511 switch (look(1)) { 2512 case 'a': 2513 First += 2; 2514 return make<NameType>("operator&&"); 2515 case 'd': 2516 case 'n': 2517 First += 2; 2518 return make<NameType>("operator&"); 2519 case 'N': 2520 First += 2; 2521 return make<NameType>("operator&="); 2522 case 'S': 2523 First += 2; 2524 return make<NameType>("operator="); 2525 } 2526 return nullptr; 2527 case 'c': 2528 switch (look(1)) { 2529 case 'l': 2530 First += 2; 2531 return make<NameType>("operator()"); 2532 case 'm': 2533 First += 2; 2534 return make<NameType>("operator,"); 2535 case 'o': 2536 First += 2; 2537 return make<NameType>("operator~"); 2538 // ::= cv <type> # (cast) 2539 case 'v': { 2540 First += 2; 2541 SwapAndRestore<bool> SaveTemplate(TryToParseTemplateArgs, false); 2542 // If we're parsing an encoding, State != nullptr and the conversion 2543 // operators' <type> could have a <template-param> that refers to some 2544 // <template-arg>s further ahead in the mangled name. 2545 SwapAndRestore<bool> SavePermit(PermitForwardTemplateReferences, 2546 PermitForwardTemplateReferences || 2547 State != nullptr); 2548 Node* Ty = parseType(); 2549 if (Ty == nullptr) 2550 return nullptr; 2551 if (State) State->CtorDtorConversion = true; 2552 return make<ConversionOperatorType>(Ty); 2553 } 2554 } 2555 return nullptr; 2556 case 'd': 2557 switch (look(1)) { 2558 case 'a': 2559 First += 2; 2560 return make<NameType>("operator delete[]"); 2561 case 'e': 2562 First += 2; 2563 return make<NameType>("operator*"); 2564 case 'l': 2565 First += 2; 2566 return make<NameType>("operator delete"); 2567 case 'v': 2568 First += 2; 2569 return make<NameType>("operator/"); 2570 case 'V': 2571 First += 2; 2572 return make<NameType>("operator/="); 2573 } 2574 return nullptr; 2575 case 'e': 2576 switch (look(1)) { 2577 case 'o': 2578 First += 2; 2579 return make<NameType>("operator^"); 2580 case 'O': 2581 First += 2; 2582 return make<NameType>("operator^="); 2583 case 'q': 2584 First += 2; 2585 return make<NameType>("operator=="); 2586 } 2587 return nullptr; 2588 case 'g': 2589 switch (look(1)) { 2590 case 'e': 2591 First += 2; 2592 return make<NameType>("operator>="); 2593 case 't': 2594 First += 2; 2595 return make<NameType>("operator>"); 2596 } 2597 return nullptr; 2598 case 'i': 2599 if (look(1) == 'x') { 2600 First += 2; 2601 return make<NameType>("operator[]"); 2602 } 2603 return nullptr; 2604 case 'l': 2605 switch (look(1)) { 2606 case 'e': 2607 First += 2; 2608 return make<NameType>("operator<="); 2609 // ::= li <source-name> # operator "" 2610 case 'i': { 2611 First += 2; 2612 Node *SN = parseSourceName(State); 2613 if (SN == nullptr) 2614 return nullptr; 2615 return make<LiteralOperator>(SN); 2616 } 2617 case 's': 2618 First += 2; 2619 return make<NameType>("operator<<"); 2620 case 'S': 2621 First += 2; 2622 return make<NameType>("operator<<="); 2623 case 't': 2624 First += 2; 2625 return make<NameType>("operator<"); 2626 } 2627 return nullptr; 2628 case 'm': 2629 switch (look(1)) { 2630 case 'i': 2631 First += 2; 2632 return make<NameType>("operator-"); 2633 case 'I': 2634 First += 2; 2635 return make<NameType>("operator-="); 2636 case 'l': 2637 First += 2; 2638 return make<NameType>("operator*"); 2639 case 'L': 2640 First += 2; 2641 return make<NameType>("operator*="); 2642 case 'm': 2643 First += 2; 2644 return make<NameType>("operator--"); 2645 } 2646 return nullptr; 2647 case 'n': 2648 switch (look(1)) { 2649 case 'a': 2650 First += 2; 2651 return make<NameType>("operator new[]"); 2652 case 'e': 2653 First += 2; 2654 return make<NameType>("operator!="); 2655 case 'g': 2656 First += 2; 2657 return make<NameType>("operator-"); 2658 case 't': 2659 First += 2; 2660 return make<NameType>("operator!"); 2661 case 'w': 2662 First += 2; 2663 return make<NameType>("operator new"); 2664 } 2665 return nullptr; 2666 case 'o': 2667 switch (look(1)) { 2668 case 'o': 2669 First += 2; 2670 return make<NameType>("operator||"); 2671 case 'r': 2672 First += 2; 2673 return make<NameType>("operator|"); 2674 case 'R': 2675 First += 2; 2676 return make<NameType>("operator|="); 2677 } 2678 return nullptr; 2679 case 'p': 2680 switch (look(1)) { 2681 case 'm': 2682 First += 2; 2683 return make<NameType>("operator->*"); 2684 case 'l': 2685 First += 2; 2686 return make<NameType>("operator+"); 2687 case 'L': 2688 First += 2; 2689 return make<NameType>("operator+="); 2690 case 'p': 2691 First += 2; 2692 return make<NameType>("operator++"); 2693 case 's': 2694 First += 2; 2695 return make<NameType>("operator+"); 2696 case 't': 2697 First += 2; 2698 return make<NameType>("operator->"); 2699 } 2700 return nullptr; 2701 case 'q': 2702 if (look(1) == 'u') { 2703 First += 2; 2704 return make<NameType>("operator?"); 2705 } 2706 return nullptr; 2707 case 'r': 2708 switch (look(1)) { 2709 case 'm': 2710 First += 2; 2711 return make<NameType>("operator%"); 2712 case 'M': 2713 First += 2; 2714 return make<NameType>("operator%="); 2715 case 's': 2716 First += 2; 2717 return make<NameType>("operator>>"); 2718 case 'S': 2719 First += 2; 2720 return make<NameType>("operator>>="); 2721 } 2722 return nullptr; 2723 case 's': 2724 if (look(1) == 's') { 2725 First += 2; 2726 return make<NameType>("operator<=>"); 2727 } 2728 return nullptr; 2729 // ::= v <digit> <source-name> # vendor extended operator 2730 case 'v': 2731 if (std::isdigit(look(1))) { 2732 First += 2; 2733 Node *SN = parseSourceName(State); 2734 if (SN == nullptr) 2735 return nullptr; 2736 return make<ConversionOperatorType>(SN); 2737 } 2738 return nullptr; 2739 } 2740 return nullptr; 2741 } 2742 2743 // <ctor-dtor-name> ::= C1 # complete object constructor 2744 // ::= C2 # base object constructor 2745 // ::= C3 # complete object allocating constructor 2746 // extension ::= C5 # ? 2747 // ::= D0 # deleting destructor 2748 // ::= D1 # complete object destructor 2749 // ::= D2 # base object destructor 2750 // extension ::= D5 # ? 2751 Node *Db::parseCtorDtorName(Node *&SoFar, NameState *State) { 2752 if (SoFar->K == Node::KSpecialSubstitution) { 2753 auto SSK = static_cast<SpecialSubstitution *>(SoFar)->SSK; 2754 switch (SSK) { 2755 case SpecialSubKind::string: 2756 case SpecialSubKind::istream: 2757 case SpecialSubKind::ostream: 2758 case SpecialSubKind::iostream: 2759 SoFar = make<ExpandedSpecialSubstitution>(SSK); 2760 default: 2761 break; 2762 } 2763 } 2764 2765 if (consumeIf('C')) { 2766 bool IsInherited = consumeIf('I'); 2767 if (look() != '1' && look() != '2' && look() != '3' && look() != '5') 2768 return nullptr; 2769 ++First; 2770 if (State) State->CtorDtorConversion = true; 2771 if (IsInherited) { 2772 if (parseName(State) == nullptr) 2773 return nullptr; 2774 } 2775 return make<CtorDtorName>(SoFar, false); 2776 } 2777 2778 if (look() == 'D' && 2779 (look(1) == '0' || look(1) == '1' || look(1) == '2' || look(1) == '5')) { 2780 First += 2; 2781 if (State) State->CtorDtorConversion = true; 2782 return make<CtorDtorName>(SoFar, true); 2783 } 2784 2785 return nullptr; 2786 } 2787 2788 // <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E 2789 // ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E 2790 // 2791 // <prefix> ::= <prefix> <unqualified-name> 2792 // ::= <template-prefix> <template-args> 2793 // ::= <template-param> 2794 // ::= <decltype> 2795 // ::= # empty 2796 // ::= <substitution> 2797 // ::= <prefix> <data-member-prefix> 2798 // extension ::= L 2799 // 2800 // <data-member-prefix> := <member source-name> [<template-args>] M 2801 // 2802 // <template-prefix> ::= <prefix> <template unqualified-name> 2803 // ::= <template-param> 2804 // ::= <substitution> 2805 Node *Db::parseNestedName(NameState *State) { 2806 if (!consumeIf('N')) 2807 return nullptr; 2808 2809 Qualifiers CVTmp = parseCVQualifiers(); 2810 if (State) State->CVQualifiers = CVTmp; 2811 2812 if (consumeIf('O')) { 2813 if (State) State->ReferenceQualifier = FrefQualRValue; 2814 } else if (consumeIf('R')) { 2815 if (State) State->ReferenceQualifier = FrefQualLValue; 2816 } else 2817 if (State) State->ReferenceQualifier = FrefQualNone; 2818 2819 Node *SoFar = nullptr; 2820 auto PushComponent = [&](Node *Comp) { 2821 if (SoFar) SoFar = make<NestedName>(SoFar, Comp); 2822 else SoFar = Comp; 2823 if (State) State->EndsWithTemplateArgs = false; 2824 }; 2825 2826 if (consumeIf("St")) 2827 SoFar = make<NameType>("std"); 2828 2829 while (!consumeIf('E')) { 2830 consumeIf('L'); // extension 2831 2832 // <data-member-prefix> := <member source-name> [<template-args>] M 2833 if (consumeIf('M')) { 2834 if (SoFar == nullptr) 2835 return nullptr; 2836 continue; 2837 } 2838 2839 // ::= <template-param> 2840 if (look() == 'T') { 2841 Node *TP = parseTemplateParam(); 2842 if (TP == nullptr) 2843 return nullptr; 2844 PushComponent(TP); 2845 Subs.push_back(SoFar); 2846 continue; 2847 } 2848 2849 // ::= <template-prefix> <template-args> 2850 if (look() == 'I') { 2851 Node *TA = parseTemplateArgs(State != nullptr); 2852 if (TA == nullptr || SoFar == nullptr) 2853 return nullptr; 2854 SoFar = make<NameWithTemplateArgs>(SoFar, TA); 2855 if (State) State->EndsWithTemplateArgs = true; 2856 Subs.push_back(SoFar); 2857 continue; 2858 } 2859 2860 // ::= <decltype> 2861 if (look() == 'D' && (look(1) == 't' || look(1) == 'T')) { 2862 Node *DT = parseDecltype(); 2863 if (DT == nullptr) 2864 return nullptr; 2865 PushComponent(DT); 2866 Subs.push_back(SoFar); 2867 continue; 2868 } 2869 2870 // ::= <substitution> 2871 if (look() == 'S' && look(1) != 't') { 2872 Node *S = parseSubstitution(); 2873 if (S == nullptr) 2874 return nullptr; 2875 PushComponent(S); 2876 if (SoFar != S) 2877 Subs.push_back(S); 2878 continue; 2879 } 2880 2881 // Parse an <unqualified-name> thats actually a <ctor-dtor-name>. 2882 if (look() == 'C' || (look() == 'D' && look(1) != 'C')) { 2883 if (SoFar == nullptr) 2884 return nullptr; 2885 Node *CtorDtor = parseCtorDtorName(SoFar, State); 2886 if (CtorDtor == nullptr) 2887 return nullptr; 2888 PushComponent(CtorDtor); 2889 SoFar = parseAbiTags(SoFar); 2890 if (SoFar == nullptr) 2891 return nullptr; 2892 Subs.push_back(SoFar); 2893 continue; 2894 } 2895 2896 // ::= <prefix> <unqualified-name> 2897 Node *N = parseUnqualifiedName(State); 2898 if (N == nullptr) 2899 return nullptr; 2900 PushComponent(N); 2901 Subs.push_back(SoFar); 2902 } 2903 2904 if (SoFar == nullptr || Subs.empty()) 2905 return nullptr; 2906 2907 Subs.pop_back(); 2908 return SoFar; 2909 } 2910 2911 // <simple-id> ::= <source-name> [ <template-args> ] 2912 Node *Db::parseSimpleId() { 2913 Node *SN = parseSourceName(/*NameState=*/nullptr); 2914 if (SN == nullptr) 2915 return nullptr; 2916 if (look() == 'I') { 2917 Node *TA = parseTemplateArgs(); 2918 if (TA == nullptr) 2919 return nullptr; 2920 return make<NameWithTemplateArgs>(SN, TA); 2921 } 2922 return SN; 2923 } 2924 2925 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) 2926 // ::= <simple-id> # e.g., ~A<2*N> 2927 Node *Db::parseDestructorName() { 2928 Node *Result; 2929 if (std::isdigit(look())) 2930 Result = parseSimpleId(); 2931 else 2932 Result = parseUnresolvedType(); 2933 if (Result == nullptr) 2934 return nullptr; 2935 return make<DtorName>(Result); 2936 } 2937 2938 // <unresolved-type> ::= <template-param> 2939 // ::= <decltype> 2940 // ::= <substitution> 2941 Node *Db::parseUnresolvedType() { 2942 if (look() == 'T') { 2943 Node *TP = parseTemplateParam(); 2944 if (TP == nullptr) 2945 return nullptr; 2946 Subs.push_back(TP); 2947 return TP; 2948 } 2949 if (look() == 'D') { 2950 Node *DT = parseDecltype(); 2951 if (DT == nullptr) 2952 return nullptr; 2953 Subs.push_back(DT); 2954 return DT; 2955 } 2956 return parseSubstitution(); 2957 } 2958 2959 // <base-unresolved-name> ::= <simple-id> # unresolved name 2960 // extension ::= <operator-name> # unresolved operator-function-id 2961 // extension ::= <operator-name> <template-args> # unresolved operator template-id 2962 // ::= on <operator-name> # unresolved operator-function-id 2963 // ::= on <operator-name> <template-args> # unresolved operator template-id 2964 // ::= dn <destructor-name> # destructor or pseudo-destructor; 2965 // # e.g. ~X or ~X<N-1> 2966 Node *Db::parseBaseUnresolvedName() { 2967 if (std::isdigit(look())) 2968 return parseSimpleId(); 2969 2970 if (consumeIf("dn")) 2971 return parseDestructorName(); 2972 2973 consumeIf("on"); 2974 2975 Node *Oper = parseOperatorName(/*NameState=*/nullptr); 2976 if (Oper == nullptr) 2977 return nullptr; 2978 if (look() == 'I') { 2979 Node *TA = parseTemplateArgs(); 2980 if (TA == nullptr) 2981 return nullptr; 2982 return make<NameWithTemplateArgs>(Oper, TA); 2983 } 2984 return Oper; 2985 } 2986 2987 // <unresolved-name> 2988 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> 2989 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x 2990 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> 2991 // # A::x, N::y, A<T>::z; "gs" means leading "::" 2992 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x 2993 // extension ::= sr <unresolved-type> <template-args> <base-unresolved-name> 2994 // # T::N::x /decltype(p)::N::x 2995 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> 2996 // 2997 // <unresolved-qualifier-level> ::= <simple-id> 2998 Node *Db::parseUnresolvedName() { 2999 Node *SoFar = nullptr; 3000 3001 // srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> 3002 // srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> 3003 if (consumeIf("srN")) { 3004 SoFar = parseUnresolvedType(); 3005 if (SoFar == nullptr) 3006 return nullptr; 3007 3008 if (look() == 'I') { 3009 Node *TA = parseTemplateArgs(); 3010 if (TA == nullptr) 3011 return nullptr; 3012 SoFar = make<NameWithTemplateArgs>(SoFar, TA); 3013 } 3014 3015 while (!consumeIf('E')) { 3016 Node *Qual = parseSimpleId(); 3017 if (Qual == nullptr) 3018 return nullptr; 3019 SoFar = make<QualifiedName>(SoFar, Qual); 3020 } 3021 3022 Node *Base = parseBaseUnresolvedName(); 3023 if (Base == nullptr) 3024 return nullptr; 3025 return make<QualifiedName>(SoFar, Base); 3026 } 3027 3028 bool Global = consumeIf("gs"); 3029 3030 // [gs] <base-unresolved-name> # x or (with "gs") ::x 3031 if (!consumeIf("sr")) { 3032 SoFar = parseBaseUnresolvedName(); 3033 if (SoFar == nullptr) 3034 return nullptr; 3035 if (Global) 3036 SoFar = make<GlobalQualifiedName>(SoFar); 3037 return SoFar; 3038 } 3039 3040 // [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> 3041 if (std::isdigit(look())) { 3042 do { 3043 Node *Qual = parseSimpleId(); 3044 if (Qual == nullptr) 3045 return nullptr; 3046 if (SoFar) 3047 SoFar = make<QualifiedName>(SoFar, Qual); 3048 else if (Global) 3049 SoFar = make<GlobalQualifiedName>(Qual); 3050 else 3051 SoFar = Qual; 3052 } while (!consumeIf('E')); 3053 } 3054 // sr <unresolved-type> <base-unresolved-name> 3055 // sr <unresolved-type> <template-args> <base-unresolved-name> 3056 else { 3057 SoFar = parseUnresolvedType(); 3058 if (SoFar == nullptr) 3059 return nullptr; 3060 3061 if (look() == 'I') { 3062 Node *TA = parseTemplateArgs(); 3063 if (TA == nullptr) 3064 return nullptr; 3065 SoFar = make<NameWithTemplateArgs>(SoFar, TA); 3066 } 3067 } 3068 3069 assert(SoFar != nullptr); 3070 3071 Node *Base = parseBaseUnresolvedName(); 3072 if (Base == nullptr) 3073 return nullptr; 3074 return make<QualifiedName>(SoFar, Base); 3075 } 3076 3077 // <abi-tags> ::= <abi-tag> [<abi-tags>] 3078 // <abi-tag> ::= B <source-name> 3079 Node *Db::parseAbiTags(Node *N) { 3080 while (consumeIf('B')) { 3081 StringView SN = parseBareSourceName(); 3082 if (SN.empty()) 3083 return nullptr; 3084 N = make<AbiTagAttr>(N, SN); 3085 } 3086 return N; 3087 } 3088 3089 // <number> ::= [n] <non-negative decimal integer> 3090 StringView Db::parseNumber(bool AllowNegative) { 3091 const char *Tmp = First; 3092 if (AllowNegative) 3093 consumeIf('n'); 3094 if (numLeft() == 0 || !std::isdigit(*First)) 3095 return StringView(); 3096 while (numLeft() != 0 && std::isdigit(*First)) 3097 ++First; 3098 return StringView(Tmp, First); 3099 } 3100 3101 // <positive length number> ::= [0-9]* 3102 bool Db::parsePositiveInteger(size_t *Out) { 3103 *Out = 0; 3104 if (look() < '0' || look() > '9') 3105 return true; 3106 while (look() >= '0' && look() <= '9') { 3107 *Out *= 10; 3108 *Out += static_cast<size_t>(consume() - '0'); 3109 } 3110 return false; 3111 } 3112 3113 StringView Db::parseBareSourceName() { 3114 size_t Int = 0; 3115 if (parsePositiveInteger(&Int) || numLeft() < Int) 3116 return StringView(); 3117 StringView R(First, First + Int); 3118 First += Int; 3119 return R; 3120 } 3121 3122 // <function-type> ::= [<CV-qualifiers>] [<exception-spec>] [Dx] F [Y] <bare-function-type> [<ref-qualifier>] E 3123 // 3124 // <exception-spec> ::= Do # non-throwing exception-specification (e.g., noexcept, throw()) 3125 // ::= DO <expression> E # computed (instantiation-dependent) noexcept 3126 // ::= Dw <type>+ E # dynamic exception specification with instantiation-dependent types 3127 // 3128 // <ref-qualifier> ::= R # & ref-qualifier 3129 // <ref-qualifier> ::= O # && ref-qualifier 3130 Node *Db::parseFunctionType() { 3131 Qualifiers CVQuals = parseCVQualifiers(); 3132 3133 Node *ExceptionSpec = nullptr; 3134 if (consumeIf("Do")) { 3135 ExceptionSpec = make<NameType>("noexcept"); 3136 } else if (consumeIf("DO")) { 3137 Node *E = parseExpr(); 3138 if (E == nullptr || !consumeIf('E')) 3139 return nullptr; 3140 ExceptionSpec = make<NoexceptSpec>(E); 3141 } else if (consumeIf("Dw")) { 3142 size_t SpecsBegin = Names.size(); 3143 while (!consumeIf('E')) { 3144 Node *T = parseType(); 3145 if (T == nullptr) 3146 return nullptr; 3147 Names.push_back(T); 3148 } 3149 ExceptionSpec = 3150 make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin)); 3151 } 3152 3153 consumeIf("Dx"); // transaction safe 3154 3155 if (!consumeIf('F')) 3156 return nullptr; 3157 consumeIf('Y'); // extern "C" 3158 Node *ReturnType = parseType(); 3159 if (ReturnType == nullptr) 3160 return nullptr; 3161 3162 FunctionRefQual ReferenceQualifier = FrefQualNone; 3163 size_t ParamsBegin = Names.size(); 3164 while (true) { 3165 if (consumeIf('E')) 3166 break; 3167 if (consumeIf('v')) 3168 continue; 3169 if (consumeIf("RE")) { 3170 ReferenceQualifier = FrefQualLValue; 3171 break; 3172 } 3173 if (consumeIf("OE")) { 3174 ReferenceQualifier = FrefQualRValue; 3175 break; 3176 } 3177 Node *T = parseType(); 3178 if (T == nullptr) 3179 return nullptr; 3180 Names.push_back(T); 3181 } 3182 3183 NodeArray Params = popTrailingNodeArray(ParamsBegin); 3184 return make<FunctionType>(ReturnType, Params, CVQuals, 3185 ReferenceQualifier, ExceptionSpec); 3186 } 3187 3188 // extension: 3189 // <vector-type> ::= Dv <positive dimension number> _ <extended element type> 3190 // ::= Dv [<dimension expression>] _ <element type> 3191 // <extended element type> ::= <element type> 3192 // ::= p # AltiVec vector pixel 3193 Node *Db::parseVectorType() { 3194 if (!consumeIf("Dv")) 3195 return nullptr; 3196 if (look() >= '1' && look() <= '9') { 3197 StringView DimensionNumber = parseNumber(); 3198 if (!consumeIf('_')) 3199 return nullptr; 3200 if (consumeIf('p')) 3201 return make<VectorType>(DimensionNumber); 3202 Node *ElemType = parseType(); 3203 if (ElemType == nullptr) 3204 return nullptr; 3205 return make<VectorType>(ElemType, DimensionNumber); 3206 } 3207 3208 if (!consumeIf('_')) { 3209 Node *DimExpr = parseExpr(); 3210 if (!DimExpr) 3211 return nullptr; 3212 if (!consumeIf('_')) 3213 return nullptr; 3214 Node *ElemType = parseType(); 3215 if (!ElemType) 3216 return nullptr; 3217 return make<VectorType>(ElemType, DimExpr); 3218 } 3219 Node *ElemType = parseType(); 3220 if (!ElemType) 3221 return nullptr; 3222 return make<VectorType>(ElemType, StringView()); 3223 } 3224 3225 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) 3226 // ::= DT <expression> E # decltype of an expression (C++0x) 3227 Node *Db::parseDecltype() { 3228 if (!consumeIf('D')) 3229 return nullptr; 3230 if (!consumeIf('t') && !consumeIf('T')) 3231 return nullptr; 3232 Node *E = parseExpr(); 3233 if (E == nullptr) 3234 return nullptr; 3235 if (!consumeIf('E')) 3236 return nullptr; 3237 return make<EnclosingExpr>("decltype(", E, ")"); 3238 } 3239 3240 // <array-type> ::= A <positive dimension number> _ <element type> 3241 // ::= A [<dimension expression>] _ <element type> 3242 Node *Db::parseArrayType() { 3243 if (!consumeIf('A')) 3244 return nullptr; 3245 3246 if (std::isdigit(look())) { 3247 StringView Dimension = parseNumber(); 3248 if (!consumeIf('_')) 3249 return nullptr; 3250 Node *Ty = parseType(); 3251 if (Ty == nullptr) 3252 return nullptr; 3253 return make<ArrayType>(Ty, Dimension); 3254 } 3255 3256 if (!consumeIf('_')) { 3257 Node *DimExpr = parseExpr(); 3258 if (DimExpr == nullptr) 3259 return nullptr; 3260 if (!consumeIf('_')) 3261 return nullptr; 3262 Node *ElementType = parseType(); 3263 if (ElementType == nullptr) 3264 return nullptr; 3265 return make<ArrayType>(ElementType, DimExpr); 3266 } 3267 3268 Node *Ty = parseType(); 3269 if (Ty == nullptr) 3270 return nullptr; 3271 return make<ArrayType>(Ty); 3272 } 3273 3274 // <pointer-to-member-type> ::= M <class type> <member type> 3275 Node *Db::parsePointerToMemberType() { 3276 if (!consumeIf('M')) 3277 return nullptr; 3278 Node *ClassType = parseType(); 3279 if (ClassType == nullptr) 3280 return nullptr; 3281 Node *MemberType = parseType(); 3282 if (MemberType == nullptr) 3283 return nullptr; 3284 return make<PointerToMemberType>(ClassType, MemberType); 3285 } 3286 3287 // <class-enum-type> ::= <name> # non-dependent type name, dependent type name, or dependent typename-specifier 3288 // ::= Ts <name> # dependent elaborated type specifier using 'struct' or 'class' 3289 // ::= Tu <name> # dependent elaborated type specifier using 'union' 3290 // ::= Te <name> # dependent elaborated type specifier using 'enum' 3291 Node *Db::parseClassEnumType() { 3292 StringView ElabSpef; 3293 if (consumeIf("Ts")) 3294 ElabSpef = "struct"; 3295 else if (consumeIf("Tu")) 3296 ElabSpef = "union"; 3297 else if (consumeIf("Te")) 3298 ElabSpef = "enum"; 3299 3300 Node *Name = parseName(); 3301 if (Name == nullptr) 3302 return nullptr; 3303 3304 if (!ElabSpef.empty()) 3305 return make<ElaboratedTypeSpefType>(ElabSpef, Name); 3306 3307 return Name; 3308 } 3309 3310 // <qualified-type> ::= <qualifiers> <type> 3311 // <qualifiers> ::= <extended-qualifier>* <CV-qualifiers> 3312 // <extended-qualifier> ::= U <source-name> [<template-args>] # vendor extended type qualifier 3313 Node *Db::parseQualifiedType() { 3314 if (consumeIf('U')) { 3315 StringView Qual = parseBareSourceName(); 3316 if (Qual.empty()) 3317 return nullptr; 3318 3319 // FIXME parse the optional <template-args> here! 3320 3321 // extension ::= U <objc-name> <objc-type> # objc-type<identifier> 3322 if (Qual.startsWith("objcproto")) { 3323 StringView ProtoSourceName = Qual.dropFront(std::strlen("objcproto")); 3324 StringView Proto; 3325 { 3326 SwapAndRestore<const char *> SaveFirst(First, ProtoSourceName.begin()), 3327 SaveLast(Last, ProtoSourceName.end()); 3328 Proto = parseBareSourceName(); 3329 } 3330 if (Proto.empty()) 3331 return nullptr; 3332 Node *Child = parseQualifiedType(); 3333 if (Child == nullptr) 3334 return nullptr; 3335 return make<ObjCProtoName>(Child, Proto); 3336 } 3337 3338 Node *Child = parseQualifiedType(); 3339 if (Child == nullptr) 3340 return nullptr; 3341 return make<VendorExtQualType>(Child, Qual); 3342 } 3343 3344 Qualifiers Quals = parseCVQualifiers(); 3345 Node *Ty = parseType(); 3346 if (Ty == nullptr) 3347 return nullptr; 3348 if (Quals != QualNone) 3349 Ty = make<QualType>(Ty, Quals); 3350 return Ty; 3351 } 3352 3353 // <type> ::= <builtin-type> 3354 // ::= <qualified-type> 3355 // ::= <function-type> 3356 // ::= <class-enum-type> 3357 // ::= <array-type> 3358 // ::= <pointer-to-member-type> 3359 // ::= <template-param> 3360 // ::= <template-template-param> <template-args> 3361 // ::= <decltype> 3362 // ::= P <type> # pointer 3363 // ::= R <type> # l-value reference 3364 // ::= O <type> # r-value reference (C++11) 3365 // ::= C <type> # complex pair (C99) 3366 // ::= G <type> # imaginary (C99) 3367 // ::= <substitution> # See Compression below 3368 // extension ::= U <objc-name> <objc-type> # objc-type<identifier> 3369 // extension ::= <vector-type> # <vector-type> starts with Dv 3370 // 3371 // <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1 3372 // <objc-type> ::= <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name> 3373 Node *Db::parseType() { 3374 Node *Result = nullptr; 3375 3376 switch (look()) { 3377 // ::= <qualified-type> 3378 case 'r': 3379 case 'V': 3380 case 'K': { 3381 unsigned AfterQuals = 0; 3382 if (look(AfterQuals) == 'r') ++AfterQuals; 3383 if (look(AfterQuals) == 'V') ++AfterQuals; 3384 if (look(AfterQuals) == 'K') ++AfterQuals; 3385 3386 if (look(AfterQuals) == 'F' || 3387 (look(AfterQuals) == 'D' && 3388 (look(AfterQuals + 1) == 'o' || look(AfterQuals + 1) == 'O' || 3389 look(AfterQuals + 1) == 'w' || look(AfterQuals + 1) == 'x'))) { 3390 Result = parseFunctionType(); 3391 break; 3392 } 3393 LLVM_FALLTHROUGH; 3394 } 3395 case 'U': { 3396 Result = parseQualifiedType(); 3397 break; 3398 } 3399 // <builtin-type> ::= v # void 3400 case 'v': 3401 ++First; 3402 return make<NameType>("void"); 3403 // ::= w # wchar_t 3404 case 'w': 3405 ++First; 3406 return make<NameType>("wchar_t"); 3407 // ::= b # bool 3408 case 'b': 3409 ++First; 3410 return make<NameType>("bool"); 3411 // ::= c # char 3412 case 'c': 3413 ++First; 3414 return make<NameType>("char"); 3415 // ::= a # signed char 3416 case 'a': 3417 ++First; 3418 return make<NameType>("signed char"); 3419 // ::= h # unsigned char 3420 case 'h': 3421 ++First; 3422 return make<NameType>("unsigned char"); 3423 // ::= s # short 3424 case 's': 3425 ++First; 3426 return make<NameType>("short"); 3427 // ::= t # unsigned short 3428 case 't': 3429 ++First; 3430 return make<NameType>("unsigned short"); 3431 // ::= i # int 3432 case 'i': 3433 ++First; 3434 return make<NameType>("int"); 3435 // ::= j # unsigned int 3436 case 'j': 3437 ++First; 3438 return make<NameType>("unsigned int"); 3439 // ::= l # long 3440 case 'l': 3441 ++First; 3442 return make<NameType>("long"); 3443 // ::= m # unsigned long 3444 case 'm': 3445 ++First; 3446 return make<NameType>("unsigned long"); 3447 // ::= x # long long, __int64 3448 case 'x': 3449 ++First; 3450 return make<NameType>("long long"); 3451 // ::= y # unsigned long long, __int64 3452 case 'y': 3453 ++First; 3454 return make<NameType>("unsigned long long"); 3455 // ::= n # __int128 3456 case 'n': 3457 ++First; 3458 return make<NameType>("__int128"); 3459 // ::= o # unsigned __int128 3460 case 'o': 3461 ++First; 3462 return make<NameType>("unsigned __int128"); 3463 // ::= f # float 3464 case 'f': 3465 ++First; 3466 return make<NameType>("float"); 3467 // ::= d # double 3468 case 'd': 3469 ++First; 3470 return make<NameType>("double"); 3471 // ::= e # long double, __float80 3472 case 'e': 3473 ++First; 3474 return make<NameType>("long double"); 3475 // ::= g # __float128 3476 case 'g': 3477 ++First; 3478 return make<NameType>("__float128"); 3479 // ::= z # ellipsis 3480 case 'z': 3481 ++First; 3482 return make<NameType>("..."); 3483 3484 // <builtin-type> ::= u <source-name> # vendor extended type 3485 case 'u': { 3486 ++First; 3487 StringView Res = parseBareSourceName(); 3488 if (Res.empty()) 3489 return nullptr; 3490 return make<NameType>(Res); 3491 } 3492 case 'D': 3493 switch (look(1)) { 3494 // ::= Dd # IEEE 754r decimal floating point (64 bits) 3495 case 'd': 3496 First += 2; 3497 return make<NameType>("decimal64"); 3498 // ::= De # IEEE 754r decimal floating point (128 bits) 3499 case 'e': 3500 First += 2; 3501 return make<NameType>("decimal128"); 3502 // ::= Df # IEEE 754r decimal floating point (32 bits) 3503 case 'f': 3504 First += 2; 3505 return make<NameType>("decimal32"); 3506 // ::= Dh # IEEE 754r half-precision floating point (16 bits) 3507 case 'h': 3508 First += 2; 3509 return make<NameType>("decimal16"); 3510 // ::= Di # char32_t 3511 case 'i': 3512 First += 2; 3513 return make<NameType>("char32_t"); 3514 // ::= Ds # char16_t 3515 case 's': 3516 First += 2; 3517 return make<NameType>("char16_t"); 3518 // ::= Da # auto (in dependent new-expressions) 3519 case 'a': 3520 First += 2; 3521 return make<NameType>("auto"); 3522 // ::= Dc # decltype(auto) 3523 case 'c': 3524 First += 2; 3525 return make<NameType>("decltype(auto)"); 3526 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) 3527 case 'n': 3528 First += 2; 3529 return make<NameType>("std::nullptr_t"); 3530 3531 // ::= <decltype> 3532 case 't': 3533 case 'T': { 3534 Result = parseDecltype(); 3535 break; 3536 } 3537 // extension ::= <vector-type> # <vector-type> starts with Dv 3538 case 'v': { 3539 Result = parseVectorType(); 3540 break; 3541 } 3542 // ::= Dp <type> # pack expansion (C++0x) 3543 case 'p': { 3544 First += 2; 3545 Node *Child = parseType(); 3546 if (!Child) 3547 return nullptr; 3548 Result = make<ParameterPackExpansion>(Child); 3549 break; 3550 } 3551 // Exception specifier on a function type. 3552 case 'o': 3553 case 'O': 3554 case 'w': 3555 // Transaction safe function type. 3556 case 'x': 3557 Result = parseFunctionType(); 3558 break; 3559 } 3560 break; 3561 // ::= <function-type> 3562 case 'F': { 3563 Result = parseFunctionType(); 3564 break; 3565 } 3566 // ::= <array-type> 3567 case 'A': { 3568 Result = parseArrayType(); 3569 break; 3570 } 3571 // ::= <pointer-to-member-type> 3572 case 'M': { 3573 Result = parsePointerToMemberType(); 3574 break; 3575 } 3576 // ::= <template-param> 3577 case 'T': { 3578 // This could be an elaborate type specifier on a <class-enum-type>. 3579 if (look(1) == 's' || look(1) == 'u' || look(1) == 'e') { 3580 Result = parseClassEnumType(); 3581 break; 3582 } 3583 3584 Result = parseTemplateParam(); 3585 if (Result == nullptr) 3586 return nullptr; 3587 3588 // Result could be either of: 3589 // <type> ::= <template-param> 3590 // <type> ::= <template-template-param> <template-args> 3591 // 3592 // <template-template-param> ::= <template-param> 3593 // ::= <substitution> 3594 // 3595 // If this is followed by some <template-args>, and we're permitted to 3596 // parse them, take the second production. 3597 3598 if (TryToParseTemplateArgs && look() == 'I') { 3599 Node *TA = parseTemplateArgs(); 3600 if (TA == nullptr) 3601 return nullptr; 3602 Result = make<NameWithTemplateArgs>(Result, TA); 3603 } 3604 break; 3605 } 3606 // ::= P <type> # pointer 3607 case 'P': { 3608 ++First; 3609 Node *Ptr = parseType(); 3610 if (Ptr == nullptr) 3611 return nullptr; 3612 Result = make<PointerType>(Ptr); 3613 break; 3614 } 3615 // ::= R <type> # l-value reference 3616 case 'R': { 3617 ++First; 3618 Node *Ref = parseType(); 3619 if (Ref == nullptr) 3620 return nullptr; 3621 Result = make<LValueReferenceType>(Ref); 3622 break; 3623 } 3624 // ::= O <type> # r-value reference (C++11) 3625 case 'O': { 3626 ++First; 3627 Node *Ref = parseType(); 3628 if (Ref == nullptr) 3629 return nullptr; 3630 Result = make<RValueReferenceType>(Ref); 3631 break; 3632 } 3633 // ::= C <type> # complex pair (C99) 3634 case 'C': { 3635 ++First; 3636 Node *P = parseType(); 3637 if (P == nullptr) 3638 return nullptr; 3639 Result = make<PostfixQualifiedType>(P, " complex"); 3640 break; 3641 } 3642 // ::= G <type> # imaginary (C99) 3643 case 'G': { 3644 ++First; 3645 Node *P = parseType(); 3646 if (P == nullptr) 3647 return P; 3648 Result = make<PostfixQualifiedType>(P, " imaginary"); 3649 break; 3650 } 3651 // ::= <substitution> # See Compression below 3652 case 'S': { 3653 if (look(1) && look(1) != 't') { 3654 Node *Sub = parseSubstitution(); 3655 if (Sub == nullptr) 3656 return nullptr; 3657 3658 // Sub could be either of: 3659 // <type> ::= <substitution> 3660 // <type> ::= <template-template-param> <template-args> 3661 // 3662 // <template-template-param> ::= <template-param> 3663 // ::= <substitution> 3664 // 3665 // If this is followed by some <template-args>, and we're permitted to 3666 // parse them, take the second production. 3667 3668 if (TryToParseTemplateArgs && look() == 'I') { 3669 Node *TA = parseTemplateArgs(); 3670 if (TA == nullptr) 3671 return nullptr; 3672 Result = make<NameWithTemplateArgs>(Sub, TA); 3673 break; 3674 } 3675 3676 // If all we parsed was a substitution, don't re-insert into the 3677 // substitution table. 3678 return Sub; 3679 } 3680 LLVM_FALLTHROUGH; 3681 } 3682 // ::= <class-enum-type> 3683 default: { 3684 Result = parseClassEnumType(); 3685 break; 3686 } 3687 } 3688 3689 // If we parsed a type, insert it into the substitution table. Note that all 3690 // <builtin-type>s and <substitution>s have already bailed out, because they 3691 // don't get substitutions. 3692 if (Result != nullptr) 3693 Subs.push_back(Result); 3694 return Result; 3695 } 3696 3697 Node *Db::parsePrefixExpr(StringView Kind) { 3698 Node *E = parseExpr(); 3699 if (E == nullptr) 3700 return nullptr; 3701 return make<PrefixExpr>(Kind, E); 3702 } 3703 3704 Node *Db::parseBinaryExpr(StringView Kind) { 3705 Node *LHS = parseExpr(); 3706 if (LHS == nullptr) 3707 return nullptr; 3708 Node *RHS = parseExpr(); 3709 if (RHS == nullptr) 3710 return nullptr; 3711 return make<BinaryExpr>(LHS, Kind, RHS); 3712 } 3713 3714 Node *Db::parseIntegerLiteral(StringView Lit) { 3715 StringView Tmp = parseNumber(true); 3716 if (!Tmp.empty() && consumeIf('E')) 3717 return make<IntegerExpr>(Lit, Tmp); 3718 return nullptr; 3719 } 3720 3721 // <CV-Qualifiers> ::= [r] [V] [K] 3722 Qualifiers Db::parseCVQualifiers() { 3723 Qualifiers CVR = QualNone; 3724 if (consumeIf('r')) 3725 addQualifiers(CVR, QualRestrict); 3726 if (consumeIf('V')) 3727 addQualifiers(CVR, QualVolatile); 3728 if (consumeIf('K')) 3729 addQualifiers(CVR, QualConst); 3730 return CVR; 3731 } 3732 3733 // <function-param> ::= fp <top-level CV-Qualifiers> _ # L == 0, first parameter 3734 // ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters 3735 // ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _ # L > 0, first parameter 3736 // ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters 3737 Node *Db::parseFunctionParam() { 3738 if (consumeIf("fp")) { 3739 parseCVQualifiers(); 3740 StringView Num = parseNumber(); 3741 if (!consumeIf('_')) 3742 return nullptr; 3743 return make<FunctionParam>(Num); 3744 } 3745 if (consumeIf("fL")) { 3746 if (parseNumber().empty()) 3747 return nullptr; 3748 if (!consumeIf('p')) 3749 return nullptr; 3750 parseCVQualifiers(); 3751 StringView Num = parseNumber(); 3752 if (!consumeIf('_')) 3753 return nullptr; 3754 return make<FunctionParam>(Num); 3755 } 3756 return nullptr; 3757 } 3758 3759 // [gs] nw <expression>* _ <type> E # new (expr-list) type 3760 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 3761 // [gs] na <expression>* _ <type> E # new[] (expr-list) type 3762 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 3763 // <initializer> ::= pi <expression>* E # parenthesized initialization 3764 Node *Db::parseNewExpr() { 3765 bool Global = consumeIf("gs"); 3766 bool IsArray = look(1) == 'a'; 3767 if (!consumeIf("nw") && !consumeIf("na")) 3768 return nullptr; 3769 size_t Exprs = Names.size(); 3770 while (!consumeIf('_')) { 3771 Node *Ex = parseExpr(); 3772 if (Ex == nullptr) 3773 return nullptr; 3774 Names.push_back(Ex); 3775 } 3776 NodeArray ExprList = popTrailingNodeArray(Exprs); 3777 Node *Ty = parseType(); 3778 if (Ty == nullptr) 3779 return Ty; 3780 if (consumeIf("pi")) { 3781 size_t InitsBegin = Names.size(); 3782 while (!consumeIf('E')) { 3783 Node *Init = parseExpr(); 3784 if (Init == nullptr) 3785 return Init; 3786 Names.push_back(Init); 3787 } 3788 NodeArray Inits = popTrailingNodeArray(InitsBegin); 3789 return make<NewExpr>(ExprList, Ty, Inits, Global, IsArray); 3790 } else if (!consumeIf('E')) 3791 return nullptr; 3792 return make<NewExpr>(ExprList, Ty, NodeArray(), Global, IsArray); 3793 } 3794 3795 // cv <type> <expression> # conversion with one argument 3796 // cv <type> _ <expression>* E # conversion with a different number of arguments 3797 Node *Db::parseConversionExpr() { 3798 if (!consumeIf("cv")) 3799 return nullptr; 3800 Node *Ty; 3801 { 3802 SwapAndRestore<bool> SaveTemp(TryToParseTemplateArgs, false); 3803 Ty = parseType(); 3804 } 3805 3806 if (Ty == nullptr) 3807 return nullptr; 3808 3809 if (consumeIf('_')) { 3810 size_t ExprsBegin = Names.size(); 3811 while (!consumeIf('E')) { 3812 Node *E = parseExpr(); 3813 if (E == nullptr) 3814 return E; 3815 Names.push_back(E); 3816 } 3817 NodeArray Exprs = popTrailingNodeArray(ExprsBegin); 3818 return make<ConversionExpr>(Ty, Exprs); 3819 } 3820 3821 Node *E[1] = {parseExpr()}; 3822 if (E[0] == nullptr) 3823 return nullptr; 3824 return make<ConversionExpr>(Ty, makeNodeArray(E, E + 1)); 3825 } 3826 3827 // <expr-primary> ::= L <type> <value number> E # integer literal 3828 // ::= L <type> <value float> E # floating literal 3829 // ::= L <string type> E # string literal 3830 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") 3831 // FIXME: ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) 3832 // ::= L <mangled-name> E # external name 3833 Node *Db::parseExprPrimary() { 3834 if (!consumeIf('L')) 3835 return nullptr; 3836 switch (look()) { 3837 case 'w': 3838 ++First; 3839 return parseIntegerLiteral("wchar_t"); 3840 case 'b': 3841 if (consumeIf("b0E")) 3842 return make<BoolExpr>(0); 3843 if (consumeIf("b1E")) 3844 return make<BoolExpr>(1); 3845 return nullptr; 3846 case 'c': 3847 ++First; 3848 return parseIntegerLiteral("char"); 3849 case 'a': 3850 ++First; 3851 return parseIntegerLiteral("signed char"); 3852 case 'h': 3853 ++First; 3854 return parseIntegerLiteral("unsigned char"); 3855 case 's': 3856 ++First; 3857 return parseIntegerLiteral("short"); 3858 case 't': 3859 ++First; 3860 return parseIntegerLiteral("unsigned short"); 3861 case 'i': 3862 ++First; 3863 return parseIntegerLiteral(""); 3864 case 'j': 3865 ++First; 3866 return parseIntegerLiteral("u"); 3867 case 'l': 3868 ++First; 3869 return parseIntegerLiteral("l"); 3870 case 'm': 3871 ++First; 3872 return parseIntegerLiteral("ul"); 3873 case 'x': 3874 ++First; 3875 return parseIntegerLiteral("ll"); 3876 case 'y': 3877 ++First; 3878 return parseIntegerLiteral("ull"); 3879 case 'n': 3880 ++First; 3881 return parseIntegerLiteral("__int128"); 3882 case 'o': 3883 ++First; 3884 return parseIntegerLiteral("unsigned __int128"); 3885 case 'f': 3886 ++First; 3887 return parseFloatingLiteral<float>(); 3888 case 'd': 3889 ++First; 3890 return parseFloatingLiteral<double>(); 3891 case 'e': 3892 ++First; 3893 return parseFloatingLiteral<long double>(); 3894 case '_': 3895 if (consumeIf("_Z")) { 3896 Node *R = parseEncoding(); 3897 if (R != nullptr && consumeIf('E')) 3898 return R; 3899 } 3900 return nullptr; 3901 case 'T': 3902 // Invalid mangled name per 3903 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html 3904 return nullptr; 3905 default: { 3906 // might be named type 3907 Node *T = parseType(); 3908 if (T == nullptr) 3909 return nullptr; 3910 StringView N = parseNumber(); 3911 if (!N.empty()) { 3912 if (!consumeIf('E')) 3913 return nullptr; 3914 return make<IntegerCastExpr>(T, N); 3915 } 3916 if (consumeIf('E')) 3917 return T; 3918 return nullptr; 3919 } 3920 } 3921 } 3922 3923 // <braced-expression> ::= <expression> 3924 // ::= di <field source-name> <braced-expression> # .name = expr 3925 // ::= dx <index expression> <braced-expression> # [expr] = expr 3926 // ::= dX <range begin expression> <range end expression> <braced-expression> 3927 Node *Db::parseBracedExpr() { 3928 if (look() == 'd') { 3929 switch (look(1)) { 3930 case 'i': { 3931 First += 2; 3932 Node *Field = parseSourceName(/*NameState=*/nullptr); 3933 if (Field == nullptr) 3934 return nullptr; 3935 Node *Init = parseBracedExpr(); 3936 if (Init == nullptr) 3937 return nullptr; 3938 return make<BracedExpr>(Field, Init, /*isArray=*/false); 3939 } 3940 case 'x': { 3941 First += 2; 3942 Node *Index = parseExpr(); 3943 if (Index == nullptr) 3944 return nullptr; 3945 Node *Init = parseBracedExpr(); 3946 if (Init == nullptr) 3947 return nullptr; 3948 return make<BracedExpr>(Index, Init, /*isArray=*/true); 3949 } 3950 case 'X': { 3951 First += 2; 3952 Node *RangeBegin = parseExpr(); 3953 if (RangeBegin == nullptr) 3954 return nullptr; 3955 Node *RangeEnd = parseExpr(); 3956 if (RangeEnd == nullptr) 3957 return nullptr; 3958 Node *Init = parseBracedExpr(); 3959 if (Init == nullptr) 3960 return nullptr; 3961 return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init); 3962 } 3963 } 3964 } 3965 return parseExpr(); 3966 } 3967 3968 // (not yet in the spec) 3969 // <fold-expr> ::= fL <binary-operator-name> <expression> <expression> 3970 // ::= fR <binary-operator-name> <expression> <expression> 3971 // ::= fl <binary-operator-name> <expression> 3972 // ::= fr <binary-operator-name> <expression> 3973 Node *Db::parseFoldExpr() { 3974 if (!consumeIf('f')) 3975 return nullptr; 3976 3977 char FoldKind = look(); 3978 bool IsLeftFold, HasInitializer; 3979 HasInitializer = FoldKind == 'L' || FoldKind == 'R'; 3980 if (FoldKind == 'l' || FoldKind == 'L') 3981 IsLeftFold = true; 3982 else if (FoldKind == 'r' || FoldKind == 'R') 3983 IsLeftFold = false; 3984 else 3985 return nullptr; 3986 ++First; 3987 3988 // FIXME: This map is duplicated in parseOperatorName and parseExpr. 3989 StringView OperatorName; 3990 if (consumeIf("aa")) OperatorName = "&&"; 3991 else if (consumeIf("an")) OperatorName = "&"; 3992 else if (consumeIf("aN")) OperatorName = "&="; 3993 else if (consumeIf("aS")) OperatorName = "="; 3994 else if (consumeIf("cm")) OperatorName = ","; 3995 else if (consumeIf("ds")) OperatorName = ".*"; 3996 else if (consumeIf("dv")) OperatorName = "/"; 3997 else if (consumeIf("dV")) OperatorName = "/="; 3998 else if (consumeIf("eo")) OperatorName = "^"; 3999 else if (consumeIf("eO")) OperatorName = "^="; 4000 else if (consumeIf("eq")) OperatorName = "=="; 4001 else if (consumeIf("ge")) OperatorName = ">="; 4002 else if (consumeIf("gt")) OperatorName = ">"; 4003 else if (consumeIf("le")) OperatorName = "<="; 4004 else if (consumeIf("ls")) OperatorName = "<<"; 4005 else if (consumeIf("lS")) OperatorName = "<<="; 4006 else if (consumeIf("lt")) OperatorName = "<"; 4007 else if (consumeIf("mi")) OperatorName = "-"; 4008 else if (consumeIf("mI")) OperatorName = "-="; 4009 else if (consumeIf("ml")) OperatorName = "*"; 4010 else if (consumeIf("mL")) OperatorName = "*="; 4011 else if (consumeIf("ne")) OperatorName = "!="; 4012 else if (consumeIf("oo")) OperatorName = "||"; 4013 else if (consumeIf("or")) OperatorName = "|"; 4014 else if (consumeIf("oR")) OperatorName = "|="; 4015 else if (consumeIf("pl")) OperatorName = "+"; 4016 else if (consumeIf("pL")) OperatorName = "+="; 4017 else if (consumeIf("rm")) OperatorName = "%"; 4018 else if (consumeIf("rM")) OperatorName = "%="; 4019 else if (consumeIf("rs")) OperatorName = ">>"; 4020 else if (consumeIf("rS")) OperatorName = ">>="; 4021 else return nullptr; 4022 4023 Node *Pack = parseExpr(), *Init = nullptr; 4024 if (Pack == nullptr) 4025 return nullptr; 4026 if (HasInitializer) { 4027 Init = parseExpr(); 4028 if (Init == nullptr) 4029 return nullptr; 4030 } 4031 4032 if (IsLeftFold && Init) 4033 std::swap(Pack, Init); 4034 4035 return make<FoldExpr>(IsLeftFold, OperatorName, Pack, Init); 4036 } 4037 4038 // <expression> ::= <unary operator-name> <expression> 4039 // ::= <binary operator-name> <expression> <expression> 4040 // ::= <ternary operator-name> <expression> <expression> <expression> 4041 // ::= cl <expression>+ E # call 4042 // ::= cv <type> <expression> # conversion with one argument 4043 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments 4044 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type 4045 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 4046 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type 4047 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 4048 // ::= [gs] dl <expression> # delete expression 4049 // ::= [gs] da <expression> # delete[] expression 4050 // ::= pp_ <expression> # prefix ++ 4051 // ::= mm_ <expression> # prefix -- 4052 // ::= ti <type> # typeid (type) 4053 // ::= te <expression> # typeid (expression) 4054 // ::= dc <type> <expression> # dynamic_cast<type> (expression) 4055 // ::= sc <type> <expression> # static_cast<type> (expression) 4056 // ::= cc <type> <expression> # const_cast<type> (expression) 4057 // ::= rc <type> <expression> # reinterpret_cast<type> (expression) 4058 // ::= st <type> # sizeof (a type) 4059 // ::= sz <expression> # sizeof (an expression) 4060 // ::= at <type> # alignof (a type) 4061 // ::= az <expression> # alignof (an expression) 4062 // ::= nx <expression> # noexcept (expression) 4063 // ::= <template-param> 4064 // ::= <function-param> 4065 // ::= dt <expression> <unresolved-name> # expr.name 4066 // ::= pt <expression> <unresolved-name> # expr->name 4067 // ::= ds <expression> <expression> # expr.*expr 4068 // ::= sZ <template-param> # size of a parameter pack 4069 // ::= sZ <function-param> # size of a function parameter pack 4070 // ::= sP <template-arg>* E # sizeof...(T), size of a captured template parameter pack from an alias template 4071 // ::= sp <expression> # pack expansion 4072 // ::= tw <expression> # throw expression 4073 // ::= tr # throw with no operand (rethrow) 4074 // ::= <unresolved-name> # f(p), N::f(p), ::f(p), 4075 // # freestanding dependent name (e.g., T::x), 4076 // # objectless nonstatic member reference 4077 // ::= fL <binary-operator-name> <expression> <expression> 4078 // ::= fR <binary-operator-name> <expression> <expression> 4079 // ::= fl <binary-operator-name> <expression> 4080 // ::= fr <binary-operator-name> <expression> 4081 // ::= <expr-primary> 4082 Node *Db::parseExpr() { 4083 bool Global = consumeIf("gs"); 4084 if (numLeft() < 2) 4085 return nullptr; 4086 4087 switch (*First) { 4088 case 'L': 4089 return parseExprPrimary(); 4090 case 'T': 4091 return parseTemplateParam(); 4092 case 'f': { 4093 // Disambiguate a fold expression from a <function-param>. 4094 if (look(1) == 'p' || (look(1) == 'L' && std::isdigit(look(2)))) 4095 return parseFunctionParam(); 4096 return parseFoldExpr(); 4097 } 4098 case 'a': 4099 switch (First[1]) { 4100 case 'a': 4101 First += 2; 4102 return parseBinaryExpr("&&"); 4103 case 'd': 4104 First += 2; 4105 return parsePrefixExpr("&"); 4106 case 'n': 4107 First += 2; 4108 return parseBinaryExpr("&"); 4109 case 'N': 4110 First += 2; 4111 return parseBinaryExpr("&="); 4112 case 'S': 4113 First += 2; 4114 return parseBinaryExpr("="); 4115 case 't': { 4116 First += 2; 4117 Node *Ty = parseType(); 4118 if (Ty == nullptr) 4119 return nullptr; 4120 return make<EnclosingExpr>("alignof (", Ty, ")"); 4121 } 4122 case 'z': { 4123 First += 2; 4124 Node *Ty = parseExpr(); 4125 if (Ty == nullptr) 4126 return nullptr; 4127 return make<EnclosingExpr>("alignof (", Ty, ")"); 4128 } 4129 } 4130 return nullptr; 4131 case 'c': 4132 switch (First[1]) { 4133 // cc <type> <expression> # const_cast<type>(expression) 4134 case 'c': { 4135 First += 2; 4136 Node *Ty = parseType(); 4137 if (Ty == nullptr) 4138 return Ty; 4139 Node *Ex = parseExpr(); 4140 if (Ex == nullptr) 4141 return Ex; 4142 return make<CastExpr>("const_cast", Ty, Ex); 4143 } 4144 // cl <expression>+ E # call 4145 case 'l': { 4146 First += 2; 4147 Node *Callee = parseExpr(); 4148 if (Callee == nullptr) 4149 return Callee; 4150 size_t ExprsBegin = Names.size(); 4151 while (!consumeIf('E')) { 4152 Node *E = parseExpr(); 4153 if (E == nullptr) 4154 return E; 4155 Names.push_back(E); 4156 } 4157 return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin)); 4158 } 4159 case 'm': 4160 First += 2; 4161 return parseBinaryExpr(","); 4162 case 'o': 4163 First += 2; 4164 return parsePrefixExpr("~"); 4165 case 'v': 4166 return parseConversionExpr(); 4167 } 4168 return nullptr; 4169 case 'd': 4170 switch (First[1]) { 4171 case 'a': { 4172 First += 2; 4173 Node *Ex = parseExpr(); 4174 if (Ex == nullptr) 4175 return Ex; 4176 return make<DeleteExpr>(Ex, Global, /*is_array=*/true); 4177 } 4178 case 'c': { 4179 First += 2; 4180 Node *T = parseType(); 4181 if (T == nullptr) 4182 return T; 4183 Node *Ex = parseExpr(); 4184 if (Ex == nullptr) 4185 return Ex; 4186 return make<CastExpr>("dynamic_cast", T, Ex); 4187 } 4188 case 'e': 4189 First += 2; 4190 return parsePrefixExpr("*"); 4191 case 'l': { 4192 First += 2; 4193 Node *E = parseExpr(); 4194 if (E == nullptr) 4195 return E; 4196 return make<DeleteExpr>(E, Global, /*is_array=*/false); 4197 } 4198 case 'n': 4199 return parseUnresolvedName(); 4200 case 's': { 4201 First += 2; 4202 Node *LHS = parseExpr(); 4203 if (LHS == nullptr) 4204 return nullptr; 4205 Node *RHS = parseExpr(); 4206 if (RHS == nullptr) 4207 return nullptr; 4208 return make<MemberExpr>(LHS, ".*", RHS); 4209 } 4210 case 't': { 4211 First += 2; 4212 Node *LHS = parseExpr(); 4213 if (LHS == nullptr) 4214 return LHS; 4215 Node *RHS = parseExpr(); 4216 if (RHS == nullptr) 4217 return nullptr; 4218 return make<MemberExpr>(LHS, ".", RHS); 4219 } 4220 case 'v': 4221 First += 2; 4222 return parseBinaryExpr("/"); 4223 case 'V': 4224 First += 2; 4225 return parseBinaryExpr("/="); 4226 } 4227 return nullptr; 4228 case 'e': 4229 switch (First[1]) { 4230 case 'o': 4231 First += 2; 4232 return parseBinaryExpr("^"); 4233 case 'O': 4234 First += 2; 4235 return parseBinaryExpr("^="); 4236 case 'q': 4237 First += 2; 4238 return parseBinaryExpr("=="); 4239 } 4240 return nullptr; 4241 case 'g': 4242 switch (First[1]) { 4243 case 'e': 4244 First += 2; 4245 return parseBinaryExpr(">="); 4246 case 't': 4247 First += 2; 4248 return parseBinaryExpr(">"); 4249 } 4250 return nullptr; 4251 case 'i': 4252 switch (First[1]) { 4253 case 'x': { 4254 First += 2; 4255 Node *Base = parseExpr(); 4256 if (Base == nullptr) 4257 return nullptr; 4258 Node *Index = parseExpr(); 4259 if (Index == nullptr) 4260 return Index; 4261 return make<ArraySubscriptExpr>(Base, Index); 4262 } 4263 case 'l': { 4264 First += 2; 4265 size_t InitsBegin = Names.size(); 4266 while (!consumeIf('E')) { 4267 Node *E = parseBracedExpr(); 4268 if (E == nullptr) 4269 return nullptr; 4270 Names.push_back(E); 4271 } 4272 return make<InitListExpr>(nullptr, popTrailingNodeArray(InitsBegin)); 4273 } 4274 } 4275 return nullptr; 4276 case 'l': 4277 switch (First[1]) { 4278 case 'e': 4279 First += 2; 4280 return parseBinaryExpr("<="); 4281 case 's': 4282 First += 2; 4283 return parseBinaryExpr("<<"); 4284 case 'S': 4285 First += 2; 4286 return parseBinaryExpr("<<="); 4287 case 't': 4288 First += 2; 4289 return parseBinaryExpr("<"); 4290 } 4291 return nullptr; 4292 case 'm': 4293 switch (First[1]) { 4294 case 'i': 4295 First += 2; 4296 return parseBinaryExpr("-"); 4297 case 'I': 4298 First += 2; 4299 return parseBinaryExpr("-="); 4300 case 'l': 4301 First += 2; 4302 return parseBinaryExpr("*"); 4303 case 'L': 4304 First += 2; 4305 return parseBinaryExpr("*="); 4306 case 'm': 4307 First += 2; 4308 if (consumeIf('_')) 4309 return parsePrefixExpr("--"); 4310 Node *Ex = parseExpr(); 4311 if (Ex == nullptr) 4312 return nullptr; 4313 return make<PostfixExpr>(Ex, "--"); 4314 } 4315 return nullptr; 4316 case 'n': 4317 switch (First[1]) { 4318 case 'a': 4319 case 'w': 4320 return parseNewExpr(); 4321 case 'e': 4322 First += 2; 4323 return parseBinaryExpr("!="); 4324 case 'g': 4325 First += 2; 4326 return parsePrefixExpr("-"); 4327 case 't': 4328 First += 2; 4329 return parsePrefixExpr("!"); 4330 case 'x': 4331 First += 2; 4332 Node *Ex = parseExpr(); 4333 if (Ex == nullptr) 4334 return Ex; 4335 return make<EnclosingExpr>("noexcept (", Ex, ")"); 4336 } 4337 return nullptr; 4338 case 'o': 4339 switch (First[1]) { 4340 case 'n': 4341 return parseUnresolvedName(); 4342 case 'o': 4343 First += 2; 4344 return parseBinaryExpr("||"); 4345 case 'r': 4346 First += 2; 4347 return parseBinaryExpr("|"); 4348 case 'R': 4349 First += 2; 4350 return parseBinaryExpr("|="); 4351 } 4352 return nullptr; 4353 case 'p': 4354 switch (First[1]) { 4355 case 'm': 4356 First += 2; 4357 return parseBinaryExpr("->*"); 4358 case 'l': 4359 First += 2; 4360 return parseBinaryExpr("+"); 4361 case 'L': 4362 First += 2; 4363 return parseBinaryExpr("+="); 4364 case 'p': { 4365 First += 2; 4366 if (consumeIf('_')) 4367 return parsePrefixExpr("++"); 4368 Node *Ex = parseExpr(); 4369 if (Ex == nullptr) 4370 return Ex; 4371 return make<PostfixExpr>(Ex, "++"); 4372 } 4373 case 's': 4374 First += 2; 4375 return parsePrefixExpr("+"); 4376 case 't': { 4377 First += 2; 4378 Node *L = parseExpr(); 4379 if (L == nullptr) 4380 return nullptr; 4381 Node *R = parseExpr(); 4382 if (R == nullptr) 4383 return nullptr; 4384 return make<MemberExpr>(L, "->", R); 4385 } 4386 } 4387 return nullptr; 4388 case 'q': 4389 if (First[1] == 'u') { 4390 First += 2; 4391 Node *Cond = parseExpr(); 4392 if (Cond == nullptr) 4393 return nullptr; 4394 Node *LHS = parseExpr(); 4395 if (LHS == nullptr) 4396 return nullptr; 4397 Node *RHS = parseExpr(); 4398 if (RHS == nullptr) 4399 return nullptr; 4400 return make<ConditionalExpr>(Cond, LHS, RHS); 4401 } 4402 return nullptr; 4403 case 'r': 4404 switch (First[1]) { 4405 case 'c': { 4406 First += 2; 4407 Node *T = parseType(); 4408 if (T == nullptr) 4409 return T; 4410 Node *Ex = parseExpr(); 4411 if (Ex == nullptr) 4412 return Ex; 4413 return make<CastExpr>("reinterpret_cast", T, Ex); 4414 } 4415 case 'm': 4416 First += 2; 4417 return parseBinaryExpr("%"); 4418 case 'M': 4419 First += 2; 4420 return parseBinaryExpr("%="); 4421 case 's': 4422 First += 2; 4423 return parseBinaryExpr(">>"); 4424 case 'S': 4425 First += 2; 4426 return parseBinaryExpr(">>="); 4427 } 4428 return nullptr; 4429 case 's': 4430 switch (First[1]) { 4431 case 'c': { 4432 First += 2; 4433 Node *T = parseType(); 4434 if (T == nullptr) 4435 return T; 4436 Node *Ex = parseExpr(); 4437 if (Ex == nullptr) 4438 return Ex; 4439 return make<CastExpr>("static_cast", T, Ex); 4440 } 4441 case 'p': { 4442 First += 2; 4443 Node *Child = parseExpr(); 4444 if (Child == nullptr) 4445 return nullptr; 4446 return make<ParameterPackExpansion>(Child); 4447 } 4448 case 'r': 4449 return parseUnresolvedName(); 4450 case 't': { 4451 First += 2; 4452 Node *Ty = parseType(); 4453 if (Ty == nullptr) 4454 return Ty; 4455 return make<EnclosingExpr>("sizeof (", Ty, ")"); 4456 } 4457 case 'z': { 4458 First += 2; 4459 Node *Ex = parseExpr(); 4460 if (Ex == nullptr) 4461 return Ex; 4462 return make<EnclosingExpr>("sizeof (", Ex, ")"); 4463 } 4464 case 'Z': 4465 First += 2; 4466 if (look() == 'T') { 4467 Node *R = parseTemplateParam(); 4468 if (R == nullptr) 4469 return nullptr; 4470 return make<SizeofParamPackExpr>(R); 4471 } else if (look() == 'f') { 4472 Node *FP = parseFunctionParam(); 4473 if (FP == nullptr) 4474 return nullptr; 4475 return make<EnclosingExpr>("sizeof... (", FP, ")"); 4476 } 4477 return nullptr; 4478 case 'P': { 4479 First += 2; 4480 size_t ArgsBegin = Names.size(); 4481 while (!consumeIf('E')) { 4482 Node *Arg = parseTemplateArg(); 4483 if (Arg == nullptr) 4484 return nullptr; 4485 Names.push_back(Arg); 4486 } 4487 return make<EnclosingExpr>( 4488 "sizeof... (", make<NodeArrayNode>(popTrailingNodeArray(ArgsBegin)), 4489 ")"); 4490 } 4491 } 4492 return nullptr; 4493 case 't': 4494 switch (First[1]) { 4495 case 'e': { 4496 First += 2; 4497 Node *Ex = parseExpr(); 4498 if (Ex == nullptr) 4499 return Ex; 4500 return make<EnclosingExpr>("typeid (", Ex, ")"); 4501 } 4502 case 'i': { 4503 First += 2; 4504 Node *Ty = parseType(); 4505 if (Ty == nullptr) 4506 return Ty; 4507 return make<EnclosingExpr>("typeid (", Ty, ")"); 4508 } 4509 case 'l': { 4510 First += 2; 4511 Node *Ty = parseType(); 4512 if (Ty == nullptr) 4513 return nullptr; 4514 size_t InitsBegin = Names.size(); 4515 while (!consumeIf('E')) { 4516 Node *E = parseBracedExpr(); 4517 if (E == nullptr) 4518 return nullptr; 4519 Names.push_back(E); 4520 } 4521 return make<InitListExpr>(Ty, popTrailingNodeArray(InitsBegin)); 4522 } 4523 case 'r': 4524 First += 2; 4525 return make<NameType>("throw"); 4526 case 'w': { 4527 First += 2; 4528 Node *Ex = parseExpr(); 4529 if (Ex == nullptr) 4530 return nullptr; 4531 return make<ThrowExpr>(Ex); 4532 } 4533 } 4534 return nullptr; 4535 case '1': 4536 case '2': 4537 case '3': 4538 case '4': 4539 case '5': 4540 case '6': 4541 case '7': 4542 case '8': 4543 case '9': 4544 return parseUnresolvedName(); 4545 } 4546 return nullptr; 4547 } 4548 4549 // <call-offset> ::= h <nv-offset> _ 4550 // ::= v <v-offset> _ 4551 // 4552 // <nv-offset> ::= <offset number> 4553 // # non-virtual base override 4554 // 4555 // <v-offset> ::= <offset number> _ <virtual offset number> 4556 // # virtual base override, with vcall offset 4557 bool Db::parseCallOffset() { 4558 // Just scan through the call offset, we never add this information into the 4559 // output. 4560 if (consumeIf('h')) 4561 return parseNumber(true).empty() || !consumeIf('_'); 4562 if (consumeIf('v')) 4563 return parseNumber(true).empty() || !consumeIf('_') || 4564 parseNumber(true).empty() || !consumeIf('_'); 4565 return true; 4566 } 4567 4568 // <special-name> ::= TV <type> # virtual table 4569 // ::= TT <type> # VTT structure (construction vtable index) 4570 // ::= TI <type> # typeinfo structure 4571 // ::= TS <type> # typeinfo name (null-terminated byte string) 4572 // ::= Tc <call-offset> <call-offset> <base encoding> 4573 // # base is the nominal target function of thunk 4574 // # first call-offset is 'this' adjustment 4575 // # second call-offset is result adjustment 4576 // ::= T <call-offset> <base encoding> 4577 // # base is the nominal target function of thunk 4578 // ::= GV <object name> # Guard variable for one-time initialization 4579 // # No <type> 4580 // ::= TW <object name> # Thread-local wrapper 4581 // ::= TH <object name> # Thread-local initialization 4582 // ::= GR <object name> _ # First temporary 4583 // ::= GR <object name> <seq-id> _ # Subsequent temporaries 4584 // extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first 4585 // extension ::= GR <object name> # reference temporary for object 4586 Node *Db::parseSpecialName() { 4587 switch (look()) { 4588 case 'T': 4589 switch (look(1)) { 4590 // TV <type> # virtual table 4591 case 'V': { 4592 First += 2; 4593 Node *Ty = parseType(); 4594 if (Ty == nullptr) 4595 return nullptr; 4596 return make<SpecialName>("vtable for ", Ty); 4597 } 4598 // TT <type> # VTT structure (construction vtable index) 4599 case 'T': { 4600 First += 2; 4601 Node *Ty = parseType(); 4602 if (Ty == nullptr) 4603 return nullptr; 4604 return make<SpecialName>("VTT for ", Ty); 4605 } 4606 // TI <type> # typeinfo structure 4607 case 'I': { 4608 First += 2; 4609 Node *Ty = parseType(); 4610 if (Ty == nullptr) 4611 return nullptr; 4612 return make<SpecialName>("typeinfo for ", Ty); 4613 } 4614 // TS <type> # typeinfo name (null-terminated byte string) 4615 case 'S': { 4616 First += 2; 4617 Node *Ty = parseType(); 4618 if (Ty == nullptr) 4619 return nullptr; 4620 return make<SpecialName>("typeinfo name for ", Ty); 4621 } 4622 // Tc <call-offset> <call-offset> <base encoding> 4623 case 'c': { 4624 First += 2; 4625 if (parseCallOffset() || parseCallOffset()) 4626 return nullptr; 4627 Node *Encoding = parseEncoding(); 4628 if (Encoding == nullptr) 4629 return nullptr; 4630 return make<SpecialName>("covariant return thunk to ", Encoding); 4631 } 4632 // extension ::= TC <first type> <number> _ <second type> 4633 // # construction vtable for second-in-first 4634 case 'C': { 4635 First += 2; 4636 Node *FirstType = parseType(); 4637 if (FirstType == nullptr) 4638 return nullptr; 4639 if (parseNumber(true).empty() || !consumeIf('_')) 4640 return nullptr; 4641 Node *SecondType = parseType(); 4642 if (SecondType == nullptr) 4643 return nullptr; 4644 return make<CtorVtableSpecialName>(SecondType, FirstType); 4645 } 4646 // TW <object name> # Thread-local wrapper 4647 case 'W': { 4648 First += 2; 4649 Node *Name = parseName(); 4650 if (Name == nullptr) 4651 return nullptr; 4652 return make<SpecialName>("thread-local wrapper routine for ", Name); 4653 } 4654 // TH <object name> # Thread-local initialization 4655 case 'H': { 4656 First += 2; 4657 Node *Name = parseName(); 4658 if (Name == nullptr) 4659 return nullptr; 4660 return make<SpecialName>("thread-local initialization routine for ", Name); 4661 } 4662 // T <call-offset> <base encoding> 4663 default: { 4664 ++First; 4665 bool IsVirt = look() == 'v'; 4666 if (parseCallOffset()) 4667 return nullptr; 4668 Node *BaseEncoding = parseEncoding(); 4669 if (BaseEncoding == nullptr) 4670 return nullptr; 4671 if (IsVirt) 4672 return make<SpecialName>("virtual thunk to ", BaseEncoding); 4673 else 4674 return make<SpecialName>("non-virtual thunk to ", BaseEncoding); 4675 } 4676 } 4677 case 'G': 4678 switch (look(1)) { 4679 // GV <object name> # Guard variable for one-time initialization 4680 case 'V': { 4681 First += 2; 4682 Node *Name = parseName(); 4683 if (Name == nullptr) 4684 return nullptr; 4685 return make<SpecialName>("guard variable for ", Name); 4686 } 4687 // GR <object name> # reference temporary for object 4688 // GR <object name> _ # First temporary 4689 // GR <object name> <seq-id> _ # Subsequent temporaries 4690 case 'R': { 4691 First += 2; 4692 Node *Name = parseName(); 4693 if (Name == nullptr) 4694 return nullptr; 4695 size_t Count; 4696 bool ParsedSeqId = !parseSeqId(&Count); 4697 if (!consumeIf('_') && ParsedSeqId) 4698 return nullptr; 4699 return make<SpecialName>("reference temporary for ", Name); 4700 } 4701 } 4702 } 4703 return nullptr; 4704 } 4705 4706 // <encoding> ::= <function name> <bare-function-type> 4707 // ::= <data name> 4708 // ::= <special-name> 4709 Node *Db::parseEncoding() { 4710 if (look() == 'G' || look() == 'T') 4711 return parseSpecialName(); 4712 4713 auto IsEndOfEncoding = [&] { 4714 // The set of chars that can potentially follow an <encoding> (none of which 4715 // can start a <type>). Enumerating these allows us to avoid speculative 4716 // parsing. 4717 return numLeft() == 0 || look() == 'E' || look() == '.' || look() == '_'; 4718 }; 4719 4720 NameState NameInfo(this); 4721 Node *Name = parseName(&NameInfo); 4722 if (Name == nullptr) 4723 return nullptr; 4724 4725 if (resolveForwardTemplateRefs(NameInfo)) 4726 return nullptr; 4727 4728 if (IsEndOfEncoding()) 4729 return Name; 4730 4731 Node *Attrs = nullptr; 4732 if (consumeIf("Ua9enable_ifI")) { 4733 size_t BeforeArgs = Names.size(); 4734 while (!consumeIf('E')) { 4735 Node *Arg = parseTemplateArg(); 4736 if (Arg == nullptr) 4737 return nullptr; 4738 Names.push_back(Arg); 4739 } 4740 Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs)); 4741 } 4742 4743 Node *ReturnType = nullptr; 4744 if (!NameInfo.CtorDtorConversion && NameInfo.EndsWithTemplateArgs) { 4745 ReturnType = parseType(); 4746 if (ReturnType == nullptr) 4747 return nullptr; 4748 } 4749 4750 if (consumeIf('v')) 4751 return make<FunctionEncoding>(ReturnType, Name, NodeArray(), 4752 Attrs, NameInfo.CVQualifiers, 4753 NameInfo.ReferenceQualifier); 4754 4755 size_t ParamsBegin = Names.size(); 4756 do { 4757 Node *Ty = parseType(); 4758 if (Ty == nullptr) 4759 return nullptr; 4760 Names.push_back(Ty); 4761 } while (!IsEndOfEncoding()); 4762 4763 return make<FunctionEncoding>(ReturnType, Name, 4764 popTrailingNodeArray(ParamsBegin), 4765 Attrs, NameInfo.CVQualifiers, 4766 NameInfo.ReferenceQualifier); 4767 } 4768 4769 template <class Float> 4770 struct FloatData; 4771 4772 template <> 4773 struct FloatData<float> 4774 { 4775 static const size_t mangled_size = 8; 4776 static const size_t max_demangled_size = 24; 4777 static constexpr const char* spec = "%af"; 4778 }; 4779 4780 constexpr const char* FloatData<float>::spec; 4781 4782 template <> 4783 struct FloatData<double> 4784 { 4785 static const size_t mangled_size = 16; 4786 static const size_t max_demangled_size = 32; 4787 static constexpr const char* spec = "%a"; 4788 }; 4789 4790 constexpr const char* FloatData<double>::spec; 4791 4792 template <> 4793 struct FloatData<long double> 4794 { 4795 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \ 4796 defined(__wasm__) 4797 static const size_t mangled_size = 32; 4798 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__) 4799 static const size_t mangled_size = 16; 4800 #else 4801 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms 4802 #endif 4803 static const size_t max_demangled_size = 40; 4804 static constexpr const char *spec = "%LaL"; 4805 }; 4806 4807 constexpr const char *FloatData<long double>::spec; 4808 4809 template <class Float> Node *Db::parseFloatingLiteral() { 4810 const size_t N = FloatData<Float>::mangled_size; 4811 if (numLeft() <= N) 4812 return nullptr; 4813 StringView Data(First, First + N); 4814 for (char C : Data) 4815 if (!std::isxdigit(C)) 4816 return nullptr; 4817 First += N; 4818 if (!consumeIf('E')) 4819 return nullptr; 4820 return make<FloatExpr<Float>>(Data); 4821 } 4822 4823 // <seq-id> ::= <0-9A-Z>+ 4824 bool Db::parseSeqId(size_t *Out) { 4825 if (!(look() >= '0' && look() <= '9') && 4826 !(look() >= 'A' && look() <= 'Z')) 4827 return true; 4828 4829 size_t Id = 0; 4830 while (true) { 4831 if (look() >= '0' && look() <= '9') { 4832 Id *= 36; 4833 Id += static_cast<size_t>(look() - '0'); 4834 } else if (look() >= 'A' && look() <= 'Z') { 4835 Id *= 36; 4836 Id += static_cast<size_t>(look() - 'A') + 10; 4837 } else { 4838 *Out = Id; 4839 return false; 4840 } 4841 ++First; 4842 } 4843 } 4844 4845 // <substitution> ::= S <seq-id> _ 4846 // ::= S_ 4847 // <substitution> ::= Sa # ::std::allocator 4848 // <substitution> ::= Sb # ::std::basic_string 4849 // <substitution> ::= Ss # ::std::basic_string < char, 4850 // ::std::char_traits<char>, 4851 // ::std::allocator<char> > 4852 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > 4853 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > 4854 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > 4855 Node *Db::parseSubstitution() { 4856 if (!consumeIf('S')) 4857 return nullptr; 4858 4859 if (std::islower(look())) { 4860 Node *SpecialSub; 4861 switch (look()) { 4862 case 'a': 4863 ++First; 4864 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator); 4865 break; 4866 case 'b': 4867 ++First; 4868 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string); 4869 break; 4870 case 's': 4871 ++First; 4872 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string); 4873 break; 4874 case 'i': 4875 ++First; 4876 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream); 4877 break; 4878 case 'o': 4879 ++First; 4880 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream); 4881 break; 4882 case 'd': 4883 ++First; 4884 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream); 4885 break; 4886 default: 4887 return nullptr; 4888 } 4889 // Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution> 4890 // has ABI tags, the tags are appended to the substitution; the result is a 4891 // substitutable component. 4892 Node *WithTags = parseAbiTags(SpecialSub); 4893 if (WithTags != SpecialSub) { 4894 Subs.push_back(WithTags); 4895 SpecialSub = WithTags; 4896 } 4897 return SpecialSub; 4898 } 4899 4900 // ::= S_ 4901 if (consumeIf('_')) { 4902 if (Subs.empty()) 4903 return nullptr; 4904 return Subs[0]; 4905 } 4906 4907 // ::= S <seq-id> _ 4908 size_t Index = 0; 4909 if (parseSeqId(&Index)) 4910 return nullptr; 4911 ++Index; 4912 if (!consumeIf('_') || Index >= Subs.size()) 4913 return nullptr; 4914 return Subs[Index]; 4915 } 4916 4917 // <template-param> ::= T_ # first template parameter 4918 // ::= T <parameter-2 non-negative number> _ 4919 Node *Db::parseTemplateParam() { 4920 if (!consumeIf('T')) 4921 return nullptr; 4922 4923 size_t Index = 0; 4924 if (!consumeIf('_')) { 4925 if (parsePositiveInteger(&Index)) 4926 return nullptr; 4927 ++Index; 4928 if (!consumeIf('_')) 4929 return nullptr; 4930 } 4931 4932 // Itanium ABI 5.1.8: In a generic lambda, uses of auto in the parameter list 4933 // are mangled as the corresponding artificial template type parameter. 4934 if (ParsingLambdaParams) 4935 return make<NameType>("auto"); 4936 4937 // If we're in a context where this <template-param> refers to a 4938 // <template-arg> further ahead in the mangled name (currently just conversion 4939 // operator types), then we should only look it up in the right context. 4940 if (PermitForwardTemplateReferences) { 4941 ForwardTemplateRefs.push_back(make<ForwardTemplateReference>(Index)); 4942 return ForwardTemplateRefs.back(); 4943 } 4944 4945 if (Index >= TemplateParams.size()) 4946 return nullptr; 4947 return TemplateParams[Index]; 4948 } 4949 4950 // <template-arg> ::= <type> # type or template 4951 // ::= X <expression> E # expression 4952 // ::= <expr-primary> # simple expressions 4953 // ::= J <template-arg>* E # argument pack 4954 // ::= LZ <encoding> E # extension 4955 Node *Db::parseTemplateArg() { 4956 switch (look()) { 4957 case 'X': { 4958 ++First; 4959 Node *Arg = parseExpr(); 4960 if (Arg == nullptr || !consumeIf('E')) 4961 return nullptr; 4962 return Arg; 4963 } 4964 case 'J': { 4965 ++First; 4966 size_t ArgsBegin = Names.size(); 4967 while (!consumeIf('E')) { 4968 Node *Arg = parseTemplateArg(); 4969 if (Arg == nullptr) 4970 return nullptr; 4971 Names.push_back(Arg); 4972 } 4973 NodeArray Args = popTrailingNodeArray(ArgsBegin); 4974 return make<TemplateArgumentPack>(Args); 4975 } 4976 case 'L': { 4977 // ::= LZ <encoding> E # extension 4978 if (look(1) == 'Z') { 4979 First += 2; 4980 Node *Arg = parseEncoding(); 4981 if (Arg == nullptr || !consumeIf('E')) 4982 return nullptr; 4983 return Arg; 4984 } 4985 // ::= <expr-primary> # simple expressions 4986 return parseExprPrimary(); 4987 } 4988 default: 4989 return parseType(); 4990 } 4991 } 4992 4993 // <template-args> ::= I <template-arg>* E 4994 // extension, the abi says <template-arg>+ 4995 Node *Db::parseTemplateArgs(bool TagTemplates) { 4996 if (!consumeIf('I')) 4997 return nullptr; 4998 4999 // <template-params> refer to the innermost <template-args>. Clear out any 5000 // outer args that we may have inserted into TemplateParams. 5001 if (TagTemplates) 5002 TemplateParams.clear(); 5003 5004 size_t ArgsBegin = Names.size(); 5005 while (!consumeIf('E')) { 5006 if (TagTemplates) { 5007 auto OldParams = std::move(TemplateParams); 5008 Node *Arg = parseTemplateArg(); 5009 TemplateParams = std::move(OldParams); 5010 if (Arg == nullptr) 5011 return nullptr; 5012 Names.push_back(Arg); 5013 Node *TableEntry = Arg; 5014 if (Arg->getKind() == Node::KTemplateArgumentPack) { 5015 TableEntry = make<ParameterPack>( 5016 static_cast<TemplateArgumentPack*>(TableEntry)->getElements()); 5017 } 5018 TemplateParams.push_back(TableEntry); 5019 } else { 5020 Node *Arg = parseTemplateArg(); 5021 if (Arg == nullptr) 5022 return nullptr; 5023 Names.push_back(Arg); 5024 } 5025 } 5026 return make<TemplateArgs>(popTrailingNodeArray(ArgsBegin)); 5027 } 5028 5029 // <discriminator> := _ <non-negative number> # when number < 10 5030 // := __ <non-negative number> _ # when number >= 10 5031 // extension := decimal-digit+ # at the end of string 5032 5033 const char* 5034 parse_discriminator(const char* first, const char* last) 5035 { 5036 // parse but ignore discriminator 5037 if (first != last) 5038 { 5039 if (*first == '_') 5040 { 5041 const char* t1 = first+1; 5042 if (t1 != last) 5043 { 5044 if (std::isdigit(*t1)) 5045 first = t1+1; 5046 else if (*t1 == '_') 5047 { 5048 for (++t1; t1 != last && std::isdigit(*t1); ++t1) 5049 ; 5050 if (t1 != last && *t1 == '_') 5051 first = t1 + 1; 5052 } 5053 } 5054 } 5055 else if (std::isdigit(*first)) 5056 { 5057 const char* t1 = first+1; 5058 for (; t1 != last && std::isdigit(*t1); ++t1) 5059 ; 5060 if (t1 == last) 5061 first = last; 5062 } 5063 } 5064 return first; 5065 } 5066 5067 // <mangled-name> ::= _Z <encoding> 5068 // ::= <type> 5069 // extension ::= ___Z <encoding> _block_invoke 5070 // extension ::= ___Z <encoding> _block_invoke<decimal-digit>+ 5071 // extension ::= ___Z <encoding> _block_invoke_<decimal-digit>+ 5072 Node *Db::parse() { 5073 if (consumeIf("_Z")) { 5074 Node *Encoding = parseEncoding(); 5075 if (Encoding == nullptr) 5076 return nullptr; 5077 if (look() == '.') { 5078 Encoding = make<DotSuffix>(Encoding, StringView(First, Last)); 5079 First = Last; 5080 } 5081 if (numLeft() != 0) 5082 return nullptr; 5083 return Encoding; 5084 } 5085 5086 if (consumeIf("___Z")) { 5087 Node *Encoding = parseEncoding(); 5088 if (Encoding == nullptr || !consumeIf("_block_invoke")) 5089 return nullptr; 5090 bool RequireNumber = consumeIf('_'); 5091 if (parseNumber().empty() && RequireNumber) 5092 return nullptr; 5093 if (numLeft() != 0) 5094 return nullptr; 5095 return make<SpecialName>("invocation function for block in ", Encoding); 5096 } 5097 5098 Node *Ty = parseType(); 5099 if (numLeft() != 0) 5100 return nullptr; 5101 return Ty; 5102 } 5103 5104 bool initializeOutputStream(char *Buf, size_t *N, OutputStream &S, 5105 size_t InitSize) { 5106 size_t BufferSize; 5107 if (Buf == nullptr) { 5108 Buf = static_cast<char *>(std::malloc(InitSize)); 5109 if (Buf == nullptr) 5110 return true; 5111 BufferSize = InitSize; 5112 } else 5113 BufferSize = *N; 5114 5115 S.reset(Buf, BufferSize); 5116 return false; 5117 } 5118 5119 } // unnamed namespace 5120 5121 enum { 5122 unknown_error = -4, 5123 invalid_args = -3, 5124 invalid_mangled_name = -2, 5125 memory_alloc_failure = -1, 5126 success = 0, 5127 }; 5128 5129 char *llvm::itaniumDemangle(const char *MangledName, char *Buf, 5130 size_t *N, int *Status) { 5131 if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) { 5132 if (Status) 5133 *Status = invalid_args; 5134 return nullptr; 5135 } 5136 5137 int InternalStatus = success; 5138 Db Parser(MangledName, MangledName + std::strlen(MangledName)); 5139 OutputStream S; 5140 5141 Node *AST = Parser.parse(); 5142 5143 if (AST == nullptr) 5144 InternalStatus = invalid_mangled_name; 5145 else if (initializeOutputStream(Buf, N, S, 1024)) 5146 InternalStatus = memory_alloc_failure; 5147 else { 5148 assert(Parser.ForwardTemplateRefs.empty()); 5149 AST->print(S); 5150 S += '\0'; 5151 if (N != nullptr) 5152 *N = S.getCurrentPosition(); 5153 Buf = S.getBuffer(); 5154 } 5155 5156 if (Status) 5157 *Status = InternalStatus; 5158 return InternalStatus == success ? Buf : nullptr; 5159 } 5160 5161 namespace llvm { 5162 5163 ItaniumPartialDemangler::ItaniumPartialDemangler() 5164 : RootNode(nullptr), Context(new Db{nullptr, nullptr}) {} 5165 5166 ItaniumPartialDemangler::~ItaniumPartialDemangler() { 5167 delete static_cast<Db *>(Context); 5168 } 5169 5170 ItaniumPartialDemangler::ItaniumPartialDemangler( 5171 ItaniumPartialDemangler &&Other) 5172 : RootNode(Other.RootNode), Context(Other.Context) { 5173 Other.Context = Other.RootNode = nullptr; 5174 } 5175 5176 ItaniumPartialDemangler &ItaniumPartialDemangler:: 5177 operator=(ItaniumPartialDemangler &&Other) { 5178 std::swap(RootNode, Other.RootNode); 5179 std::swap(Context, Other.Context); 5180 return *this; 5181 } 5182 5183 // Demangle MangledName into an AST, storing it into this->RootNode. 5184 bool ItaniumPartialDemangler::partialDemangle(const char *MangledName) { 5185 Db *Parser = static_cast<Db *>(Context); 5186 size_t Len = std::strlen(MangledName); 5187 Parser->reset(MangledName, MangledName + Len); 5188 RootNode = Parser->parse(); 5189 return RootNode == nullptr; 5190 } 5191 5192 static char *printNode(Node *RootNode, char *Buf, size_t *N) { 5193 OutputStream S; 5194 if (initializeOutputStream(Buf, N, S, 128)) 5195 return nullptr; 5196 RootNode->print(S); 5197 S += '\0'; 5198 if (N != nullptr) 5199 *N = S.getCurrentPosition(); 5200 return S.getBuffer(); 5201 } 5202 5203 char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const { 5204 if (!isFunction()) 5205 return nullptr; 5206 5207 Node *Name = static_cast<FunctionEncoding *>(RootNode)->getName(); 5208 5209 while (true) { 5210 switch (Name->getKind()) { 5211 case Node::KAbiTagAttr: 5212 Name = static_cast<AbiTagAttr *>(Name)->Base; 5213 continue; 5214 case Node::KStdQualifiedName: 5215 Name = static_cast<StdQualifiedName *>(Name)->Child; 5216 continue; 5217 case Node::KNestedName: 5218 Name = static_cast<NestedName *>(Name)->Name; 5219 continue; 5220 case Node::KLocalName: 5221 Name = static_cast<LocalName *>(Name)->Entity; 5222 continue; 5223 case Node::KNameWithTemplateArgs: 5224 Name = static_cast<NameWithTemplateArgs *>(Name)->Name; 5225 continue; 5226 default: 5227 return printNode(Name, Buf, N); 5228 } 5229 } 5230 } 5231 5232 char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf, 5233 size_t *N) const { 5234 if (!isFunction()) 5235 return nullptr; 5236 Node *Name = static_cast<FunctionEncoding *>(RootNode)->getName(); 5237 5238 OutputStream S; 5239 if (initializeOutputStream(Buf, N, S, 128)) 5240 return nullptr; 5241 5242 KeepGoingLocalFunction: 5243 while (true) { 5244 if (Name->getKind() == Node::KAbiTagAttr) { 5245 Name = static_cast<AbiTagAttr *>(Name)->Base; 5246 continue; 5247 } 5248 if (Name->getKind() == Node::KNameWithTemplateArgs) { 5249 Name = static_cast<NameWithTemplateArgs *>(Name)->Name; 5250 continue; 5251 } 5252 break; 5253 } 5254 5255 switch (Name->getKind()) { 5256 case Node::KStdQualifiedName: 5257 S += "std"; 5258 break; 5259 case Node::KNestedName: 5260 static_cast<NestedName *>(Name)->Qual->print(S); 5261 break; 5262 case Node::KLocalName: { 5263 auto *LN = static_cast<LocalName *>(Name); 5264 LN->Encoding->print(S); 5265 S += "::"; 5266 Name = LN->Entity; 5267 goto KeepGoingLocalFunction; 5268 } 5269 default: 5270 break; 5271 } 5272 S += '\0'; 5273 if (N != nullptr) 5274 *N = S.getCurrentPosition(); 5275 return S.getBuffer(); 5276 } 5277 5278 char *ItaniumPartialDemangler::getFunctionName(char *Buf, size_t *N) const { 5279 if (!isFunction()) 5280 return nullptr; 5281 auto *Name = static_cast<FunctionEncoding *>(RootNode)->getName(); 5282 return printNode(Name, Buf, N); 5283 } 5284 5285 char *ItaniumPartialDemangler::getFunctionParameters(char *Buf, 5286 size_t *N) const { 5287 if (!isFunction()) 5288 return nullptr; 5289 NodeArray Params = static_cast<FunctionEncoding *>(RootNode)->getParams(); 5290 5291 OutputStream S; 5292 if (initializeOutputStream(Buf, N, S, 128)) 5293 return nullptr; 5294 5295 S += '('; 5296 Params.printWithComma(S); 5297 S += ')'; 5298 S += '\0'; 5299 if (N != nullptr) 5300 *N = S.getCurrentPosition(); 5301 return S.getBuffer(); 5302 } 5303 5304 char *ItaniumPartialDemangler::getFunctionReturnType( 5305 char *Buf, size_t *N) const { 5306 if (!isFunction()) 5307 return nullptr; 5308 5309 OutputStream S; 5310 if (initializeOutputStream(Buf, N, S, 128)) 5311 return nullptr; 5312 5313 if (Node *Ret = static_cast<FunctionEncoding *>(RootNode)->getReturnType()) 5314 Ret->print(S); 5315 5316 S += '\0'; 5317 if (N != nullptr) 5318 *N = S.getCurrentPosition(); 5319 return S.getBuffer(); 5320 } 5321 5322 char *ItaniumPartialDemangler::finishDemangle(char *Buf, size_t *N) const { 5323 assert(RootNode != nullptr && "must call partialDemangle()"); 5324 return printNode(static_cast<Node *>(RootNode), Buf, N); 5325 } 5326 5327 bool ItaniumPartialDemangler::hasFunctionQualifiers() const { 5328 assert(RootNode != nullptr && "must call partialDemangle()"); 5329 if (!isFunction()) 5330 return false; 5331 auto *E = static_cast<FunctionEncoding *>(RootNode); 5332 return E->getCVQuals() != QualNone || E->getRefQual() != FrefQualNone; 5333 } 5334 5335 bool ItaniumPartialDemangler::isCtorOrDtor() const { 5336 Node *N = static_cast<Node *>(RootNode); 5337 while (N) { 5338 switch (N->getKind()) { 5339 default: 5340 return false; 5341 case Node::KCtorDtorName: 5342 return true; 5343 5344 case Node::KAbiTagAttr: 5345 N = static_cast<AbiTagAttr *>(N)->Base; 5346 break; 5347 case Node::KFunctionEncoding: 5348 N = static_cast<FunctionEncoding *>(N)->getName(); 5349 break; 5350 case Node::KLocalName: 5351 N = static_cast<LocalName *>(N)->Entity; 5352 break; 5353 case Node::KNameWithTemplateArgs: 5354 N = static_cast<NameWithTemplateArgs *>(N)->Name; 5355 break; 5356 case Node::KNestedName: 5357 N = static_cast<NestedName *>(N)->Name; 5358 break; 5359 case Node::KStdQualifiedName: 5360 N = static_cast<StdQualifiedName *>(N)->Child; 5361 break; 5362 } 5363 } 5364 return false; 5365 } 5366 5367 bool ItaniumPartialDemangler::isFunction() const { 5368 assert(RootNode != nullptr && "must call partialDemangle()"); 5369 return static_cast<Node *>(RootNode)->getKind() == Node::KFunctionEncoding; 5370 } 5371 5372 bool ItaniumPartialDemangler::isSpecialName() const { 5373 assert(RootNode != nullptr && "must call partialDemangle()"); 5374 auto K = static_cast<Node *>(RootNode)->getKind(); 5375 return K == Node::KSpecialName || K == Node::KCtorVtableSpecialName; 5376 } 5377 5378 bool ItaniumPartialDemangler::isData() const { 5379 return !isFunction() && !isSpecialName(); 5380 } 5381 5382 } 5383