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