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