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