blob: 145298bd918711d68543379bb51ca9e2491fbb44 [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 {
156 KDotSuffix,
157 KVendorExtQualType,
158 KQualType,
159 KConversionOperatorType,
160 KPostfixQualifiedType,
161 KElaboratedTypeSpefType,
162 KNameType,
163 KAbiTagAttr,
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000164 KEnableIfAttr,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000165 KObjCProtoName,
166 KPointerType,
167 KLValueReferenceType,
168 KRValueReferenceType,
169 KPointerToMemberType,
170 KArrayType,
171 KFunctionType,
172 KNoexceptSpec,
173 KDynamicExceptionSpec,
174 KFunctionEncoding,
175 KLiteralOperator,
176 KSpecialName,
177 KCtorVtableSpecialName,
178 KQualifiedName,
179 KEmptyName,
180 KVectorType,
181 KParameterPack,
182 KTemplateArgumentPack,
183 KParameterPackExpansion,
184 KTemplateArgs,
185 KNameWithTemplateArgs,
186 KGlobalQualifiedName,
187 KStdQualifiedName,
188 KExpandedSpecialSubstitution,
189 KSpecialSubstitution,
190 KCtorDtorName,
191 KDtorName,
192 KUnnamedTypeName,
193 KClosureTypeName,
194 KStructuredBindingName,
195 KExpr,
196 KBracedExpr,
197 KBracedRangeExpr,
198 };
199
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000200 Kind K;
201
202 /// Three-way bool to track a cached value. Unknown is possible if this node
203 /// has an unexpanded parameter pack below it that may affect this cache.
204 enum class Cache : unsigned char { Yes, No, Unknown, };
205
206 /// Tracks if this node has a component on its right side, in which case we
207 /// need to call printRight.
208 Cache RHSComponentCache;
209
210 /// Track if this node is a (possibly qualified) array type. This can affect
211 /// how we format the output string.
212 Cache ArrayCache;
213
214 /// Track if this node is a (possibly qualified) function type. This can
215 /// affect how we format the output string.
216 Cache FunctionCache;
217
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000218 Node(Kind K_, Cache RHSComponentCache_ = Cache::No,
219 Cache ArrayCache_ = Cache::No, Cache FunctionCache_ = Cache::No)
220 : K(K_), RHSComponentCache(RHSComponentCache_), ArrayCache(ArrayCache_),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000221 FunctionCache(FunctionCache_) {}
222
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000223 bool hasRHSComponent(OutputStream &S) const {
224 if (RHSComponentCache != Cache::Unknown)
225 return RHSComponentCache == Cache::Yes;
226 return hasRHSComponentSlow(S);
227 }
228
229 bool hasArray(OutputStream &S) const {
230 if (ArrayCache != Cache::Unknown)
231 return ArrayCache == Cache::Yes;
232 return hasArraySlow(S);
233 }
234
235 bool hasFunction(OutputStream &S) const {
236 if (FunctionCache != Cache::Unknown)
237 return FunctionCache == Cache::Yes;
238 return hasFunctionSlow(S);
239 }
240
241 Kind getKind() const { return K; }
242
243 virtual bool hasRHSComponentSlow(OutputStream &) const { return false; }
244 virtual bool hasArraySlow(OutputStream &) const { return false; }
245 virtual bool hasFunctionSlow(OutputStream &) const { return false; }
246
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000247 void print(OutputStream &S) const {
248 printLeft(S);
249 if (RHSComponentCache != Cache::No)
250 printRight(S);
251 }
252
253 // Print the "left" side of this Node into OutputStream.
254 virtual void printLeft(OutputStream &) const = 0;
255
256 // Print the "right". This distinction is necessary to represent C++ types
257 // that appear on the RHS of their subtype, such as arrays or functions.
258 // Since most types don't have such a component, provide a default
259 // implemenation.
260 virtual void printRight(OutputStream &) const {}
261
262 virtual StringView getBaseName() const { return StringView(); }
263
264 // Silence compiler warnings, this dtor will never be called.
265 virtual ~Node() = default;
266
267#ifndef NDEBUG
268 LLVM_DUMP_METHOD void dump() const {
269 char *Buffer = static_cast<char*>(std::malloc(1024));
270 OutputStream S(Buffer, 1024);
271 print(S);
272 S += '\0';
273 printf("Symbol dump for %p: %s\n", (const void*)this, S.getBuffer());
274 std::free(S.getBuffer());
275 }
Rafael Espindolab940b662016-09-06 19:16:48 +0000276#endif
Rafael Espindolab940b662016-09-06 19:16:48 +0000277};
278
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000279class NodeArray {
280 Node **Elements;
281 size_t NumElements;
282
283public:
284 NodeArray() : Elements(nullptr), NumElements(0) {}
285 NodeArray(Node **Elements_, size_t NumElements_)
286 : Elements(Elements_), NumElements(NumElements_) {}
287
288 bool empty() const { return NumElements == 0; }
289 size_t size() const { return NumElements; }
290
291 Node **begin() const { return Elements; }
292 Node **end() const { return Elements + NumElements; }
293
294 Node *operator[](size_t Idx) const { return Elements[Idx]; }
295
296 void printWithComma(OutputStream &S) const {
297 bool FirstElement = true;
298 for (size_t Idx = 0; Idx != NumElements; ++Idx) {
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000299 size_t BeforeComma = S.getCurrentPosition();
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000300 if (!FirstElement)
301 S += ", ";
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000302 size_t AfterComma = S.getCurrentPosition();
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000303 Elements[Idx]->print(S);
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000304
305 // Elements[Idx] is an empty parameter pack expansion, we should erase the
306 // comma we just printed.
307 if (AfterComma == S.getCurrentPosition()) {
308 S.setCurrentPosition(BeforeComma);
309 continue;
310 }
311
312 FirstElement = false;
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000313 }
314 }
315};
316
317class DotSuffix final : public Node {
318 const Node *Prefix;
319 const StringView Suffix;
320
321public:
322 DotSuffix(Node *Prefix_, StringView Suffix_)
323 : Node(KDotSuffix), Prefix(Prefix_), Suffix(Suffix_) {}
324
325 void printLeft(OutputStream &s) const override {
326 Prefix->print(s);
327 s += " (";
328 s += Suffix;
329 s += ")";
330 }
331};
332
333class VendorExtQualType final : public Node {
334 const Node *Ty;
335 StringView Ext;
336
337public:
338 VendorExtQualType(Node *Ty_, StringView Ext_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000339 : Node(KVendorExtQualType), Ty(Ty_), Ext(Ext_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000340
341 void printLeft(OutputStream &S) const override {
342 Ty->print(S);
343 S += " ";
344 S += Ext;
345 }
346};
347
348enum FunctionRefQual : unsigned char {
349 FrefQualNone,
350 FrefQualLValue,
351 FrefQualRValue,
352};
353
354enum Qualifiers {
355 QualNone = 0,
356 QualConst = 0x1,
357 QualVolatile = 0x2,
358 QualRestrict = 0x4,
359};
360
361void addQualifiers(Qualifiers &Q1, Qualifiers Q2) {
362 Q1 = static_cast<Qualifiers>(Q1 | Q2);
Rafael Espindolab940b662016-09-06 19:16:48 +0000363}
364
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000365class QualType : public Node {
366protected:
367 const Qualifiers Quals;
368 const Node *Child;
369
370 void printQuals(OutputStream &S) const {
371 if (Quals & QualConst)
372 S += " const";
373 if (Quals & QualVolatile)
374 S += " volatile";
375 if (Quals & QualRestrict)
376 S += " restrict";
377 }
378
379public:
380 QualType(Node *Child_, Qualifiers Quals_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000381 : Node(KQualType, Child_->RHSComponentCache,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000382 Child_->ArrayCache, Child_->FunctionCache),
383 Quals(Quals_), Child(Child_) {}
384
385 bool hasRHSComponentSlow(OutputStream &S) const override {
386 return Child->hasRHSComponent(S);
387 }
388 bool hasArraySlow(OutputStream &S) const override {
389 return Child->hasArray(S);
390 }
391 bool hasFunctionSlow(OutputStream &S) const override {
392 return Child->hasFunction(S);
393 }
394
395 void printLeft(OutputStream &S) const override {
396 Child->printLeft(S);
397 printQuals(S);
398 }
399
400 void printRight(OutputStream &S) const override { Child->printRight(S); }
401};
402
403class ConversionOperatorType final : public Node {
404 const Node *Ty;
405
406public:
407 ConversionOperatorType(Node *Ty_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000408 : Node(KConversionOperatorType), Ty(Ty_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000409
410 void printLeft(OutputStream &S) const override {
411 S += "operator ";
412 Ty->print(S);
413 }
414};
415
416class PostfixQualifiedType final : public Node {
417 const Node *Ty;
418 const StringView Postfix;
419
420public:
421 PostfixQualifiedType(Node *Ty_, StringView Postfix_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000422 : Node(KPostfixQualifiedType), Ty(Ty_), Postfix(Postfix_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000423
424 void printLeft(OutputStream &s) const override {
425 Ty->printLeft(s);
426 s += Postfix;
427 }
428};
429
430class NameType final : public Node {
431 const StringView Name;
432
433public:
434 NameType(StringView Name_) : Node(KNameType), Name(Name_) {}
435
436 StringView getName() const { return Name; }
437 StringView getBaseName() const override { return Name; }
438
439 void printLeft(OutputStream &s) const override { s += Name; }
440};
441
442class ElaboratedTypeSpefType : public Node {
443 StringView Kind;
444 Node *Child;
445public:
446 ElaboratedTypeSpefType(StringView Kind_, Node *Child_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000447 : Node(KElaboratedTypeSpefType), Kind(Kind_), Child(Child_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000448
449 void printLeft(OutputStream &S) const override {
450 S += Kind;
451 S += ' ';
452 Child->print(S);
453 }
454};
455
456class AbiTagAttr final : public Node {
457 const Node* Base;
458 StringView Tag;
459public:
460 AbiTagAttr(const Node* Base_, StringView Tag_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000461 : Node(KAbiTagAttr, Base_->RHSComponentCache,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000462 Base_->ArrayCache, Base_->FunctionCache),
463 Base(Base_), Tag(Tag_) {}
464
465 void printLeft(OutputStream &S) const override {
466 Base->printLeft(S);
467 S += "[abi:";
468 S += Tag;
469 S += "]";
470 }
471};
472
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000473class EnableIfAttr : public Node {
474 NodeArray Conditions;
475public:
476 EnableIfAttr(NodeArray Conditions_)
477 : Node(KEnableIfAttr), Conditions(Conditions_) {}
478
479 void printLeft(OutputStream &S) const override {
480 S += " [enable_if:";
481 Conditions.printWithComma(S);
482 S += ']';
483 }
484};
485
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000486class ObjCProtoName : public Node {
487 Node *Ty;
488 StringView Protocol;
489
490 friend class PointerType;
491
492public:
493 ObjCProtoName(Node *Ty_, StringView Protocol_)
494 : Node(KObjCProtoName), Ty(Ty_), Protocol(Protocol_) {}
495
496 bool isObjCObject() const {
497 return Ty->getKind() == KNameType &&
498 static_cast<NameType *>(Ty)->getName() == "objc_object";
499 }
500
501 void printLeft(OutputStream &S) const override {
502 Ty->print(S);
503 S += "<";
504 S += Protocol;
505 S += ">";
506 }
507};
508
509class PointerType final : public Node {
510 const Node *Pointee;
511
512public:
513 PointerType(Node *Pointee_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000514 : Node(KPointerType, Pointee_->RHSComponentCache),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000515 Pointee(Pointee_) {}
516
517 bool hasRHSComponentSlow(OutputStream &S) const override {
518 return Pointee->hasRHSComponent(S);
519 }
520
521 void printLeft(OutputStream &s) const override {
522 // We rewrite objc_object<SomeProtocol>* into id<SomeProtocol>.
523 if (Pointee->getKind() != KObjCProtoName ||
524 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
525 Pointee->printLeft(s);
526 if (Pointee->hasArray(s))
527 s += " ";
528 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
529 s += "(";
530 s += "*";
531 } else {
532 const auto *objcProto = static_cast<const ObjCProtoName *>(Pointee);
533 s += "id<";
534 s += objcProto->Protocol;
535 s += ">";
Rafael Espindolab940b662016-09-06 19:16:48 +0000536 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000537 }
538
539 void printRight(OutputStream &s) const override {
540 if (Pointee->getKind() != KObjCProtoName ||
541 !static_cast<const ObjCProtoName *>(Pointee)->isObjCObject()) {
542 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
543 s += ")";
544 Pointee->printRight(s);
545 }
546 }
547};
548
549class LValueReferenceType final : public Node {
550 const Node *Pointee;
551
552public:
553 LValueReferenceType(Node *Pointee_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000554 : Node(KLValueReferenceType, Pointee_->RHSComponentCache),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000555 Pointee(Pointee_) {}
556
557 bool hasRHSComponentSlow(OutputStream &S) const override {
558 return Pointee->hasRHSComponent(S);
559 }
560
561 void printLeft(OutputStream &s) const override {
562 Pointee->printLeft(s);
563 if (Pointee->hasArray(s))
564 s += " ";
565 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
566 s += "(&";
567 else
568 s += "&";
569 }
570 void printRight(OutputStream &s) const override {
571 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
572 s += ")";
573 Pointee->printRight(s);
574 }
575};
576
577class RValueReferenceType final : public Node {
578 const Node *Pointee;
579
580public:
581 RValueReferenceType(Node *Pointee_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000582 : Node(KRValueReferenceType, Pointee_->RHSComponentCache),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000583 Pointee(Pointee_) {}
584
585 bool hasRHSComponentSlow(OutputStream &S) const override {
586 return Pointee->hasRHSComponent(S);
587 }
588
589 void printLeft(OutputStream &s) const override {
590 Pointee->printLeft(s);
591 if (Pointee->hasArray(s))
592 s += " ";
593 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
594 s += "(&&";
595 else
596 s += "&&";
597 }
598
599 void printRight(OutputStream &s) const override {
600 if (Pointee->hasArray(s) || Pointee->hasFunction(s))
601 s += ")";
602 Pointee->printRight(s);
603 }
604};
605
606class PointerToMemberType final : public Node {
607 const Node *ClassType;
608 const Node *MemberType;
609
610public:
611 PointerToMemberType(Node *ClassType_, Node *MemberType_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000612 : Node(KPointerToMemberType, MemberType_->RHSComponentCache),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000613 ClassType(ClassType_), MemberType(MemberType_) {}
614
615 bool hasRHSComponentSlow(OutputStream &S) const override {
616 return MemberType->hasRHSComponent(S);
617 }
618
619 void printLeft(OutputStream &s) const override {
620 MemberType->printLeft(s);
621 if (MemberType->hasArray(s) || MemberType->hasFunction(s))
622 s += "(";
623 else
624 s += " ";
625 ClassType->print(s);
626 s += "::*";
627 }
628
629 void printRight(OutputStream &s) const override {
630 if (MemberType->hasArray(s) || MemberType->hasFunction(s))
631 s += ")";
632 MemberType->printRight(s);
633 }
634};
635
636class NodeOrString {
637 const void *First;
638 const void *Second;
639
640public:
641 /* implicit */ NodeOrString(StringView Str) {
642 const char *FirstChar = Str.begin();
643 const char *SecondChar = Str.end();
644 if (SecondChar == nullptr) {
645 assert(FirstChar == SecondChar);
646 ++FirstChar, ++SecondChar;
647 }
648 First = static_cast<const void *>(FirstChar);
649 Second = static_cast<const void *>(SecondChar);
650 }
651
652 /* implicit */ NodeOrString(Node *N)
653 : First(static_cast<const void *>(N)), Second(nullptr) {}
654 NodeOrString() : First(nullptr), Second(nullptr) {}
655
656 bool isString() const { return Second && First; }
657 bool isNode() const { return First && !Second; }
658 bool isEmpty() const { return !First && !Second; }
659
660 StringView asString() const {
661 assert(isString());
662 return StringView(static_cast<const char *>(First),
663 static_cast<const char *>(Second));
664 }
665
666 const Node *asNode() const {
667 assert(isNode());
668 return static_cast<const Node *>(First);
669 }
670};
671
672class ArrayType final : public Node {
673 Node *Base;
674 NodeOrString Dimension;
675
676public:
677 ArrayType(Node *Base_, NodeOrString Dimension_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000678 : Node(KArrayType,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000679 /*RHSComponentCache=*/Cache::Yes,
680 /*ArrayCache=*/Cache::Yes),
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000681 Base(Base_), Dimension(Dimension_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000682
683 // Incomplete array type.
684 ArrayType(Node *Base_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000685 : Node(KArrayType,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000686 /*RHSComponentCache=*/Cache::Yes,
687 /*ArrayCache=*/Cache::Yes),
688 Base(Base_) {}
689
690 bool hasRHSComponentSlow(OutputStream &) const override { return true; }
691 bool hasArraySlow(OutputStream &) const override { return true; }
692
693 void printLeft(OutputStream &S) const override { Base->printLeft(S); }
694
695 void printRight(OutputStream &S) const override {
696 if (S.back() != ']')
697 S += " ";
698 S += "[";
699 if (Dimension.isString())
700 S += Dimension.asString();
701 else if (Dimension.isNode())
702 Dimension.asNode()->print(S);
703 S += "]";
704 Base->printRight(S);
705 }
706};
707
708class FunctionType final : public Node {
709 Node *Ret;
710 NodeArray Params;
711 Qualifiers CVQuals;
712 FunctionRefQual RefQual;
713 Node *ExceptionSpec;
714
715public:
716 FunctionType(Node *Ret_, NodeArray Params_, Qualifiers CVQuals_,
717 FunctionRefQual RefQual_, Node *ExceptionSpec_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000718 : Node(KFunctionType,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000719 /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No,
720 /*FunctionCache=*/Cache::Yes),
721 Ret(Ret_), Params(Params_), CVQuals(CVQuals_), RefQual(RefQual_),
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000722 ExceptionSpec(ExceptionSpec_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000723
724 bool hasRHSComponentSlow(OutputStream &) const override { return true; }
725 bool hasFunctionSlow(OutputStream &) const override { return true; }
726
727 // Handle C++'s ... quirky decl grammer by using the left & right
728 // distinction. Consider:
729 // int (*f(float))(char) {}
730 // f is a function that takes a float and returns a pointer to a function
731 // that takes a char and returns an int. If we're trying to print f, start
732 // by printing out the return types's left, then print our parameters, then
733 // finally print right of the return type.
734 void printLeft(OutputStream &S) const override {
735 Ret->printLeft(S);
736 S += " ";
737 }
738
739 void printRight(OutputStream &S) const override {
740 S += "(";
741 Params.printWithComma(S);
742 S += ")";
743 Ret->printRight(S);
744
745 if (CVQuals & QualConst)
746 S += " const";
747 if (CVQuals & QualVolatile)
748 S += " volatile";
749 if (CVQuals & QualRestrict)
750 S += " restrict";
751
752 if (RefQual == FrefQualLValue)
753 S += " &";
754 else if (RefQual == FrefQualRValue)
755 S += " &&";
756
757 if (ExceptionSpec != nullptr) {
758 S += ' ';
759 ExceptionSpec->print(S);
760 }
761 }
762};
763
764class NoexceptSpec : public Node {
765 Node *E;
766public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000767 NoexceptSpec(Node *E_) : Node(KNoexceptSpec), E(E_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000768
769 void printLeft(OutputStream &S) const override {
770 S += "noexcept(";
771 E->print(S);
772 S += ")";
773 }
774};
775
776class DynamicExceptionSpec : public Node {
777 NodeArray Types;
778public:
779 DynamicExceptionSpec(NodeArray Types_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000780 : Node(KDynamicExceptionSpec), Types(Types_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000781
782 void printLeft(OutputStream &S) const override {
783 S += "throw(";
784 Types.printWithComma(S);
785 S += ')';
786 }
787};
788
789class FunctionEncoding final : public Node {
790 const Node *Ret;
791 const Node *Name;
792 NodeArray Params;
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000793 Node *Attrs;
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000794 Qualifiers CVQuals;
795 FunctionRefQual RefQual;
796
797public:
798 FunctionEncoding(Node *Ret_, Node *Name_, NodeArray Params_,
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000799 Node *Attrs_, Qualifiers CVQuals_, FunctionRefQual RefQual_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000800 : Node(KFunctionEncoding,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000801 /*RHSComponentCache=*/Cache::Yes, /*ArrayCache=*/Cache::No,
802 /*FunctionCache=*/Cache::Yes),
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000803 Ret(Ret_), Name(Name_), Params(Params_), Attrs(Attrs_),
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000804 CVQuals(CVQuals_), RefQual(RefQual_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000805
806 bool hasRHSComponentSlow(OutputStream &) const override { return true; }
807 bool hasFunctionSlow(OutputStream &) const override { return true; }
808
809 Node *getName() { return const_cast<Node *>(Name); }
810
811 void printLeft(OutputStream &S) const override {
812 if (Ret) {
813 Ret->printLeft(S);
814 if (!Ret->hasRHSComponent(S))
815 S += " ";
816 }
817 Name->print(S);
818 }
819
820 void printRight(OutputStream &S) const override {
821 S += "(";
822 Params.printWithComma(S);
823 S += ")";
824 if (Ret)
825 Ret->printRight(S);
826
827 if (CVQuals & QualConst)
828 S += " const";
829 if (CVQuals & QualVolatile)
830 S += " volatile";
831 if (CVQuals & QualRestrict)
832 S += " restrict";
833
834 if (RefQual == FrefQualLValue)
835 S += " &";
836 else if (RefQual == FrefQualRValue)
837 S += " &&";
Erik Pilkingtonc7287862018-03-25 22:49:16 +0000838
839 if (Attrs != nullptr)
840 Attrs->print(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000841 }
842};
843
844class LiteralOperator : public Node {
845 const Node *OpName;
846
847public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000848 LiteralOperator(Node *OpName_) : Node(KLiteralOperator), OpName(OpName_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000849
850 void printLeft(OutputStream &S) const override {
851 S += "operator\"\" ";
852 OpName->print(S);
853 }
854};
855
856class SpecialName final : public Node {
857 const StringView Special;
858 const Node *Child;
859
860public:
861 SpecialName(StringView Special_, Node* Child_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000862 : Node(KSpecialName), Special(Special_), Child(Child_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000863
864 void printLeft(OutputStream &S) const override {
865 S += Special;
866 Child->print(S);
867 }
868};
869
870class CtorVtableSpecialName final : public Node {
871 const Node *FirstType;
872 const Node *SecondType;
873
874public:
875 CtorVtableSpecialName(Node *FirstType_, Node *SecondType_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000876 : Node(KCtorVtableSpecialName),
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000877 FirstType(FirstType_), SecondType(SecondType_) {}
878
879 void printLeft(OutputStream &S) const override {
880 S += "construction vtable for ";
881 FirstType->print(S);
882 S += "-in-";
883 SecondType->print(S);
884 }
885};
886
887class QualifiedName final : public Node {
888 // qualifier::name
889 const Node *Qualifier;
890 const Node *Name;
891
892public:
893 QualifiedName(Node* Qualifier_, Node* Name_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000894 : Node(KQualifiedName), Qualifier(Qualifier_), Name(Name_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000895
896 StringView getBaseName() const override { return Name->getBaseName(); }
897
898 void printLeft(OutputStream &S) const override {
899 Qualifier->print(S);
900 S += "::";
901 Name->print(S);
902 }
903};
904
905class EmptyName : public Node {
906public:
907 EmptyName() : Node(KEmptyName) {}
908 void printLeft(OutputStream &) const override {}
909};
910
911class VectorType final : public Node {
912 const Node *BaseType;
913 const NodeOrString Dimension;
914 const bool IsPixel;
915
916public:
917 VectorType(NodeOrString Dimension_)
918 : Node(KVectorType), BaseType(nullptr), Dimension(Dimension_),
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000919 IsPixel(true) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000920 VectorType(Node *BaseType_, NodeOrString Dimension_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000921 : Node(KVectorType), BaseType(BaseType_),
922 Dimension(Dimension_), IsPixel(false) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000923
924 void printLeft(OutputStream &S) const override {
925 if (IsPixel) {
926 S += "pixel vector[";
927 S += Dimension.asString();
928 S += "]";
929 } else {
930 BaseType->print(S);
931 S += " vector[";
932 if (Dimension.isNode())
933 Dimension.asNode()->print(S);
934 else if (Dimension.isString())
935 S += Dimension.asString();
936 S += "]";
937 }
938 }
939};
940
941/// An unexpanded parameter pack (either in the expression or type context). If
942/// this AST is correct, this node will have a ParameterPackExpansion node above
943/// it.
944///
945/// This node is created when some <template-args> are found that apply to an
946/// <encoding>, and is stored in the TemplateParams table. In order for this to
947/// appear in the final AST, it has to referenced via a <template-param> (ie,
948/// T_).
949class ParameterPack final : public Node {
950 NodeArray Data;
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000951
952 // Setup OutputStream for a pack expansion unless we're already expanding one.
953 void initializePackExpansion(OutputStream &S) const {
954 if (S.CurrentPackMax == std::numeric_limits<unsigned>::max()) {
955 S.CurrentPackMax = static_cast<unsigned>(Data.size());
956 S.CurrentPackIndex = 0;
957 }
958 }
959
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000960public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000961 ParameterPack(NodeArray Data_) : Node(KParameterPack), Data(Data_) {
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000962 ArrayCache = FunctionCache = RHSComponentCache = Cache::Unknown;
963 if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
964 return P->ArrayCache == Cache::No;
965 }))
966 ArrayCache = Cache::No;
967 if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
968 return P->FunctionCache == Cache::No;
969 }))
970 FunctionCache = Cache::No;
971 if (std::all_of(Data.begin(), Data.end(), [](Node* P) {
972 return P->RHSComponentCache == Cache::No;
973 }))
974 RHSComponentCache = Cache::No;
975 }
976
977 bool hasRHSComponentSlow(OutputStream &S) const override {
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000978 initializePackExpansion(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000979 size_t Idx = S.CurrentPackIndex;
980 return Idx < Data.size() && Data[Idx]->hasRHSComponent(S);
981 }
982 bool hasArraySlow(OutputStream &S) const override {
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000983 initializePackExpansion(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000984 size_t Idx = S.CurrentPackIndex;
985 return Idx < Data.size() && Data[Idx]->hasArray(S);
986 }
987 bool hasFunctionSlow(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]->hasFunction(S);
991 }
992
993 void printLeft(OutputStream &S) const override {
Erik Pilkington8c7013d2018-03-25 22:49:57 +0000994 initializePackExpansion(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +0000995 size_t Idx = S.CurrentPackIndex;
996 if (Idx < Data.size())
997 Data[Idx]->printLeft(S);
998 }
999 void printRight(OutputStream &S) const override {
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001000 initializePackExpansion(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001001 size_t Idx = S.CurrentPackIndex;
1002 if (Idx < Data.size())
1003 Data[Idx]->printRight(S);
1004 }
1005};
1006
1007/// A variadic template argument. This node represents an occurance of
1008/// J<something>E in some <template-args>. It isn't itself unexpanded, unless
1009/// one of it's Elements is. The parser inserts a ParameterPack into the
1010/// TemplateParams table if the <template-args> this pack belongs to apply to an
1011/// <encoding>.
1012class TemplateArgumentPack final : public Node {
1013 NodeArray Elements;
1014public:
1015 TemplateArgumentPack(NodeArray Elements_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001016 : Node(KTemplateArgumentPack), Elements(Elements_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001017
1018 NodeArray getElements() const { return Elements; }
1019
1020 void printLeft(OutputStream &S) const override {
1021 Elements.printWithComma(S);
1022 }
1023};
1024
1025/// A pack expansion. Below this node, there are some unexpanded ParameterPacks
1026/// which each have Child->ParameterPackSize elements.
1027class ParameterPackExpansion final : public Node {
1028 const Node *Child;
1029
1030public:
1031 ParameterPackExpansion(Node* Child_)
1032 : Node(KParameterPackExpansion), Child(Child_) {}
1033
1034 const Node *getChild() const { return Child; }
1035
1036 void printLeft(OutputStream &S) const override {
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001037 constexpr unsigned Max = std::numeric_limits<unsigned>::max();
1038 SwapAndRestore<unsigned> SavePackIdx(S.CurrentPackIndex, Max);
1039 SwapAndRestore<unsigned> SavePackMax(S.CurrentPackMax, Max);
1040 size_t StreamPos = S.getCurrentPosition();
1041
1042 // Print the first element in the pack. If Child contains a ParameterPack,
1043 // it will set up S.CurrentPackMax and print the first element.
1044 Child->print(S);
1045
1046 // No ParameterPack was found in Child. This can occur if we've found a pack
1047 // expansion on a <function-param>.
1048 if (S.CurrentPackMax == Max) {
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001049 S += "...";
1050 return;
1051 }
1052
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001053 // We found a ParameterPack, but it has no elements. Erase whatever we may
1054 // of printed.
1055 if (S.CurrentPackMax == 0) {
1056 S.setCurrentPosition(StreamPos);
1057 return;
1058 }
1059
1060 // Else, iterate through the rest of the elements in the pack.
1061 for (unsigned I = 1, E = S.CurrentPackMax; I < E; ++I) {
1062 S += ", ";
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001063 S.CurrentPackIndex = I;
1064 Child->print(S);
1065 }
1066 }
1067};
1068
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001069class TemplateArgs final : public Node {
1070 NodeArray Params;
1071
1072public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001073 TemplateArgs(NodeArray Params_) : Node(KTemplateArgs), Params(Params_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001074
1075 NodeArray getParams() { return Params; }
1076
1077 void printLeft(OutputStream &S) const override {
1078 S += "<";
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001079 Params.printWithComma(S);
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001080 if (S.back() == '>')
1081 S += " ";
1082 S += ">";
1083 }
1084};
1085
1086class NameWithTemplateArgs final : public Node {
1087 // name<template_args>
1088 Node *Name;
1089 Node *TemplateArgs;
1090
1091public:
1092 NameWithTemplateArgs(Node *Name_, Node *TemplateArgs_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001093 : Node(KNameWithTemplateArgs), Name(Name_), TemplateArgs(TemplateArgs_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001094
1095 StringView getBaseName() const override { return Name->getBaseName(); }
1096
1097 void printLeft(OutputStream &S) const override {
1098 Name->print(S);
1099 TemplateArgs->print(S);
1100 }
1101};
1102
1103class GlobalQualifiedName final : public Node {
1104 Node *Child;
1105
1106public:
1107 GlobalQualifiedName(Node* Child_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001108 : Node(KGlobalQualifiedName), Child(Child_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001109
1110 StringView getBaseName() const override { return Child->getBaseName(); }
1111
1112 void printLeft(OutputStream &S) const override {
1113 S += "::";
1114 Child->print(S);
1115 }
1116};
1117
1118class StdQualifiedName final : public Node {
1119 Node *Child;
1120
1121public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001122 StdQualifiedName(Node *Child_) : Node(KStdQualifiedName), Child(Child_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001123
1124 StringView getBaseName() const override { return Child->getBaseName(); }
1125
1126 void printLeft(OutputStream &S) const override {
1127 S += "std::";
1128 Child->print(S);
1129 }
1130};
1131
1132enum class SpecialSubKind {
1133 allocator,
1134 basic_string,
1135 string,
1136 istream,
1137 ostream,
1138 iostream,
1139};
1140
1141class ExpandedSpecialSubstitution final : public Node {
1142 SpecialSubKind SSK;
1143
1144public:
1145 ExpandedSpecialSubstitution(SpecialSubKind SSK_)
1146 : Node(KExpandedSpecialSubstitution), SSK(SSK_) {}
1147
1148 StringView getBaseName() const override {
1149 switch (SSK) {
1150 case SpecialSubKind::allocator:
1151 return StringView("allocator");
1152 case SpecialSubKind::basic_string:
1153 return StringView("basic_string");
1154 case SpecialSubKind::string:
1155 return StringView("basic_string");
1156 case SpecialSubKind::istream:
1157 return StringView("basic_istream");
1158 case SpecialSubKind::ostream:
1159 return StringView("basic_ostream");
1160 case SpecialSubKind::iostream:
1161 return StringView("basic_iostream");
1162 }
1163 LLVM_BUILTIN_UNREACHABLE;
1164 }
1165
1166 void printLeft(OutputStream &S) const override {
1167 switch (SSK) {
1168 case SpecialSubKind::allocator:
1169 S += "std::basic_string<char, std::char_traits<char>, "
1170 "std::allocator<char> >";
1171 break;
1172 case SpecialSubKind::basic_string:
1173 case SpecialSubKind::string:
1174 S += "std::basic_string<char, std::char_traits<char>, "
1175 "std::allocator<char> >";
1176 break;
1177 case SpecialSubKind::istream:
1178 S += "std::basic_istream<char, std::char_traits<char> >";
1179 break;
1180 case SpecialSubKind::ostream:
1181 S += "std::basic_ostream<char, std::char_traits<char> >";
1182 break;
1183 case SpecialSubKind::iostream:
1184 S += "std::basic_iostream<char, std::char_traits<char> >";
1185 break;
1186 }
1187 }
1188};
1189
1190class SpecialSubstitution final : public Node {
1191public:
1192 SpecialSubKind SSK;
1193
1194 SpecialSubstitution(SpecialSubKind SSK_)
1195 : Node(KSpecialSubstitution), SSK(SSK_) {}
1196
1197 StringView getBaseName() const override {
1198 switch (SSK) {
1199 case SpecialSubKind::allocator:
1200 return StringView("allocator");
1201 case SpecialSubKind::basic_string:
1202 return StringView("basic_string");
1203 case SpecialSubKind::string:
1204 return StringView("string");
1205 case SpecialSubKind::istream:
1206 return StringView("istream");
1207 case SpecialSubKind::ostream:
1208 return StringView("ostream");
1209 case SpecialSubKind::iostream:
1210 return StringView("iostream");
1211 }
1212 LLVM_BUILTIN_UNREACHABLE;
1213 }
1214
1215 void printLeft(OutputStream &S) const override {
1216 switch (SSK) {
1217 case SpecialSubKind::allocator:
1218 S += "std::allocator";
1219 break;
1220 case SpecialSubKind::basic_string:
1221 S += "std::basic_string";
1222 break;
1223 case SpecialSubKind::string:
1224 S += "std::string";
1225 break;
1226 case SpecialSubKind::istream:
1227 S += "std::istream";
1228 break;
1229 case SpecialSubKind::ostream:
1230 S += "std::ostream";
1231 break;
1232 case SpecialSubKind::iostream:
1233 S += "std::iostream";
1234 break;
1235 }
1236 }
1237};
1238
1239class CtorDtorName final : public Node {
1240 const Node *Basename;
1241 const bool IsDtor;
1242
1243public:
1244 CtorDtorName(Node *Basename_, bool IsDtor_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001245 : Node(KCtorDtorName), Basename(Basename_), IsDtor(IsDtor_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001246
1247 void printLeft(OutputStream &S) const override {
1248 if (IsDtor)
1249 S += "~";
1250 S += Basename->getBaseName();
1251 }
1252};
1253
1254class DtorName : public Node {
1255 const Node *Base;
1256
1257public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001258 DtorName(Node *Base_) : Node(KDtorName), Base(Base_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001259
1260 void printLeft(OutputStream &S) const override {
1261 S += "~";
1262 Base->printLeft(S);
1263 }
1264};
1265
1266class UnnamedTypeName : public Node {
1267 const StringView Count;
1268
1269public:
1270 UnnamedTypeName(StringView Count_) : Node(KUnnamedTypeName), Count(Count_) {}
1271
1272 void printLeft(OutputStream &S) const override {
1273 S += "'unnamed";
1274 S += Count;
1275 S += "\'";
1276 }
1277};
1278
1279class ClosureTypeName : public Node {
1280 NodeArray Params;
1281 StringView Count;
1282
1283public:
1284 ClosureTypeName(NodeArray Params_, StringView Count_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001285 : Node(KClosureTypeName), Params(Params_), Count(Count_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001286
1287 void printLeft(OutputStream &S) const override {
1288 S += "\'lambda";
1289 S += Count;
1290 S += "\'(";
1291 Params.printWithComma(S);
1292 S += ")";
1293 }
1294};
1295
1296class StructuredBindingName : public Node {
1297 NodeArray Bindings;
1298public:
1299 StructuredBindingName(NodeArray Bindings_)
1300 : Node(KStructuredBindingName), Bindings(Bindings_) {}
1301
1302 void printLeft(OutputStream &S) const override {
1303 S += '[';
1304 Bindings.printWithComma(S);
1305 S += ']';
1306 }
1307};
1308
1309// -- Expression Nodes --
1310
1311struct Expr : public Node {
1312 Expr(Kind K = KExpr) : Node(K) {}
1313};
1314
1315class BinaryExpr : public Expr {
1316 const Node *LHS;
1317 const StringView InfixOperator;
1318 const Node *RHS;
1319
1320public:
1321 BinaryExpr(Node *LHS_, StringView InfixOperator_, Node *RHS_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001322 : LHS(LHS_), InfixOperator(InfixOperator_), RHS(RHS_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001323
1324 void printLeft(OutputStream &S) const override {
1325 // might be a template argument expression, then we need to disambiguate
1326 // with parens.
1327 if (InfixOperator == ">")
1328 S += "(";
1329
1330 S += "(";
1331 LHS->print(S);
1332 S += ") ";
1333 S += InfixOperator;
1334 S += " (";
1335 RHS->print(S);
1336 S += ")";
1337
1338 if (InfixOperator == ">")
1339 S += ")";
1340 }
1341};
1342
1343class ArraySubscriptExpr : public Expr {
1344 const Node *Op1;
1345 const Node *Op2;
1346
1347public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001348 ArraySubscriptExpr(Node *Op1_, Node *Op2_) : Op1(Op1_), Op2(Op2_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001349
1350 void printLeft(OutputStream &S) const override {
1351 S += "(";
1352 Op1->print(S);
1353 S += ")[";
1354 Op2->print(S);
1355 S += "]";
1356 }
1357};
1358
1359class PostfixExpr : public Expr {
1360 const Node *Child;
1361 const StringView Operand;
1362
1363public:
1364 PostfixExpr(Node *Child_, StringView Operand_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001365 : Child(Child_), Operand(Operand_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001366
1367 void printLeft(OutputStream &S) const override {
1368 S += "(";
1369 Child->print(S);
1370 S += ")";
1371 S += Operand;
1372 }
1373};
1374
1375class ConditionalExpr : public Expr {
1376 const Node *Cond;
1377 const Node *Then;
1378 const Node *Else;
1379
1380public:
1381 ConditionalExpr(Node *Cond_, Node *Then_, Node *Else_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001382 : Cond(Cond_), Then(Then_), Else(Else_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001383
1384 void printLeft(OutputStream &S) const override {
1385 S += "(";
1386 Cond->print(S);
1387 S += ") ? (";
1388 Then->print(S);
1389 S += ") : (";
1390 Else->print(S);
1391 S += ")";
1392 }
1393};
1394
1395class MemberExpr : public Expr {
1396 const Node *LHS;
1397 const StringView Kind;
1398 const Node *RHS;
1399
1400public:
1401 MemberExpr(Node *LHS_, StringView Kind_, Node *RHS_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001402 : LHS(LHS_), Kind(Kind_), RHS(RHS_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001403
1404 void printLeft(OutputStream &S) const override {
1405 LHS->print(S);
1406 S += Kind;
1407 RHS->print(S);
1408 }
1409};
1410
1411class EnclosingExpr : public Expr {
1412 const StringView Prefix;
1413 const Node *Infix;
1414 const StringView Postfix;
1415
1416public:
1417 EnclosingExpr(StringView Prefix_, Node *Infix_, StringView Postfix_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001418 : Prefix(Prefix_), Infix(Infix_), Postfix(Postfix_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001419
1420 void printLeft(OutputStream &S) const override {
1421 S += Prefix;
1422 Infix->print(S);
1423 S += Postfix;
1424 }
1425};
1426
1427class CastExpr : public Expr {
1428 // cast_kind<to>(from)
1429 const StringView CastKind;
1430 const Node *To;
1431 const Node *From;
1432
1433public:
1434 CastExpr(StringView CastKind_, Node *To_, Node *From_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001435 : CastKind(CastKind_), To(To_), From(From_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001436
1437 void printLeft(OutputStream &S) const override {
1438 S += CastKind;
1439 S += "<";
1440 To->printLeft(S);
1441 S += ">(";
1442 From->printLeft(S);
1443 S += ")";
1444 }
1445};
1446
1447class SizeofParamPackExpr : public Expr {
1448 Node *Pack;
1449
1450public:
1451 SizeofParamPackExpr(Node *Pack_) : Pack(Pack_) {}
1452
1453 void printLeft(OutputStream &S) const override {
1454 S += "sizeof...(";
1455 ParameterPackExpansion PPE(Pack);
1456 PPE.printLeft(S);
1457 S += ")";
1458 }
1459};
1460
1461class CallExpr : public Expr {
1462 const Node *Callee;
1463 NodeArray Args;
1464
1465public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001466 CallExpr(Node *Callee_, NodeArray Args_) : Callee(Callee_), Args(Args_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001467
1468 void printLeft(OutputStream &S) const override {
1469 Callee->print(S);
1470 S += "(";
1471 Args.printWithComma(S);
1472 S += ")";
1473 }
1474};
1475
1476class NewExpr : public Expr {
1477 // new (expr_list) type(init_list)
1478 NodeArray ExprList;
1479 Node *Type;
1480 NodeArray InitList;
1481 bool IsGlobal; // ::operator new ?
1482 bool IsArray; // new[] ?
1483public:
1484 NewExpr(NodeArray ExprList_, Node *Type_, NodeArray InitList_, bool IsGlobal_,
1485 bool IsArray_)
1486 : ExprList(ExprList_), Type(Type_), InitList(InitList_),
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001487 IsGlobal(IsGlobal_), IsArray(IsArray_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001488
1489 void printLeft(OutputStream &S) const override {
1490 if (IsGlobal)
1491 S += "::operator ";
1492 S += "new";
1493 if (IsArray)
1494 S += "[]";
1495 S += ' ';
1496 if (!ExprList.empty()) {
1497 S += "(";
1498 ExprList.printWithComma(S);
1499 S += ")";
1500 }
1501 Type->print(S);
1502 if (!InitList.empty()) {
1503 S += "(";
1504 InitList.printWithComma(S);
1505 S += ")";
1506 }
1507
1508 }
1509};
1510
1511class DeleteExpr : public Expr {
1512 Node *Op;
1513 bool IsGlobal;
1514 bool IsArray;
1515
1516public:
1517 DeleteExpr(Node *Op_, bool IsGlobal_, bool IsArray_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001518 : Op(Op_), IsGlobal(IsGlobal_), IsArray(IsArray_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001519
1520 void printLeft(OutputStream &S) const override {
1521 if (IsGlobal)
1522 S += "::";
1523 S += "delete";
1524 if (IsArray)
1525 S += "[] ";
1526 Op->print(S);
1527 }
1528};
1529
1530class PrefixExpr : public Expr {
1531 StringView Prefix;
1532 Node *Child;
1533
1534public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001535 PrefixExpr(StringView Prefix_, Node *Child_) : Prefix(Prefix_), Child(Child_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001536
1537 void printLeft(OutputStream &S) const override {
1538 S += Prefix;
1539 S += "(";
1540 Child->print(S);
1541 S += ")";
1542 }
1543};
1544
1545class FunctionParam : public Expr {
1546 StringView Number;
1547
1548public:
1549 FunctionParam(StringView Number_) : Number(Number_) {}
1550
1551 void printLeft(OutputStream &S) const override {
1552 S += "fp";
1553 S += Number;
1554 }
1555};
1556
1557class ConversionExpr : public Expr {
1558 const Node *Type;
1559 NodeArray Expressions;
1560
1561public:
1562 ConversionExpr(const Node *Type_, NodeArray Expressions_)
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001563 : Type(Type_), Expressions(Expressions_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001564
1565 void printLeft(OutputStream &S) const override {
1566 S += "(";
1567 Type->print(S);
1568 S += ")(";
1569 Expressions.printWithComma(S);
1570 S += ")";
1571 }
1572};
1573
1574class InitListExpr : public Expr {
1575 Node *Ty;
1576 NodeArray Inits;
1577public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001578 InitListExpr(Node *Ty_, NodeArray Inits_) : Ty(Ty_), Inits(Inits_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001579
1580 void printLeft(OutputStream &S) const override {
1581 if (Ty)
1582 Ty->print(S);
1583 S += '{';
1584 Inits.printWithComma(S);
1585 S += '}';
1586 }
1587};
1588
1589class BracedExpr : public Expr {
1590 Node *Elem;
1591 Node *Init;
1592 bool IsArray;
1593public:
1594 BracedExpr(Node *Elem_, Node *Init_, bool IsArray_)
1595 : Expr(KBracedExpr), Elem(Elem_), Init(Init_), IsArray(IsArray_) {}
1596
1597 void printLeft(OutputStream &S) const override {
1598 if (IsArray) {
1599 S += '[';
1600 Elem->print(S);
1601 S += ']';
1602 } else {
1603 S += '.';
1604 Elem->print(S);
1605 }
1606 if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr)
1607 S += " = ";
1608 Init->print(S);
1609 }
1610};
1611
1612class BracedRangeExpr : public Expr {
1613 Node *First;
1614 Node *Last;
1615 Node *Init;
1616public:
1617 BracedRangeExpr(Node *First_, Node *Last_, Node *Init_)
1618 : Expr(KBracedRangeExpr), First(First_), Last(Last_), Init(Init_) {}
1619
1620 void printLeft(OutputStream &S) const override {
1621 S += '[';
1622 First->print(S);
1623 S += " ... ";
1624 Last->print(S);
1625 S += ']';
1626 if (Init->getKind() != KBracedExpr && Init->getKind() != KBracedRangeExpr)
1627 S += " = ";
1628 Init->print(S);
1629 }
1630};
1631
1632class ThrowExpr : public Expr {
1633 const Node *Op;
1634
1635public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001636 ThrowExpr(Node *Op_) : Op(Op_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001637
1638 void printLeft(OutputStream &S) const override {
1639 S += "throw ";
1640 Op->print(S);
1641 }
1642};
1643
1644class BoolExpr : public Expr {
1645 bool Value;
1646
1647public:
1648 BoolExpr(bool Value_) : Value(Value_) {}
1649
1650 void printLeft(OutputStream &S) const override {
1651 S += Value ? StringView("true") : StringView("false");
1652 }
1653};
1654
1655class IntegerCastExpr : public Expr {
1656 // ty(integer)
1657 Node *Ty;
1658 StringView Integer;
1659
1660public:
Erik Pilkington8c7013d2018-03-25 22:49:57 +00001661 IntegerCastExpr(Node *Ty_, StringView Integer_)
1662 : Ty(Ty_), Integer(Integer_) {}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001663
1664 void printLeft(OutputStream &S) const override {
1665 S += "(";
1666 Ty->print(S);
1667 S += ")";
1668 S += Integer;
1669 }
1670};
1671
1672class IntegerExpr : public Expr {
1673 StringView Type;
1674 StringView Value;
1675
1676public:
1677 IntegerExpr(StringView Type_, StringView Value_) : Type(Type_), Value(Value_) {}
1678
1679 void printLeft(OutputStream &S) const override {
1680 if (Type.size() > 3) {
1681 S += "(";
1682 S += Type;
1683 S += ")";
1684 }
1685
1686 if (Value[0] == 'n') {
1687 S += "-";
1688 S += Value.dropFront(1);
1689 } else
1690 S += Value;
1691
1692 if (Type.size() <= 3)
1693 S += Type;
1694 }
1695};
1696
1697template <class Float> struct FloatData;
1698
1699template <class Float> class FloatExpr : public Expr {
1700 const StringView Contents;
1701
1702public:
1703 FloatExpr(StringView Contents_) : Contents(Contents_) {}
1704
1705 void printLeft(OutputStream &s) const override {
1706 const char *first = Contents.begin();
1707 const char *last = Contents.end() + 1;
1708
1709 const size_t N = FloatData<Float>::mangled_size;
1710 if (static_cast<std::size_t>(last - first) > N) {
1711 last = first + N;
1712 union {
1713 Float value;
1714 char buf[sizeof(Float)];
1715 };
1716 const char *t = first;
1717 char *e = buf;
1718 for (; t != last; ++t, ++e) {
1719 unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
1720 : static_cast<unsigned>(*t - 'a' + 10);
1721 ++t;
1722 unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0')
1723 : static_cast<unsigned>(*t - 'a' + 10);
1724 *e = static_cast<char>((d1 << 4) + d0);
1725 }
Rafael Espindolab940b662016-09-06 19:16:48 +00001726#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1727 std::reverse(buf, e);
1728#endif
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001729 char num[FloatData<Float>::max_demangled_size] = {0};
1730 int n = snprintf(num, sizeof(num), FloatData<Float>::spec, value);
1731 s += StringView(num, num + n);
Rafael Espindolab940b662016-09-06 19:16:48 +00001732 }
1733 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00001734};
1735
1736class BumpPointerAllocator {
1737 struct BlockMeta {
1738 BlockMeta* Next;
1739 size_t Current;
1740 };
1741
1742 static constexpr size_t AllocSize = 4096;
1743 static constexpr size_t UsableAllocSize = AllocSize - sizeof(BlockMeta);
1744
1745 alignas(16) char InitialBuffer[AllocSize];
1746 BlockMeta* BlockList = nullptr;
1747
1748 void grow() {
1749 char* NewMeta = new char[AllocSize];
1750 BlockList = new (NewMeta) BlockMeta{BlockList, 0};
1751 }
1752
1753 void* allocateMassive(size_t NBytes) {
1754 NBytes += sizeof(BlockMeta);
1755 BlockMeta* NewMeta = reinterpret_cast<BlockMeta*>(new char[NBytes]);
1756 BlockList->Next = new (NewMeta) BlockMeta{BlockList->Next, 0};
1757 return static_cast<void*>(NewMeta + 1);
1758 }
1759
1760public:
1761 BumpPointerAllocator()
1762 : BlockList(new (InitialBuffer) BlockMeta{nullptr, 0}) {}
1763
1764 void* allocate(size_t N) {
1765 N = (N + 15u) & ~15u;
1766 if (N + BlockList->Current >= UsableAllocSize) {
1767 if (N > UsableAllocSize)
1768 return allocateMassive(N);
1769 grow();
1770 }
1771 BlockList->Current += N;
1772 return static_cast<void*>(reinterpret_cast<char*>(BlockList + 1) +
1773 BlockList->Current - N);
1774 }
1775
1776 ~BumpPointerAllocator() {
1777 while (BlockList) {
1778 BlockMeta* Tmp = BlockList;
1779 BlockList = BlockList->Next;
1780 if (reinterpret_cast<char*>(Tmp) != InitialBuffer)
1781 delete[] reinterpret_cast<char*>(Tmp);
1782 }
1783 }
1784};
1785
1786template <class T, size_t N>
1787class PODSmallVector {
1788 static_assert(std::is_pod<T>::value,
1789 "T is required to be a plain old data type");
1790
1791 T* First;
1792 T* Last;
1793 T* Cap;
1794 T Inline[N];
1795
1796 bool isInline() const { return First == Inline; }
1797
1798 void clearInline() {
1799 First = Inline;
1800 Last = Inline;
1801 Cap = Inline + N;
1802 }
1803
1804 void reserve(size_t NewCap) {
1805 size_t S = size();
1806 if (isInline()) {
1807 auto* Tmp = static_cast<T*>(std::malloc(NewCap * sizeof(T)));
1808 std::copy(First, Last, Tmp);
1809 First = Tmp;
1810 } else
1811 First = static_cast<T*>(std::realloc(First, NewCap * sizeof(T)));
1812 Last = First + S;
1813 Cap = First + NewCap;
1814 }
1815
1816public:
1817 PODSmallVector() : First(Inline), Last(First), Cap(Inline + N) {}
1818
1819 PODSmallVector(const PODSmallVector&) = delete;
1820 PODSmallVector& operator=(const PODSmallVector&) = delete;
1821
1822 PODSmallVector(PODSmallVector&& Other) : PODSmallVector() {
1823 if (Other.isInline()) {
1824 std::copy(Other.begin(), Other.end(), First);
1825 Last = First + Other.size();
1826 Other.clear();
1827 return;
1828 }
1829
1830 First = Other.First;
1831 Last = Other.Last;
1832 Cap = Other.Cap;
1833 Other.clearInline();
1834 }
1835
1836 PODSmallVector& operator=(PODSmallVector&& Other) {
1837 if (Other.isInline()) {
1838 if (!isInline()) {
1839 std::free(First);
1840 clearInline();
1841 }
1842 std::copy(Other.begin(), Other.end(), First);
1843 Last = First + Other.size();
1844 Other.clear();
1845 return *this;
1846 }
1847
1848 if (isInline()) {
1849 First = Other.First;
1850 Last = Other.Last;
1851 Cap = Other.Cap;
1852 Other.clearInline();
1853 return *this;
1854 }
1855
1856 std::swap(First, Other.First);
1857 std::swap(Last, Other.Last);
1858 std::swap(Cap, Other.Cap);
1859 Other.clear();
1860 return *this;
1861 }
1862
1863 void push_back(const T& Elem) {
1864 if (Last == Cap)
1865 reserve(size() * 2);
1866 *Last++ = Elem;
1867 }
1868
1869 void pop_back() {
1870 assert(Last != First && "Popping empty vector!");
1871 --Last;
1872 }
1873
1874 void dropBack(size_t Index) {
1875 assert(Index <= size() && "dropBack() can't expand!");
1876 Last = First + Index;
1877 }
1878
1879 T* begin() { return First; }
1880 T* end() { return Last; }
1881
1882 bool empty() const { return First == Last; }
1883 size_t size() const { return static_cast<size_t>(Last - First); }
1884 T& back() {
1885 assert(Last != First && "Calling back() on empty vector!");
1886 return *(Last - 1);
1887 }
1888 T& operator[](size_t Index) {
1889 assert(Index < size() && "Invalid access!");
1890 return *(begin() + Index);
1891 }
1892 void clear() { Last = First; }
1893
1894 ~PODSmallVector() {
1895 if (!isInline())
1896 std::free(First);
1897 }
1898};
1899
1900struct Db {
1901 const char *First;
1902 const char *Last;
1903
1904 // Name stack, this is used by the parser to hold temporary names that were
1905 // parsed. The parser colapses multiple names into new nodes to construct
1906 // the AST. Once the parser is finished, names.size() == 1.
1907 PODSmallVector<Node *, 32> Names;
1908
1909 // Substitution table. Itanium supports name substitutions as a means of
1910 // compression. The string "S42_" refers to the 44nd entry (base-36) in this
1911 // table.
1912 PODSmallVector<Node *, 32> Subs;
1913
1914 // Template parameter table. Like the above, but referenced like "T42_".
1915 // This has a smaller size compared to Subs and Names because it can be
1916 // stored on the stack.
1917 PODSmallVector<Node *, 8> TemplateParams;
1918
1919 unsigned EncodingDepth = 0;
1920 bool TagTemplates = true;
1921 bool FixForwardReferences = false;
1922 bool TryToParseTemplateArgs = true;
1923 bool ParsingLambdaParams = false;
1924
1925 BumpPointerAllocator ASTAllocator;
1926
1927 Db(const char *First_, const char *Last_) : First(First_), Last(Last_) {}
1928
1929 template <class T, class... Args> T *make(Args &&... args) {
1930 return new (ASTAllocator.allocate(sizeof(T)))
1931 T(std::forward<Args>(args)...);
1932 }
1933
1934 template <class It> NodeArray makeNodeArray(It begin, It end) {
1935 size_t sz = static_cast<size_t>(end - begin);
1936 void *mem = ASTAllocator.allocate(sizeof(Node *) * sz);
1937 Node **data = new (mem) Node *[sz];
1938 std::copy(begin, end, data);
1939 return NodeArray(data, sz);
1940 }
1941
1942 NodeArray popTrailingNodeArray(size_t FromPosition) {
1943 assert(FromPosition <= Names.size());
1944 NodeArray res =
1945 makeNodeArray(Names.begin() + (long)FromPosition, Names.end());
1946 Names.dropBack(FromPosition);
1947 return res;
1948 }
1949
1950 bool consumeIf(StringView S) {
1951 if (StringView(First, Last).startsWith(S)) {
1952 First += S.size();
1953 return true;
1954 }
1955 return false;
1956 }
1957
1958 bool consumeIf(char C) {
1959 if (First != Last && *First == C) {
1960 ++First;
1961 return true;
1962 }
1963 return false;
1964 }
1965
1966 char consume() { return First != Last ? *First++ : '\0'; }
1967
1968 char look(unsigned Lookahead = 0) {
1969 if (static_cast<size_t>(Last - First) <= Lookahead)
1970 return '\0';
1971 return First[Lookahead];
1972 }
1973
1974 size_t numLeft() const { return static_cast<size_t>(Last - First); }
1975
1976 StringView parseNumber(bool AllowNegative = false);
1977 Qualifiers parseCVQualifiers();
1978 bool parsePositiveInteger(size_t *Out);
1979 StringView parseBareSourceName();
1980
1981 bool parseSeqId(size_t *Out);
1982 Node *parseSubstitution();
1983 Node *parseTemplateParam();
1984 Node *parseTemplateArgs();
1985 Node *parseTemplateArg();
1986
1987 /// Parse the <expr> production.
1988 Node *parseExpr();
1989 Node *parsePrefixExpr(StringView Kind);
1990 Node *parseBinaryExpr(StringView Kind);
1991 Node *parseIntegerLiteral(StringView Lit);
1992 Node *parseExprPrimary();
1993 template <class Float> Node *parseFloatingLiteral();
1994 Node *parseFunctionParam();
1995 Node *parseNewExpr();
1996 Node *parseConversionExpr();
1997 Node *parseBracedExpr();
1998
1999 /// Parse the <type> production.
2000 Node *parseType();
2001 Node *parseFunctionType();
2002 Node *parseVectorType();
2003 Node *parseDecltype();
2004 Node *parseArrayType();
2005 Node *parsePointerToMemberType();
2006 Node *parseClassEnumType();
2007 Node *parseQualifiedType();
2008
2009 Node *parseEncoding();
2010 bool parseCallOffset();
2011 Node *parseSpecialName();
2012
2013 /// Holds some extra information about a <name> that is being parsed. This
2014 /// information is only pertinent if the <name> refers to an <encoding>.
2015 struct NameState {
2016 bool CtorDtorConversion = false;
2017 bool EndsWithTemplateArgs = false;
2018 Qualifiers CVQualifiers = QualNone;
2019 FunctionRefQual ReferenceQualifier = FrefQualNone;
2020 };
2021
2022 /// Parse the <name> production>
2023 Node *parseName(NameState *State = nullptr);
2024 Node *parseLocalName(NameState *State);
2025 Node *parseOperatorName(NameState *State);
2026 Node *parseUnqualifiedName(NameState *State);
2027 Node *parseUnnamedTypeName(NameState *State);
2028 Node *parseSourceName(NameState *State);
2029 Node *parseUnscopedName(NameState *State);
2030 Node *parseNestedName(NameState *State);
2031 Node *parseCtorDtorName(Node *&SoFar, NameState *State);
2032
2033 Node *parseAbiTags(Node *N);
2034
2035 /// Parse the <unresolved-name> production.
2036 Node *parseUnresolvedName();
2037 Node *parseSimpleId();
2038 Node *parseBaseUnresolvedName();
2039 Node *parseUnresolvedType();
2040 Node *parseDestructorName();
2041
2042 /// Top-level entry point into the parser.
2043 Node *parse();
2044};
2045
2046const char* parse_discriminator(const char* first, const char* last);
2047
2048// <name> ::= <nested-name> // N
2049// ::= <local-name> # See Scope Encoding below // Z
2050// ::= <unscoped-template-name> <template-args>
2051// ::= <unscoped-name>
2052//
2053// <unscoped-template-name> ::= <unscoped-name>
2054// ::= <substitution>
2055Node *Db::parseName(NameState *State) {
2056 consumeIf('L'); // extension
2057
2058 if (look() == 'N')
2059 return parseNestedName(State);
2060 if (look() == 'Z')
2061 return parseLocalName(State);
2062
2063 // ::= <unscoped-template-name> <template-args>
2064 if (look() == 'S' && look(1) != 't') {
2065 Node *S = parseSubstitution();
2066 if (S == nullptr)
2067 return nullptr;
2068 if (look() != 'I')
2069 return nullptr;
2070 Node *TA = parseTemplateArgs();
2071 if (TA == nullptr)
2072 return nullptr;
2073 if (State) State->EndsWithTemplateArgs = true;
2074 return make<NameWithTemplateArgs>(S, TA);
2075 }
2076
2077 Node *N = parseUnscopedName(State);
2078 if (N == nullptr)
2079 return nullptr;
2080 // ::= <unscoped-template-name> <template-args>
2081 if (look() == 'I') {
2082 Subs.push_back(N);
2083 Node *TA = parseTemplateArgs();
2084 if (TA == nullptr)
2085 return nullptr;
2086 if (State) State->EndsWithTemplateArgs = true;
2087 return make<NameWithTemplateArgs>(N, TA);
2088 }
2089 // ::= <unscoped-name>
2090 return N;
2091}
2092
2093// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
2094// := Z <function encoding> E s [<discriminator>]
2095// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
2096Node *Db::parseLocalName(NameState *State) {
2097 if (!consumeIf('Z'))
2098 return nullptr;
2099 Node *Encoding = parseEncoding();
2100 if (Encoding == nullptr || !consumeIf('E'))
2101 return nullptr;
2102
2103 if (consumeIf('s')) {
2104 First = parse_discriminator(First, Last);
2105 return make<QualifiedName>(Encoding, make<NameType>("string literal"));
2106 }
2107
2108 if (consumeIf('d')) {
2109 parseNumber(true);
2110 if (!consumeIf('_'))
2111 return nullptr;
2112 Node *N = parseName(State);
2113 if (N == nullptr)
2114 return nullptr;
2115 return make<QualifiedName>(Encoding, N);
2116 }
2117
2118 Node *Entity = parseName(State);
2119 if (Entity == nullptr)
2120 return nullptr;
2121 First = parse_discriminator(First, Last);
2122 return make<QualifiedName>(Encoding, Entity);
2123}
2124
2125// <unscoped-name> ::= <unqualified-name>
2126// ::= St <unqualified-name> # ::std::
2127// extension ::= StL<unqualified-name>
2128Node *Db::parseUnscopedName(NameState *State) {
2129 if (consumeIf("StL") || consumeIf("St")) {
2130 Node *R = parseUnqualifiedName(State);
2131 if (R == nullptr)
2132 return nullptr;
2133 return make<StdQualifiedName>(R);
2134 }
2135 return parseUnqualifiedName(State);
2136}
2137
2138// <unqualified-name> ::= <operator-name> [abi-tags]
2139// ::= <ctor-dtor-name>
2140// ::= <source-name>
2141// ::= <unnamed-type-name>
2142// ::= DC <source-name>+ E # structured binding declaration
2143Node *Db::parseUnqualifiedName(NameState *State) {
2144 // <ctor-dtor-name>s are special-cased in parseNestedName().
2145 Node *Result;
2146 if (look() == 'U')
2147 Result = parseUnnamedTypeName(State);
2148 else if (look() >= '1' && look() <= '9')
2149 Result = parseSourceName(State);
2150 else if (consumeIf("DC")) {
2151 size_t BindingsBegin = Names.size();
2152 do {
2153 Node *Binding = parseSourceName(State);
2154 if (Binding == nullptr)
2155 return nullptr;
2156 Names.push_back(Binding);
2157 } while (!consumeIf('E'));
2158 Result = make<StructuredBindingName>(popTrailingNodeArray(BindingsBegin));
2159 } else
2160 Result = parseOperatorName(State);
2161 if (Result != nullptr)
2162 Result = parseAbiTags(Result);
2163 return Result;
2164}
2165
2166// <unnamed-type-name> ::= Ut [<nonnegative number>] _
2167// ::= <closure-type-name>
2168//
2169// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2170//
2171// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2172Node *Db::parseUnnamedTypeName(NameState *) {
2173 if (consumeIf("Ut")) {
2174 StringView Count = parseNumber();
2175 if (!consumeIf('_'))
2176 return nullptr;
2177 return make<UnnamedTypeName>(Count);
2178 }
2179 if (consumeIf("Ul")) {
2180 NodeArray Params;
2181 SwapAndRestore<bool> SwapParams(ParsingLambdaParams, true);
2182 if (!consumeIf("vE")) {
2183 size_t ParamsBegin = Names.size();
2184 do {
2185 Node *P = parseType();
2186 if (P == nullptr)
2187 return nullptr;
2188 Names.push_back(P);
2189 } while (!consumeIf('E'));
2190 Params = popTrailingNodeArray(ParamsBegin);
2191 }
2192 StringView Count = parseNumber();
2193 if (!consumeIf('_'))
2194 return nullptr;
2195 return make<ClosureTypeName>(Params, Count);
2196 }
2197 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00002198}
2199
2200// <source-name> ::= <positive length number> <identifier>
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002201Node *Db::parseSourceName(NameState *) {
2202 size_t Length = 0;
2203 if (parsePositiveInteger(&Length))
2204 return nullptr;
2205 if (numLeft() < Length || Length == 0)
2206 return nullptr;
2207 StringView Name(First, First + Length);
2208 First += Length;
2209 if (Name.startsWith("_GLOBAL__N"))
2210 return make<NameType>("(anonymous namespace)");
2211 return make<NameType>(Name);
Rafael Espindolab940b662016-09-06 19:16:48 +00002212}
2213
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002214// <operator-name> ::= aa # &&
Rafael Espindolab940b662016-09-06 19:16:48 +00002215// ::= ad # & (unary)
2216// ::= an # &
2217// ::= aN # &=
2218// ::= aS # =
2219// ::= cl # ()
2220// ::= cm # ,
2221// ::= co # ~
2222// ::= cv <type> # (cast)
2223// ::= da # delete[]
2224// ::= de # * (unary)
2225// ::= dl # delete
2226// ::= dv # /
2227// ::= dV # /=
2228// ::= eo # ^
2229// ::= eO # ^=
2230// ::= eq # ==
2231// ::= ge # >=
2232// ::= gt # >
2233// ::= ix # []
2234// ::= le # <=
2235// ::= li <source-name> # operator ""
2236// ::= ls # <<
2237// ::= lS # <<=
2238// ::= lt # <
2239// ::= mi # -
2240// ::= mI # -=
2241// ::= ml # *
2242// ::= mL # *=
2243// ::= mm # -- (postfix in <expression> context)
2244// ::= na # new[]
2245// ::= ne # !=
2246// ::= ng # - (unary)
2247// ::= nt # !
2248// ::= nw # new
2249// ::= oo # ||
2250// ::= or # |
2251// ::= oR # |=
2252// ::= pm # ->*
2253// ::= pl # +
2254// ::= pL # +=
2255// ::= pp # ++ (postfix in <expression> context)
2256// ::= ps # + (unary)
2257// ::= pt # ->
2258// ::= qu # ?
2259// ::= rm # %
2260// ::= rM # %=
2261// ::= rs # >>
2262// ::= rS # >>=
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002263// ::= ss # <=> C++2a
2264// ::= v <digit> <source-name> # vendor extended operator
2265Node *Db::parseOperatorName(NameState *State) {
2266 switch (look()) {
2267 case 'a':
2268 switch (look(1)) {
Rafael Espindolab940b662016-09-06 19:16:48 +00002269 case 'a':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002270 First += 2;
2271 return make<NameType>("operator&&");
Rafael Espindolab940b662016-09-06 19:16:48 +00002272 case 'd':
Rafael Espindolab940b662016-09-06 19:16:48 +00002273 case 'n':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002274 First += 2;
2275 return make<NameType>("operator&");
2276 case 'N':
2277 First += 2;
2278 return make<NameType>("operator&=");
2279 case 'S':
2280 First += 2;
2281 return make<NameType>("operator=");
2282 }
2283 return nullptr;
2284 case 'c':
2285 switch (look(1)) {
2286 case 'l':
2287 First += 2;
2288 return make<NameType>("operator()");
2289 case 'm':
2290 First += 2;
2291 return make<NameType>("operator,");
Rafael Espindolab940b662016-09-06 19:16:48 +00002292 case 'o':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002293 First += 2;
2294 return make<NameType>("operator~");
2295 // ::= cv <type> # (cast)
2296 case 'v': {
2297 SwapAndRestore<bool> SaveTemplate(TryToParseTemplateArgs, false);
2298 First += 2;
2299 Node *Ty = parseType();
2300 if (Ty == nullptr)
2301 return nullptr;
2302 if (State) State->CtorDtorConversion = true;
2303 return make<ConversionOperatorType>(Ty);
2304 }
2305 }
2306 return nullptr;
2307 case 'd':
2308 switch (look(1)) {
2309 case 'a':
2310 First += 2;
2311 return make<NameType>("operator delete[]");
2312 case 'e':
2313 First += 2;
2314 return make<NameType>("operator*");
2315 case 'l':
2316 First += 2;
2317 return make<NameType>("operator delete");
Rafael Espindolab940b662016-09-06 19:16:48 +00002318 case 'v':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002319 First += 2;
2320 return make<NameType>("operator/");
2321 case 'V':
2322 First += 2;
2323 return make<NameType>("operator/=");
Rafael Espindolab940b662016-09-06 19:16:48 +00002324 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002325 return nullptr;
2326 case 'e':
2327 switch (look(1)) {
Rafael Espindolab940b662016-09-06 19:16:48 +00002328 case 'o':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002329 First += 2;
2330 return make<NameType>("operator^");
2331 case 'O':
2332 First += 2;
2333 return make<NameType>("operator^=");
Rafael Espindolab940b662016-09-06 19:16:48 +00002334 case 'q':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002335 First += 2;
2336 return make<NameType>("operator==");
2337 }
2338 return nullptr;
2339 case 'g':
2340 switch (look(1)) {
2341 case 'e':
2342 First += 2;
2343 return make<NameType>("operator>=");
Rafael Espindolab940b662016-09-06 19:16:48 +00002344 case 't':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002345 First += 2;
2346 return make<NameType>("operator>");
Rafael Espindolab940b662016-09-06 19:16:48 +00002347 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002348 return nullptr;
2349 case 'i':
2350 if (look(1) == 'x') {
2351 First += 2;
2352 return make<NameType>("operator[]");
2353 }
2354 return nullptr;
2355 case 'l':
2356 switch (look(1)) {
2357 case 'e':
2358 First += 2;
2359 return make<NameType>("operator<=");
2360 // ::= li <source-name> # operator ""
2361 case 'i': {
2362 First += 2;
2363 Node *SN = parseSourceName(State);
2364 if (SN == nullptr)
2365 return nullptr;
2366 return make<LiteralOperator>(SN);
2367 }
2368 case 's':
2369 First += 2;
2370 return make<NameType>("operator<<");
2371 case 'S':
2372 First += 2;
2373 return make<NameType>("operator<<=");
2374 case 't':
2375 First += 2;
2376 return make<NameType>("operator<");
2377 }
2378 return nullptr;
2379 case 'm':
2380 switch (look(1)) {
2381 case 'i':
2382 First += 2;
2383 return make<NameType>("operator-");
2384 case 'I':
2385 First += 2;
2386 return make<NameType>("operator-=");
2387 case 'l':
2388 First += 2;
2389 return make<NameType>("operator*");
Rafael Espindolab940b662016-09-06 19:16:48 +00002390 case 'L':
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002391 First += 2;
2392 return make<NameType>("operator*=");
2393 case 'm':
2394 First += 2;
2395 return make<NameType>("operator--");
2396 }
2397 return nullptr;
2398 case 'n':
2399 switch (look(1)) {
2400 case 'a':
2401 First += 2;
2402 return make<NameType>("operator new[]");
2403 case 'e':
2404 First += 2;
2405 return make<NameType>("operator!=");
2406 case 'g':
2407 First += 2;
2408 return make<NameType>("operator-");
2409 case 't':
2410 First += 2;
2411 return make<NameType>("operator!");
2412 case 'w':
2413 First += 2;
2414 return make<NameType>("operator new");
2415 }
2416 return nullptr;
2417 case 'o':
2418 switch (look(1)) {
2419 case 'o':
2420 First += 2;
2421 return make<NameType>("operator||");
2422 case 'r':
2423 First += 2;
2424 return make<NameType>("operator|");
2425 case 'R':
2426 First += 2;
2427 return make<NameType>("operator|=");
2428 }
2429 return nullptr;
2430 case 'p':
2431 switch (look(1)) {
2432 case 'm':
2433 First += 2;
2434 return make<NameType>("operator->*");
2435 case 'l':
2436 First += 2;
2437 return make<NameType>("operator+");
2438 case 'L':
2439 First += 2;
2440 return make<NameType>("operator+=");
2441 case 'p':
2442 First += 2;
2443 return make<NameType>("operator++");
2444 case 's':
2445 First += 2;
2446 return make<NameType>("operator+");
2447 case 't':
2448 First += 2;
2449 return make<NameType>("operator->");
2450 }
2451 return nullptr;
2452 case 'q':
2453 if (look(1) == 'u') {
2454 First += 2;
2455 return make<NameType>("operator?");
2456 }
2457 return nullptr;
2458 case 'r':
2459 switch (look(1)) {
2460 case 'm':
2461 First += 2;
2462 return make<NameType>("operator%");
2463 case 'M':
2464 First += 2;
2465 return make<NameType>("operator%=");
2466 case 's':
2467 First += 2;
2468 return make<NameType>("operator>>");
2469 case 'S':
2470 First += 2;
2471 return make<NameType>("operator>>=");
2472 }
2473 return nullptr;
2474 case 's':
2475 if (look(1) == 's') {
2476 First += 2;
2477 return make<NameType>("operator<=>");
2478 }
2479 return nullptr;
2480 // ::= v <digit> <source-name> # vendor extended operator
2481 case 'v':
2482 if (std::isdigit(look(1))) {
2483 First += 2;
2484 Node *SN = parseSourceName(State);
2485 if (SN == nullptr)
2486 return nullptr;
2487 return make<ConversionOperatorType>(SN);
2488 }
2489 return nullptr;
2490 }
2491 return nullptr;
2492}
2493
2494// <ctor-dtor-name> ::= C1 # complete object constructor
2495// ::= C2 # base object constructor
2496// ::= C3 # complete object allocating constructor
2497// extension ::= C5 # ?
2498// ::= D0 # deleting destructor
2499// ::= D1 # complete object destructor
2500// ::= D2 # base object destructor
2501// extension ::= D5 # ?
2502Node *Db::parseCtorDtorName(Node *&SoFar, NameState *State) {
2503 if (SoFar->K == Node::KSpecialSubstitution) {
2504 auto SSK = static_cast<SpecialSubstitution *>(SoFar)->SSK;
2505 switch (SSK) {
2506 case SpecialSubKind::string:
2507 case SpecialSubKind::istream:
2508 case SpecialSubKind::ostream:
2509 case SpecialSubKind::iostream:
2510 SoFar = make<ExpandedSpecialSubstitution>(SSK);
Rafael Espindolab940b662016-09-06 19:16:48 +00002511 default:
Rafael Espindolab940b662016-09-06 19:16:48 +00002512 break;
2513 }
2514 }
Rafael Espindolab940b662016-09-06 19:16:48 +00002515
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002516 if (consumeIf('C')) {
2517 bool IsInherited = consumeIf('I');
2518 if (look() != '1' && look() != '2' && look() != '3' && look() != '5')
2519 return nullptr;
2520 ++First;
2521 if (State) State->CtorDtorConversion = true;
2522 if (IsInherited) {
2523 if (parseName() == nullptr)
2524 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00002525 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002526 return make<CtorDtorName>(SoFar, false);
Rafael Espindolab940b662016-09-06 19:16:48 +00002527 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002528
2529 if (look() == 'D' &&
2530 (look(1) == '0' || look(1) == '1' || look(1) == '2' || look(1) == '5')) {
2531 First += 2;
2532 if (State) State->CtorDtorConversion = true;
2533 return make<CtorDtorName>(SoFar, true);
2534 }
2535
2536 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00002537}
2538
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002539// <nested-name> ::= N [<CV-Qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
2540// ::= N [<CV-Qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
Rafael Espindolab940b662016-09-06 19:16:48 +00002541//
2542// <prefix> ::= <prefix> <unqualified-name>
2543// ::= <template-prefix> <template-args>
2544// ::= <template-param>
2545// ::= <decltype>
2546// ::= # empty
2547// ::= <substitution>
2548// ::= <prefix> <data-member-prefix>
2549// extension ::= L
2550//
2551// <template-prefix> ::= <prefix> <template unqualified-name>
2552// ::= <template-param>
2553// ::= <substitution>
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002554Node *Db::parseNestedName(NameState *State) {
2555 if (!consumeIf('N'))
2556 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00002557
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002558 Qualifiers CVTmp = parseCVQualifiers();
2559 if (State) State->CVQualifiers = CVTmp;
2560
2561 if (consumeIf('O')) {
2562 if (State) State->ReferenceQualifier = FrefQualRValue;
2563 } else if (consumeIf('R')) {
2564 if (State) State->ReferenceQualifier = FrefQualLValue;
2565 } else
2566 if (State) State->ReferenceQualifier = FrefQualNone;
2567
2568 Node *SoFar = nullptr;
2569 auto PushComponent = [&](Node *Comp) {
2570 if (SoFar) SoFar = make<QualifiedName>(SoFar, Comp);
2571 else SoFar = Comp;
2572 if (State) State->EndsWithTemplateArgs = false;
2573 };
2574
2575 if (consumeIf("St"))
2576 SoFar = make<NameType>("std");
2577
2578 while (!consumeIf('E')) {
2579 consumeIf('L'); // extension
2580
2581 // ::= <template-param>
2582 if (look() == 'T') {
2583 Node *TP = parseTemplateParam();
2584 if (TP == nullptr)
2585 return nullptr;
2586 PushComponent(TP);
2587 Subs.push_back(SoFar);
2588 continue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002589 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002590
2591 // ::= <template-prefix> <template-args>
2592 if (look() == 'I') {
2593 Node *TA = parseTemplateArgs();
2594 if (TA == nullptr || SoFar == nullptr)
2595 return nullptr;
2596 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
2597 if (State) State->EndsWithTemplateArgs = true;
2598 Subs.push_back(SoFar);
2599 continue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002600 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002601
2602 // ::= <decltype>
2603 if (look() == 'D' && (look(1) == 't' || look(1) == 'T')) {
2604 Node *DT = parseDecltype();
2605 if (DT == nullptr)
2606 return nullptr;
2607 PushComponent(DT);
2608 Subs.push_back(SoFar);
2609 continue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002610 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002611
2612 // ::= <substitution>
2613 if (look() == 'S' && look(1) != 't') {
2614 Node *S = parseSubstitution();
2615 if (S == nullptr)
2616 return nullptr;
2617 PushComponent(S);
2618 if (SoFar != S)
2619 Subs.push_back(S);
2620 continue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002621 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002622
2623 // Parse an <unqualified-name> thats actually a <ctor-dtor-name>.
2624 if (look() == 'C' || (look() == 'D' && look(1) != 'C')) {
2625 if (SoFar == nullptr)
2626 return nullptr;
2627 Node *CtorDtor = parseCtorDtorName(SoFar, State);
2628 if (CtorDtor == nullptr)
2629 return nullptr;
2630 PushComponent(CtorDtor);
2631 SoFar = parseAbiTags(SoFar);
2632 if (SoFar == nullptr)
2633 return nullptr;
2634 Subs.push_back(SoFar);
2635 continue;
2636 }
2637
2638 // ::= <prefix> <unqualified-name>
2639 Node *N = parseUnqualifiedName(State);
2640 if (N == nullptr)
2641 return nullptr;
2642 PushComponent(N);
2643 Subs.push_back(SoFar);
Rafael Espindolab940b662016-09-06 19:16:48 +00002644 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002645
2646 if (SoFar == nullptr || Subs.empty())
2647 return nullptr;
2648
2649 Subs.pop_back();
2650 return SoFar;
Rafael Espindolab940b662016-09-06 19:16:48 +00002651}
2652
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002653// <simple-id> ::= <source-name> [ <template-args> ]
2654Node *Db::parseSimpleId() {
2655 Node *SN = parseSourceName(/*NameState=*/nullptr);
2656 if (SN == nullptr)
2657 return nullptr;
2658 if (look() == 'I') {
2659 Node *TA = parseTemplateArgs();
2660 if (TA == nullptr)
2661 return nullptr;
2662 return make<NameWithTemplateArgs>(SN, TA);
Rafael Espindolab940b662016-09-06 19:16:48 +00002663 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002664 return SN;
Rafael Espindolab940b662016-09-06 19:16:48 +00002665}
2666
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002667// <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f())
2668// ::= <simple-id> # e.g., ~A<2*N>
2669Node *Db::parseDestructorName() {
2670 Node *Result;
2671 if (std::isdigit(look()))
2672 Result = parseSimpleId();
2673 else
2674 Result = parseUnresolvedType();
2675 if (Result == nullptr)
2676 return nullptr;
2677 return make<DtorName>(Result);
Rafael Espindolab940b662016-09-06 19:16:48 +00002678}
2679
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002680// <unresolved-type> ::= <template-param>
2681// ::= <decltype>
2682// ::= <substitution>
2683Node *Db::parseUnresolvedType() {
2684 if (look() == 'T') {
2685 Node *TP = parseTemplateParam();
2686 if (TP == nullptr)
2687 return nullptr;
2688 Subs.push_back(TP);
2689 return TP;
2690 }
2691 if (look() == 'D') {
2692 Node *DT = parseDecltype();
2693 if (DT == nullptr)
2694 return nullptr;
2695 Subs.push_back(DT);
2696 return DT;
2697 }
2698 return parseSubstitution();
2699}
Rafael Espindolab940b662016-09-06 19:16:48 +00002700
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002701// <base-unresolved-name> ::= <simple-id> # unresolved name
2702// extension ::= <operator-name> # unresolved operator-function-id
2703// extension ::= <operator-name> <template-args> # unresolved operator template-id
2704// ::= on <operator-name> # unresolved operator-function-id
2705// ::= on <operator-name> <template-args> # unresolved operator template-id
2706// ::= dn <destructor-name> # destructor or pseudo-destructor;
2707// # e.g. ~X or ~X<N-1>
2708Node *Db::parseBaseUnresolvedName() {
2709 if (std::isdigit(look()))
2710 return parseSimpleId();
Rafael Espindolab940b662016-09-06 19:16:48 +00002711
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002712 if (consumeIf("dn"))
2713 return parseDestructorName();
2714
2715 consumeIf("on");
2716
2717 Node *Oper = parseOperatorName(/*NameState=*/nullptr);
2718 if (Oper == nullptr)
2719 return nullptr;
2720 if (look() == 'I') {
2721 Node *TA = parseTemplateArgs();
2722 if (TA == nullptr)
2723 return nullptr;
2724 return make<NameWithTemplateArgs>(Oper, TA);
2725 }
2726 return Oper;
2727}
2728
2729// <unresolved-name>
2730// extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
2731// ::= [gs] <base-unresolved-name> # x or (with "gs") ::x
2732// ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
2733// # A::x, N::y, A<T>::z; "gs" means leading "::"
2734// ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x
2735// extension ::= sr <unresolved-type> <template-args> <base-unresolved-name>
2736// # T::N::x /decltype(p)::N::x
2737// (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
2738//
2739// <unresolved-qualifier-level> ::= <simple-id>
2740Node *Db::parseUnresolvedName() {
2741 Node *SoFar = nullptr;
2742
2743 // srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name>
2744 // srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name>
2745 if (consumeIf("srN")) {
2746 SoFar = parseUnresolvedType();
2747 if (SoFar == nullptr)
2748 return nullptr;
2749
2750 if (look() == 'I') {
2751 Node *TA = parseTemplateArgs();
2752 if (TA == nullptr)
2753 return nullptr;
2754 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
2755 }
2756
2757 while (!consumeIf('E')) {
2758 Node *Qual = parseSimpleId();
2759 if (Qual == nullptr)
2760 return nullptr;
2761 SoFar = make<QualifiedName>(SoFar, Qual);
2762 }
2763
2764 Node *Base = parseBaseUnresolvedName();
2765 if (Base == nullptr)
2766 return nullptr;
2767 return make<QualifiedName>(SoFar, Base);
2768 }
2769
2770 bool Global = consumeIf("gs");
2771
2772 // [gs] <base-unresolved-name> # x or (with "gs") ::x
2773 if (!consumeIf("sr")) {
2774 SoFar = parseBaseUnresolvedName();
2775 if (SoFar == nullptr)
2776 return nullptr;
2777 if (Global)
2778 SoFar = make<GlobalQualifiedName>(SoFar);
2779 return SoFar;
2780 }
2781
2782 // [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name>
2783 if (std::isdigit(look())) {
2784 do {
2785 Node *Qual = parseSimpleId();
2786 if (Qual == nullptr)
2787 return nullptr;
2788 if (SoFar)
2789 SoFar = make<QualifiedName>(SoFar, Qual);
2790 else if (Global)
2791 SoFar = make<GlobalQualifiedName>(Qual);
2792 else
2793 SoFar = Qual;
2794 } while (!consumeIf('E'));
2795 }
2796 // sr <unresolved-type> <base-unresolved-name>
2797 // sr <unresolved-type> <template-args> <base-unresolved-name>
2798 else {
2799 SoFar = parseUnresolvedType();
2800 if (SoFar == nullptr)
2801 return nullptr;
2802
2803 if (look() == 'I') {
2804 Node *TA = parseTemplateArgs();
2805 if (TA == nullptr)
2806 return nullptr;
2807 SoFar = make<NameWithTemplateArgs>(SoFar, TA);
2808 }
2809 }
2810
2811 assert(SoFar != nullptr);
2812
2813 Node *Base = parseBaseUnresolvedName();
2814 if (Base == nullptr)
2815 return nullptr;
2816 return make<QualifiedName>(SoFar, Base);
2817}
2818
2819// <abi-tags> ::= <abi-tag> [<abi-tags>]
2820// <abi-tag> ::= B <source-name>
2821Node *Db::parseAbiTags(Node *N) {
2822 while (consumeIf('B')) {
2823 StringView SN = parseBareSourceName();
2824 if (SN.empty())
2825 return nullptr;
2826 N = make<AbiTagAttr>(N, SN);
2827 }
2828 return N;
2829}
2830
2831// <number> ::= [n] <non-negative decimal integer>
2832StringView Db::parseNumber(bool AllowNegative) {
2833 const char *Tmp = First;
2834 if (AllowNegative)
2835 consumeIf('n');
2836 if (numLeft() == 0 || !std::isdigit(*First))
2837 return StringView();
2838 while (numLeft() != 0 && std::isdigit(*First))
2839 ++First;
2840 return StringView(Tmp, First);
2841}
2842
2843// <positive length number> ::= [0-9]*
2844bool Db::parsePositiveInteger(size_t *Out) {
2845 *Out = 0;
2846 if (look() < '0' || look() > '9')
2847 return true;
2848 while (look() >= '0' && look() <= '9') {
2849 *Out *= 10;
2850 *Out += static_cast<size_t>(consume() - '0');
2851 }
2852 return false;
2853}
2854
2855StringView Db::parseBareSourceName() {
2856 size_t Int = 0;
2857 if (parsePositiveInteger(&Int) || numLeft() < Int)
2858 return StringView();
2859 StringView R(First, First + Int);
2860 First += Int;
2861 return R;
2862}
2863
2864// <function-type> ::= [<CV-qualifiers>] [<exception-spec>] [Dx] F [Y] <bare-function-type> [<ref-qualifier>] E
2865//
2866// <exception-spec> ::= Do # non-throwing exception-specification (e.g., noexcept, throw())
2867// ::= DO <expression> E # computed (instantiation-dependent) noexcept
2868// ::= Dw <type>+ E # dynamic exception specification with instantiation-dependent types
2869//
2870// <ref-qualifier> ::= R # & ref-qualifier
2871// <ref-qualifier> ::= O # && ref-qualifier
2872Node *Db::parseFunctionType() {
2873 Qualifiers CVQuals = parseCVQualifiers();
2874
2875 Node *ExceptionSpec = nullptr;
2876 if (consumeIf("Do")) {
2877 ExceptionSpec = make<NameType>("noexcept");
2878 } else if (consumeIf("DO")) {
2879 Node *E = parseExpr();
2880 if (E == nullptr || !consumeIf('E'))
2881 return nullptr;
2882 ExceptionSpec = make<NoexceptSpec>(E);
2883 } else if (consumeIf("Dw")) {
2884 size_t SpecsBegin = Names.size();
2885 while (!consumeIf('E')) {
2886 Node *T = parseType();
2887 if (T == nullptr)
2888 return nullptr;
2889 Names.push_back(T);
2890 }
2891 ExceptionSpec =
2892 make<DynamicExceptionSpec>(popTrailingNodeArray(SpecsBegin));
2893 }
2894
2895 consumeIf("Dx"); // transaction safe
2896
2897 if (!consumeIf('F'))
2898 return nullptr;
2899 consumeIf('Y'); // extern "C"
2900 Node *ReturnType = parseType();
2901 if (ReturnType == nullptr)
2902 return nullptr;
2903
2904 FunctionRefQual ReferenceQualifier = FrefQualNone;
2905 size_t ParamsBegin = Names.size();
2906 while (true) {
2907 if (consumeIf('E'))
2908 break;
2909 if (consumeIf('v'))
2910 continue;
2911 if (consumeIf("RE")) {
2912 ReferenceQualifier = FrefQualLValue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002913 break;
2914 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002915 if (consumeIf("OE")) {
2916 ReferenceQualifier = FrefQualRValue;
Rafael Espindolab940b662016-09-06 19:16:48 +00002917 break;
2918 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00002919 Node *T = parseType();
2920 if (T == nullptr)
2921 return nullptr;
2922 Names.push_back(T);
2923 }
2924
2925 NodeArray Params = popTrailingNodeArray(ParamsBegin);
2926 return make<FunctionType>(ReturnType, Params, CVQuals,
2927 ReferenceQualifier, ExceptionSpec);
2928}
2929
2930// extension:
2931// <vector-type> ::= Dv <positive dimension number> _ <extended element type>
2932// ::= Dv [<dimension expression>] _ <element type>
2933// <extended element type> ::= <element type>
2934// ::= p # AltiVec vector pixel
2935Node *Db::parseVectorType() {
2936 if (!consumeIf("Dv"))
2937 return nullptr;
2938 if (look() >= '1' && look() <= '9') {
2939 StringView DimensionNumber = parseNumber();
2940 if (!consumeIf('_'))
2941 return nullptr;
2942 if (consumeIf('p'))
2943 return make<VectorType>(DimensionNumber);
2944 Node *ElemType = parseType();
2945 if (ElemType == nullptr)
2946 return nullptr;
2947 return make<VectorType>(ElemType, DimensionNumber);
2948 }
2949
2950 if (!consumeIf('_')) {
2951 Node *DimExpr = parseExpr();
2952 if (!DimExpr)
2953 return nullptr;
2954 if (!consumeIf('_'))
2955 return nullptr;
2956 Node *ElemType = parseType();
2957 if (!ElemType)
2958 return nullptr;
2959 return make<VectorType>(ElemType, DimExpr);
2960 }
2961 Node *ElemType = parseType();
2962 if (!ElemType)
2963 return nullptr;
2964 return make<VectorType>(ElemType, StringView());
2965}
2966
2967// <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x)
2968// ::= DT <expression> E # decltype of an expression (C++0x)
2969Node *Db::parseDecltype() {
2970 if (!consumeIf('D'))
2971 return nullptr;
2972 if (!consumeIf('t') && !consumeIf('T'))
2973 return nullptr;
2974 Node *E = parseExpr();
2975 if (E == nullptr)
2976 return nullptr;
2977 if (!consumeIf('E'))
2978 return nullptr;
2979 return make<EnclosingExpr>("decltype(", E, ")");
2980}
2981
2982// <array-type> ::= A <positive dimension number> _ <element type>
2983// ::= A [<dimension expression>] _ <element type>
2984Node *Db::parseArrayType() {
2985 if (!consumeIf('A'))
2986 return nullptr;
2987
2988 if (std::isdigit(look())) {
2989 StringView Dimension = parseNumber();
2990 if (!consumeIf('_'))
2991 return nullptr;
2992 Node *Ty = parseType();
2993 if (Ty == nullptr)
2994 return nullptr;
2995 return make<ArrayType>(Ty, Dimension);
2996 }
2997
2998 if (!consumeIf('_')) {
2999 Node *DimExpr = parseExpr();
3000 if (DimExpr == nullptr)
3001 return nullptr;
3002 if (!consumeIf('_'))
3003 return nullptr;
3004 Node *ElementType = parseType();
3005 if (ElementType == nullptr)
3006 return nullptr;
3007 return make<ArrayType>(ElementType, DimExpr);
3008 }
3009
3010 Node *Ty = parseType();
3011 if (Ty == nullptr)
3012 return nullptr;
3013 return make<ArrayType>(Ty);
3014}
3015
3016// <pointer-to-member-type> ::= M <class type> <member type>
3017Node *Db::parsePointerToMemberType() {
3018 if (!consumeIf('M'))
3019 return nullptr;
3020 Node *ClassType = parseType();
3021 if (ClassType == nullptr)
3022 return nullptr;
3023 Node *MemberType = parseType();
3024 if (MemberType == nullptr)
3025 return nullptr;
3026 return make<PointerToMemberType>(ClassType, MemberType);
3027}
3028
3029// <class-enum-type> ::= <name> # non-dependent type name, dependent type name, or dependent typename-specifier
3030// ::= Ts <name> # dependent elaborated type specifier using 'struct' or 'class'
3031// ::= Tu <name> # dependent elaborated type specifier using 'union'
3032// ::= Te <name> # dependent elaborated type specifier using 'enum'
3033Node *Db::parseClassEnumType() {
3034 StringView ElabSpef;
3035 if (consumeIf("Ts"))
3036 ElabSpef = "struct";
3037 else if (consumeIf("Tu"))
3038 ElabSpef = "union";
3039 else if (consumeIf("Te"))
3040 ElabSpef = "enum";
3041
3042 Node *Name = parseName();
3043 if (Name == nullptr)
3044 return nullptr;
3045
3046 if (!ElabSpef.empty())
3047 return make<ElaboratedTypeSpefType>(ElabSpef, Name);
3048
3049 return Name;
3050}
3051
3052// <qualified-type> ::= <qualifiers> <type>
3053// <qualifiers> ::= <extended-qualifier>* <CV-qualifiers>
3054// <extended-qualifier> ::= U <source-name> [<template-args>] # vendor extended type qualifier
3055Node *Db::parseQualifiedType() {
3056 if (consumeIf('U')) {
3057 StringView Qual = parseBareSourceName();
3058 if (Qual.empty())
3059 return nullptr;
3060
3061 // FIXME parse the optional <template-args> here!
3062
3063 // extension ::= U <objc-name> <objc-type> # objc-type<identifier>
3064 if (Qual.startsWith("objcproto")) {
3065 StringView ProtoSourceName = Qual.dropFront(std::strlen("objcproto"));
3066 StringView Proto;
3067 {
3068 SwapAndRestore<const char *> SaveFirst(First, ProtoSourceName.begin()),
3069 SaveLast(Last, ProtoSourceName.end());
3070 Proto = parseBareSourceName();
Rafael Espindolab940b662016-09-06 19:16:48 +00003071 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00003072 if (Proto.empty())
3073 return nullptr;
3074 Node *Child = parseQualifiedType();
3075 if (Child == nullptr)
3076 return nullptr;
3077 return make<ObjCProtoName>(Child, Proto);
3078 }
3079
3080 Node *Child = parseQualifiedType();
3081 if (Child == nullptr)
3082 return nullptr;
3083 return make<VendorExtQualType>(Child, Qual);
3084 }
3085
3086 Qualifiers Quals = parseCVQualifiers();
3087 Node *Ty = parseType();
3088 if (Ty == nullptr)
3089 return nullptr;
3090 if (Quals != QualNone)
3091 Ty = make<QualType>(Ty, Quals);
3092 return Ty;
3093}
3094
3095// <type> ::= <builtin-type>
3096// ::= <qualified-type>
3097// ::= <function-type>
3098// ::= <class-enum-type>
3099// ::= <array-type>
3100// ::= <pointer-to-member-type>
3101// ::= <template-param>
3102// ::= <template-template-param> <template-args>
3103// ::= <decltype>
3104// ::= P <type> # pointer
3105// ::= R <type> # l-value reference
3106// ::= O <type> # r-value reference (C++11)
3107// ::= C <type> # complex pair (C99)
3108// ::= G <type> # imaginary (C99)
3109// ::= <substitution> # See Compression below
3110// extension ::= U <objc-name> <objc-type> # objc-type<identifier>
3111// extension ::= <vector-type> # <vector-type> starts with Dv
3112//
3113// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
3114// <objc-type> ::= <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
3115Node *Db::parseType() {
3116 Node *Result = nullptr;
3117
3118 switch (look()) {
3119 // ::= <qualified-type>
3120 case 'r':
3121 case 'V':
3122 case 'K': {
3123 unsigned AfterQuals = 0;
3124 if (look(AfterQuals) == 'r') ++AfterQuals;
3125 if (look(AfterQuals) == 'V') ++AfterQuals;
3126 if (look(AfterQuals) == 'K') ++AfterQuals;
3127
3128 if (look(AfterQuals) == 'F' ||
3129 (look(AfterQuals) == 'D' &&
3130 (look(AfterQuals + 1) == 'o' || look(AfterQuals + 1) == 'O' ||
3131 look(AfterQuals + 1) == 'w' || look(AfterQuals + 1) == 'x'))) {
3132 Result = parseFunctionType();
Rafael Espindolab940b662016-09-06 19:16:48 +00003133 break;
3134 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00003135 LLVM_FALLTHROUGH;
3136 }
3137 case 'U': {
3138 Result = parseQualifiedType();
3139 break;
3140 }
3141 // <builtin-type> ::= v # void
3142 case 'v':
3143 ++First;
3144 return make<NameType>("void");
3145 // ::= w # wchar_t
3146 case 'w':
3147 ++First;
3148 return make<NameType>("wchar_t");
3149 // ::= b # bool
3150 case 'b':
3151 ++First;
3152 return make<NameType>("bool");
3153 // ::= c # char
3154 case 'c':
3155 ++First;
3156 return make<NameType>("char");
3157 // ::= a # signed char
3158 case 'a':
3159 ++First;
3160 return make<NameType>("signed char");
3161 // ::= h # unsigned char
3162 case 'h':
3163 ++First;
3164 return make<NameType>("unsigned char");
3165 // ::= s # short
3166 case 's':
3167 ++First;
3168 return make<NameType>("short");
3169 // ::= t # unsigned short
3170 case 't':
3171 ++First;
3172 return make<NameType>("unsigned short");
3173 // ::= i # int
3174 case 'i':
3175 ++First;
3176 return make<NameType>("int");
3177 // ::= j # unsigned int
3178 case 'j':
3179 ++First;
3180 return make<NameType>("unsigned int");
3181 // ::= l # long
3182 case 'l':
3183 ++First;
3184 return make<NameType>("long");
3185 // ::= m # unsigned long
3186 case 'm':
3187 ++First;
3188 return make<NameType>("unsigned long");
3189 // ::= x # long long, __int64
3190 case 'x':
3191 ++First;
3192 return make<NameType>("long long");
3193 // ::= y # unsigned long long, __int64
3194 case 'y':
3195 ++First;
3196 return make<NameType>("unsigned long long");
3197 // ::= n # __int128
3198 case 'n':
3199 ++First;
3200 return make<NameType>("__int128");
3201 // ::= o # unsigned __int128
3202 case 'o':
3203 ++First;
3204 return make<NameType>("unsigned __int128");
3205 // ::= f # float
3206 case 'f':
3207 ++First;
3208 return make<NameType>("float");
3209 // ::= d # double
3210 case 'd':
3211 ++First;
3212 return make<NameType>("double");
3213 // ::= e # long double, __float80
3214 case 'e':
3215 ++First;
3216 return make<NameType>("long double");
3217 // ::= g # __float128
3218 case 'g':
3219 ++First;
3220 return make<NameType>("__float128");
3221 // ::= z # ellipsis
3222 case 'z':
3223 ++First;
3224 return make<NameType>("...");
3225
3226 // <builtin-type> ::= u <source-name> # vendor extended type
3227 case 'u': {
3228 ++First;
3229 StringView Res = parseBareSourceName();
3230 if (Res.empty())
3231 return nullptr;
3232 return make<NameType>(Res);
3233 }
3234 case 'D':
3235 switch (look(1)) {
3236 // ::= Dd # IEEE 754r decimal floating point (64 bits)
3237 case 'd':
3238 First += 2;
3239 return make<NameType>("decimal64");
3240 // ::= De # IEEE 754r decimal floating point (128 bits)
3241 case 'e':
3242 First += 2;
3243 return make<NameType>("decimal128");
3244 // ::= Df # IEEE 754r decimal floating point (32 bits)
3245 case 'f':
3246 First += 2;
3247 return make<NameType>("decimal32");
3248 // ::= Dh # IEEE 754r half-precision floating point (16 bits)
3249 case 'h':
3250 First += 2;
3251 return make<NameType>("decimal16");
3252 // ::= Di # char32_t
3253 case 'i':
3254 First += 2;
3255 return make<NameType>("char32_t");
3256 // ::= Ds # char16_t
3257 case 's':
3258 First += 2;
3259 return make<NameType>("char16_t");
3260 // ::= Da # auto (in dependent new-expressions)
3261 case 'a':
3262 First += 2;
3263 return make<NameType>("auto");
3264 // ::= Dc # decltype(auto)
3265 case 'c':
3266 First += 2;
3267 return make<NameType>("decltype(auto)");
3268 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr))
3269 case 'n':
3270 First += 2;
3271 return make<NameType>("std::nullptr_t");
3272
3273 // ::= <decltype>
3274 case 't':
3275 case 'T': {
3276 Result = parseDecltype();
3277 break;
3278 }
3279 // extension ::= <vector-type> # <vector-type> starts with Dv
3280 case 'v': {
3281 Result = parseVectorType();
3282 break;
3283 }
3284 // ::= Dp <type> # pack expansion (C++0x)
3285 case 'p': {
3286 First += 2;
3287 Node *Child = parseType();
3288 if (!Child)
3289 return nullptr;
3290 Result = make<ParameterPackExpansion>(Child);
3291 break;
3292 }
3293 // Exception specifier on a function type.
3294 case 'o':
3295 case 'O':
3296 case 'w':
3297 // Transaction safe function type.
3298 case 'x':
3299 Result = parseFunctionType();
3300 break;
3301 }
3302 break;
3303 // ::= <function-type>
3304 case 'F': {
3305 Result = parseFunctionType();
3306 break;
3307 }
3308 // ::= <array-type>
3309 case 'A': {
3310 Result = parseArrayType();
3311 break;
3312 }
3313 // ::= <pointer-to-member-type>
3314 case 'M': {
3315 Result = parsePointerToMemberType();
3316 break;
3317 }
3318 // ::= <template-param>
3319 case 'T': {
3320 // This could be an elaborate type specifier on a <class-enum-type>.
3321 if (look(1) == 's' || look(1) == 'u' || look(1) == 'e') {
3322 Result = parseClassEnumType();
3323 break;
3324 }
3325
3326 Result = parseTemplateParam();
3327 if (Result == nullptr)
3328 return nullptr;
3329
3330 // Result could be either of:
3331 // <type> ::= <template-param>
3332 // <type> ::= <template-template-param> <template-args>
3333 //
3334 // <template-template-param> ::= <template-param>
3335 // ::= <substitution>
3336 //
3337 // If this is followed by some <template-args>, and we're permitted to
3338 // parse them, take the second production.
3339
3340 if (TryToParseTemplateArgs && look() == 'I') {
3341 Node *TA = parseTemplateArgs();
3342 if (TA == nullptr)
3343 return nullptr;
3344 Result = make<NameWithTemplateArgs>(Result, TA);
3345 }
3346 break;
3347 }
3348 // ::= P <type> # pointer
3349 case 'P': {
3350 ++First;
3351 Node *Ptr = parseType();
3352 if (Ptr == nullptr)
3353 return nullptr;
3354 Result = make<PointerType>(Ptr);
3355 break;
3356 }
3357 // ::= R <type> # l-value reference
3358 case 'R': {
3359 ++First;
3360 Node *Ref = parseType();
3361 if (Ref == nullptr)
3362 return nullptr;
3363 Result = make<LValueReferenceType>(Ref);
3364 break;
3365 }
3366 // ::= O <type> # r-value reference (C++11)
3367 case 'O': {
3368 ++First;
3369 Node *Ref = parseType();
3370 if (Ref == nullptr)
3371 return nullptr;
3372 Result = make<RValueReferenceType>(Ref);
3373 break;
3374 }
3375 // ::= C <type> # complex pair (C99)
3376 case 'C': {
3377 ++First;
3378 Node *P = parseType();
3379 if (P == nullptr)
3380 return nullptr;
3381 Result = make<PostfixQualifiedType>(P, " complex");
3382 break;
3383 }
3384 // ::= G <type> # imaginary (C99)
3385 case 'G': {
3386 ++First;
3387 Node *P = parseType();
3388 if (P == nullptr)
3389 return P;
3390 Result = make<PostfixQualifiedType>(P, " imaginary");
3391 break;
3392 }
3393 // ::= <substitution> # See Compression below
3394 case 'S': {
3395 if (look(1) && look(1) != 't') {
3396 Node *Sub = parseSubstitution();
3397 if (Sub == nullptr)
3398 return nullptr;
3399
3400 // Sub could be either of:
3401 // <type> ::= <substitution>
3402 // <type> ::= <template-template-param> <template-args>
3403 //
3404 // <template-template-param> ::= <template-param>
3405 // ::= <substitution>
3406 //
3407 // If this is followed by some <template-args>, and we're permitted to
3408 // parse them, take the second production.
3409
3410 if (TryToParseTemplateArgs && look() == 'I') {
3411 Node *TA = parseTemplateArgs();
3412 if (TA == nullptr)
3413 return nullptr;
3414 Result = make<NameWithTemplateArgs>(Sub, TA);
3415 break;
3416 }
3417
3418 // If all we parsed was a substitution, don't re-insert into the
3419 // substitution table.
3420 return Sub;
3421 }
3422 LLVM_FALLTHROUGH;
3423 }
3424 // ::= <class-enum-type>
3425 default: {
3426 Result = parseClassEnumType();
3427 break;
3428 }
3429 }
3430
3431 // If we parsed a type, insert it into the substitution table. Note that all
3432 // <builtin-type>s and <substitution>s have already bailed out, because they
3433 // don't get substitutions.
3434 if (Result != nullptr)
3435 Subs.push_back(Result);
3436 return Result;
3437}
3438
3439Node *Db::parsePrefixExpr(StringView Kind) {
3440 Node *E = parseExpr();
3441 if (E == nullptr)
3442 return nullptr;
3443 return make<PrefixExpr>(Kind, E);
3444}
3445
3446Node *Db::parseBinaryExpr(StringView Kind) {
3447 Node *LHS = parseExpr();
3448 if (LHS == nullptr)
3449 return nullptr;
3450 Node *RHS = parseExpr();
3451 if (RHS == nullptr)
3452 return nullptr;
3453 return make<BinaryExpr>(LHS, Kind, RHS);
3454}
3455
3456Node *Db::parseIntegerLiteral(StringView Lit) {
3457 StringView Tmp = parseNumber(true);
3458 if (!Tmp.empty() && consumeIf('E'))
3459 return make<IntegerExpr>(Lit, Tmp);
3460 return nullptr;
3461}
3462
3463// <CV-Qualifiers> ::= [r] [V] [K]
3464Qualifiers Db::parseCVQualifiers() {
3465 Qualifiers CVR = QualNone;
3466 if (consumeIf('r'))
3467 addQualifiers(CVR, QualRestrict);
3468 if (consumeIf('V'))
3469 addQualifiers(CVR, QualVolatile);
3470 if (consumeIf('K'))
3471 addQualifiers(CVR, QualConst);
3472 return CVR;
3473}
3474
3475// <function-param> ::= fp <top-level CV-Qualifiers> _ # L == 0, first parameter
3476// ::= fp <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters
3477// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> _ # L > 0, first parameter
3478// ::= fL <L-1 non-negative number> p <top-level CV-Qualifiers> <parameter-2 non-negative number> _ # L > 0, second and later parameters
3479Node *Db::parseFunctionParam() {
3480 if (consumeIf("fp")) {
3481 parseCVQualifiers();
3482 StringView Num = parseNumber();
3483 if (!consumeIf('_'))
3484 return nullptr;
3485 return make<FunctionParam>(Num);
3486 }
3487 if (consumeIf("fL")) {
3488 if (parseNumber().empty())
3489 return nullptr;
3490 if (!consumeIf('p'))
3491 return nullptr;
3492 parseCVQualifiers();
3493 StringView Num = parseNumber();
3494 if (!consumeIf('_'))
3495 return nullptr;
3496 return make<FunctionParam>(Num);
3497 }
3498 return nullptr;
3499}
3500
3501// [gs] nw <expression>* _ <type> E # new (expr-list) type
3502// [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3503// [gs] na <expression>* _ <type> E # new[] (expr-list) type
3504// [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3505// <initializer> ::= pi <expression>* E # parenthesized initialization
3506Node *Db::parseNewExpr() {
3507 bool Global = consumeIf("gs");
3508 bool IsArray = look(1) == 'a';
3509 if (!consumeIf("nw") && !consumeIf("na"))
3510 return nullptr;
3511 size_t Exprs = Names.size();
3512 while (!consumeIf('_')) {
3513 Node *Ex = parseExpr();
3514 if (Ex == nullptr)
3515 return nullptr;
3516 Names.push_back(Ex);
3517 }
3518 NodeArray ExprList = popTrailingNodeArray(Exprs);
3519 Node *Ty = parseType();
3520 if (Ty == nullptr)
3521 return Ty;
3522 if (consumeIf("pi")) {
3523 size_t InitsBegin = Names.size();
3524 while (!consumeIf('E')) {
3525 Node *Init = parseExpr();
3526 if (Init == nullptr)
3527 return Init;
3528 Names.push_back(Init);
3529 }
3530 NodeArray Inits = popTrailingNodeArray(InitsBegin);
3531 return make<NewExpr>(ExprList, Ty, Inits, Global, IsArray);
3532 } else if (!consumeIf('E'))
3533 return nullptr;
3534 return make<NewExpr>(ExprList, Ty, NodeArray(), Global, IsArray);
3535}
3536
3537// cv <type> <expression> # conversion with one argument
3538// cv <type> _ <expression>* E # conversion with a different number of arguments
3539Node *Db::parseConversionExpr() {
3540 if (!consumeIf("cv"))
3541 return nullptr;
3542 Node *Ty;
3543 {
3544 SwapAndRestore<bool> SaveTemp(TryToParseTemplateArgs, false);
3545 Ty = parseType();
3546 }
3547
3548 if (Ty == nullptr)
3549 return nullptr;
3550
3551 if (consumeIf('_')) {
3552 size_t ExprsBegin = Names.size();
3553 while (!consumeIf('E')) {
3554 Node *E = parseExpr();
3555 if (E == nullptr)
3556 return E;
3557 Names.push_back(E);
3558 }
3559 NodeArray Exprs = popTrailingNodeArray(ExprsBegin);
3560 return make<ConversionExpr>(Ty, Exprs);
3561 }
3562
3563 Node *E[1] = {parseExpr()};
3564 if (E[0] == nullptr)
3565 return nullptr;
3566 return make<ConversionExpr>(Ty, makeNodeArray(E, E + 1));
3567}
3568
3569// <expr-primary> ::= L <type> <value number> E # integer literal
3570// ::= L <type> <value float> E # floating literal
3571// ::= L <string type> E # string literal
3572// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
3573// FIXME: ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
3574// ::= L <mangled-name> E # external name
3575Node *Db::parseExprPrimary() {
3576 if (!consumeIf('L'))
3577 return nullptr;
3578 switch (look()) {
3579 case 'w':
3580 ++First;
3581 return parseIntegerLiteral("wchar_t");
3582 case 'b':
3583 if (consumeIf("b0E"))
3584 return make<BoolExpr>(0);
3585 if (consumeIf("b1E"))
3586 return make<BoolExpr>(1);
3587 return nullptr;
3588 case 'c':
3589 ++First;
3590 return parseIntegerLiteral("char");
3591 case 'a':
3592 ++First;
3593 return parseIntegerLiteral("signed char");
3594 case 'h':
3595 ++First;
3596 return parseIntegerLiteral("unsigned char");
3597 case 's':
3598 ++First;
3599 return parseIntegerLiteral("short");
3600 case 't':
3601 ++First;
3602 return parseIntegerLiteral("unsigned short");
3603 case 'i':
3604 ++First;
3605 return parseIntegerLiteral("");
3606 case 'j':
3607 ++First;
3608 return parseIntegerLiteral("u");
3609 case 'l':
3610 ++First;
3611 return parseIntegerLiteral("l");
3612 case 'm':
3613 ++First;
3614 return parseIntegerLiteral("ul");
3615 case 'x':
3616 ++First;
3617 return parseIntegerLiteral("ll");
3618 case 'y':
3619 ++First;
3620 return parseIntegerLiteral("ull");
3621 case 'n':
3622 ++First;
3623 return parseIntegerLiteral("__int128");
3624 case 'o':
3625 ++First;
3626 return parseIntegerLiteral("unsigned __int128");
3627 case 'f':
3628 ++First;
3629 return parseFloatingLiteral<float>();
3630 case 'd':
3631 ++First;
3632 return parseFloatingLiteral<double>();
3633 case 'e':
3634 ++First;
3635 return parseFloatingLiteral<long double>();
3636 case '_':
3637 if (consumeIf("_Z")) {
3638 Node *R = parseEncoding();
3639 if (R != nullptr && consumeIf('E'))
3640 return R;
3641 }
3642 return nullptr;
3643 case 'T':
3644 // Invalid mangled name per
3645 // http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
3646 return nullptr;
3647 default: {
3648 // might be named type
3649 Node *T = parseType();
3650 if (T == nullptr)
3651 return nullptr;
3652 StringView N = parseNumber();
3653 if (!N.empty()) {
3654 if (!consumeIf('E'))
3655 return nullptr;
3656 return make<IntegerCastExpr>(T, N);
3657 }
3658 if (consumeIf('E'))
3659 return T;
3660 return nullptr;
3661 }
3662 }
3663}
3664
3665// <braced-expression> ::= <expression>
3666// ::= di <field source-name> <braced-expression> # .name = expr
3667// ::= dx <index expression> <braced-expression> # [expr] = expr
3668// ::= dX <range begin expression> <range end expression> <braced-expression>
3669Node *Db::parseBracedExpr() {
3670 if (look() == 'd') {
3671 switch (look(1)) {
3672 case 'i': {
3673 First += 2;
3674 Node *Field = parseSourceName(/*NameState=*/nullptr);
3675 if (Field == nullptr)
3676 return nullptr;
3677 Node *Init = parseBracedExpr();
3678 if (Init == nullptr)
3679 return nullptr;
3680 return make<BracedExpr>(Field, Init, /*isArray=*/false);
3681 }
3682 case 'x': {
3683 First += 2;
3684 Node *Index = parseExpr();
3685 if (Index == nullptr)
3686 return nullptr;
3687 Node *Init = parseBracedExpr();
3688 if (Init == nullptr)
3689 return nullptr;
3690 return make<BracedExpr>(Index, Init, /*isArray=*/true);
3691 }
3692 case 'X': {
3693 First += 2;
3694 Node *RangeBegin = parseExpr();
3695 if (RangeBegin == nullptr)
3696 return nullptr;
3697 Node *RangeEnd = parseExpr();
3698 if (RangeEnd == nullptr)
3699 return nullptr;
3700 Node *Init = parseBracedExpr();
3701 if (Init == nullptr)
3702 return nullptr;
3703 return make<BracedRangeExpr>(RangeBegin, RangeEnd, Init);
3704 }
Rafael Espindolab940b662016-09-06 19:16:48 +00003705 }
3706 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00003707 return parseExpr();
3708}
3709
3710// <expression> ::= <unary operator-name> <expression>
3711// ::= <binary operator-name> <expression> <expression>
3712// ::= <ternary operator-name> <expression> <expression> <expression>
3713// ::= cl <expression>+ E # call
3714// ::= cv <type> <expression> # conversion with one argument
3715// ::= cv <type> _ <expression>* E # conversion with a different number of arguments
3716// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
3717// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3718// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
3719// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3720// ::= [gs] dl <expression> # delete expression
3721// ::= [gs] da <expression> # delete[] expression
3722// ::= pp_ <expression> # prefix ++
3723// ::= mm_ <expression> # prefix --
3724// ::= ti <type> # typeid (type)
3725// ::= te <expression> # typeid (expression)
3726// ::= dc <type> <expression> # dynamic_cast<type> (expression)
3727// ::= sc <type> <expression> # static_cast<type> (expression)
3728// ::= cc <type> <expression> # const_cast<type> (expression)
3729// ::= rc <type> <expression> # reinterpret_cast<type> (expression)
3730// ::= st <type> # sizeof (a type)
3731// ::= sz <expression> # sizeof (an expression)
3732// ::= at <type> # alignof (a type)
3733// ::= az <expression> # alignof (an expression)
3734// ::= nx <expression> # noexcept (expression)
3735// ::= <template-param>
3736// ::= <function-param>
3737// ::= dt <expression> <unresolved-name> # expr.name
3738// ::= pt <expression> <unresolved-name> # expr->name
3739// ::= ds <expression> <expression> # expr.*expr
3740// ::= sZ <template-param> # size of a parameter pack
3741// ::= sZ <function-param> # size of a function parameter pack
3742// ::= sp <expression> # pack expansion
3743// ::= tw <expression> # throw expression
3744// ::= tr # throw with no operand (rethrow)
3745// ::= <unresolved-name> # f(p), N::f(p), ::f(p),
3746// # freestanding dependent name (e.g., T::x),
3747// # objectless nonstatic member reference
3748// ::= fL <binary-operator-name> <expression> <expression>
3749// ::= fR <binary-operator-name> <expression> <expression>
3750// ::= fl <binary-operator-name> <expression>
3751// ::= fr <binary-operator-name> <expression>
3752// ::= <expr-primary>
3753Node *Db::parseExpr() {
3754 bool Global = consumeIf("gs");
3755 if (numLeft() < 2)
3756 return nullptr;
3757
3758 switch (*First) {
3759 case 'L':
3760 return parseExprPrimary();
3761 case 'T':
3762 return parseTemplateParam();
3763 case 'f':
3764 return parseFunctionParam();
3765 case 'a':
3766 switch (First[1]) {
3767 case 'a':
3768 First += 2;
3769 return parseBinaryExpr("&&");
3770 case 'd':
3771 First += 2;
3772 return parsePrefixExpr("&");
3773 case 'n':
3774 First += 2;
3775 return parseBinaryExpr("&");
3776 case 'N':
3777 First += 2;
3778 return parseBinaryExpr("&=");
3779 case 'S':
3780 First += 2;
3781 return parseBinaryExpr("=");
3782 case 't': {
3783 First += 2;
3784 Node *Ty = parseType();
3785 if (Ty == nullptr)
3786 return nullptr;
3787 return make<EnclosingExpr>("alignof (", Ty, ")");
3788 }
3789 case 'z': {
3790 First += 2;
3791 Node *Ty = parseExpr();
3792 if (Ty == nullptr)
3793 return nullptr;
3794 return make<EnclosingExpr>("alignof (", Ty, ")");
3795 }
3796 }
3797 return nullptr;
3798 case 'c':
3799 switch (First[1]) {
3800 // cc <type> <expression> # const_cast<type>(expression)
3801 case 'c': {
3802 First += 2;
3803 Node *Ty = parseType();
3804 if (Ty == nullptr)
3805 return Ty;
3806 Node *Ex = parseExpr();
3807 if (Ex == nullptr)
3808 return Ex;
3809 return make<CastExpr>("const_cast", Ty, Ex);
3810 }
3811 // cl <expression>+ E # call
3812 case 'l': {
3813 First += 2;
3814 Node *Callee = parseExpr();
3815 if (Callee == nullptr)
3816 return Callee;
3817 size_t ExprsBegin = Names.size();
3818 while (!consumeIf('E')) {
3819 Node *E = parseExpr();
3820 if (E == nullptr)
3821 return E;
3822 Names.push_back(E);
3823 }
3824 return make<CallExpr>(Callee, popTrailingNodeArray(ExprsBegin));
3825 }
3826 case 'm':
3827 First += 2;
3828 return parseBinaryExpr(",");
3829 case 'o':
3830 First += 2;
3831 return parsePrefixExpr("~");
3832 case 'v':
3833 return parseConversionExpr();
3834 }
3835 return nullptr;
3836 case 'd':
3837 switch (First[1]) {
3838 case 'a': {
3839 First += 2;
3840 Node *Ex = parseExpr();
3841 if (Ex == nullptr)
3842 return Ex;
3843 return make<DeleteExpr>(Ex, Global, /*is_array=*/true);
3844 }
3845 case 'c': {
3846 First += 2;
3847 Node *T = parseType();
3848 if (T == nullptr)
3849 return T;
3850 Node *Ex = parseExpr();
3851 if (Ex == nullptr)
3852 return Ex;
3853 return make<CastExpr>("dynamic_cast", T, Ex);
3854 }
3855 case 'e':
3856 First += 2;
3857 return parsePrefixExpr("*");
3858 case 'l': {
3859 First += 2;
3860 Node *E = parseExpr();
3861 if (E == nullptr)
3862 return E;
3863 return make<DeleteExpr>(E, Global, /*is_array=*/false);
3864 }
3865 case 'n':
3866 return parseUnresolvedName();
3867 case 's': {
3868 First += 2;
3869 Node *LHS = parseExpr();
3870 if (LHS == nullptr)
3871 return nullptr;
3872 Node *RHS = parseExpr();
3873 if (RHS == nullptr)
3874 return nullptr;
3875 return make<MemberExpr>(LHS, ".*", RHS);
3876 }
3877 case 't': {
3878 First += 2;
3879 Node *LHS = parseExpr();
3880 if (LHS == nullptr)
3881 return LHS;
3882 Node *RHS = parseExpr();
3883 if (RHS == nullptr)
3884 return nullptr;
3885 return make<MemberExpr>(LHS, ".", RHS);
3886 }
3887 case 'v':
3888 First += 2;
3889 return parseBinaryExpr("/");
3890 case 'V':
3891 First += 2;
3892 return parseBinaryExpr("/=");
3893 }
3894 return nullptr;
3895 case 'e':
3896 switch (First[1]) {
3897 case 'o':
3898 First += 2;
3899 return parseBinaryExpr("^");
3900 case 'O':
3901 First += 2;
3902 return parseBinaryExpr("^=");
3903 case 'q':
3904 First += 2;
3905 return parseBinaryExpr("==");
3906 }
3907 return nullptr;
3908 case 'g':
3909 switch (First[1]) {
3910 case 'e':
3911 First += 2;
3912 return parseBinaryExpr(">=");
3913 case 't':
3914 First += 2;
3915 return parseBinaryExpr(">");
3916 }
3917 return nullptr;
3918 case 'i':
3919 switch (First[1]) {
3920 case 'x': {
3921 First += 2;
3922 Node *Base = parseExpr();
3923 if (Base == nullptr)
3924 return nullptr;
3925 Node *Index = parseExpr();
3926 if (Index == nullptr)
3927 return Index;
3928 return make<ArraySubscriptExpr>(Base, Index);
3929 }
3930 case 'l': {
3931 First += 2;
3932 size_t InitsBegin = Names.size();
3933 while (!consumeIf('E')) {
3934 Node *E = parseBracedExpr();
3935 if (E == nullptr)
3936 return nullptr;
3937 Names.push_back(E);
3938 }
3939 return make<InitListExpr>(nullptr, popTrailingNodeArray(InitsBegin));
3940 }
3941 }
3942 return nullptr;
3943 case 'l':
3944 switch (First[1]) {
3945 case 'e':
3946 First += 2;
3947 return parseBinaryExpr("<=");
3948 case 's':
3949 First += 2;
3950 return parseBinaryExpr("<<");
3951 case 'S':
3952 First += 2;
3953 return parseBinaryExpr("<<=");
3954 case 't':
3955 First += 2;
3956 return parseBinaryExpr("<");
3957 }
3958 return nullptr;
3959 case 'm':
3960 switch (First[1]) {
3961 case 'i':
3962 First += 2;
3963 return parseBinaryExpr("-");
3964 case 'I':
3965 First += 2;
3966 return parseBinaryExpr("-=");
3967 case 'l':
3968 First += 2;
3969 return parseBinaryExpr("*");
3970 case 'L':
3971 First += 2;
3972 return parseBinaryExpr("*=");
3973 case 'm':
3974 First += 2;
3975 if (consumeIf('_'))
3976 return parsePrefixExpr("--");
3977 Node *Ex = parseExpr();
3978 if (Ex == nullptr)
3979 return nullptr;
3980 return make<PostfixExpr>(Ex, "--");
3981 }
3982 return nullptr;
3983 case 'n':
3984 switch (First[1]) {
3985 case 'a':
3986 case 'w':
3987 return parseNewExpr();
3988 case 'e':
3989 First += 2;
3990 return parseBinaryExpr("!=");
3991 case 'g':
3992 First += 2;
3993 return parsePrefixExpr("-");
3994 case 't':
3995 First += 2;
3996 return parsePrefixExpr("!");
3997 case 'x':
3998 First += 2;
3999 Node *Ex = parseExpr();
4000 if (Ex == nullptr)
4001 return Ex;
4002 return make<EnclosingExpr>("noexcept (", Ex, ")");
4003 }
4004 return nullptr;
4005 case 'o':
4006 switch (First[1]) {
4007 case 'n':
4008 return parseUnresolvedName();
4009 case 'o':
4010 First += 2;
4011 return parseBinaryExpr("||");
4012 case 'r':
4013 First += 2;
4014 return parseBinaryExpr("|");
4015 case 'R':
4016 First += 2;
4017 return parseBinaryExpr("|=");
4018 }
4019 return nullptr;
4020 case 'p':
4021 switch (First[1]) {
4022 case 'm':
4023 First += 2;
4024 return parseBinaryExpr("->*");
4025 case 'l':
4026 First += 2;
4027 return parseBinaryExpr("+");
4028 case 'L':
4029 First += 2;
4030 return parseBinaryExpr("+=");
4031 case 'p': {
4032 First += 2;
4033 if (consumeIf('_'))
4034 return parsePrefixExpr("++");
4035 Node *Ex = parseExpr();
4036 if (Ex == nullptr)
4037 return Ex;
4038 return make<PostfixExpr>(Ex, "++");
4039 }
4040 case 's':
4041 First += 2;
4042 return parsePrefixExpr("+");
4043 case 't': {
4044 First += 2;
4045 Node *L = parseExpr();
4046 if (L == nullptr)
4047 return nullptr;
4048 Node *R = parseExpr();
4049 if (R == nullptr)
4050 return nullptr;
4051 return make<MemberExpr>(L, "->", R);
4052 }
4053 }
4054 return nullptr;
4055 case 'q':
4056 if (First[1] == 'u') {
4057 First += 2;
4058 Node *Cond = parseExpr();
4059 if (Cond == nullptr)
4060 return nullptr;
4061 Node *LHS = parseExpr();
4062 if (LHS == nullptr)
4063 return nullptr;
4064 Node *RHS = parseExpr();
4065 if (RHS == nullptr)
4066 return nullptr;
4067 return make<ConditionalExpr>(Cond, LHS, RHS);
4068 }
4069 return nullptr;
4070 case 'r':
4071 switch (First[1]) {
4072 case 'c': {
4073 First += 2;
4074 Node *T = parseType();
4075 if (T == nullptr)
4076 return T;
4077 Node *Ex = parseExpr();
4078 if (Ex == nullptr)
4079 return Ex;
4080 return make<CastExpr>("reinterpret_cast", T, Ex);
4081 }
4082 case 'm':
4083 First += 2;
4084 return parseBinaryExpr("%");
4085 case 'M':
4086 First += 2;
4087 return parseBinaryExpr("%=");
4088 case 's':
4089 First += 2;
4090 return parseBinaryExpr(">>");
4091 case 'S':
4092 First += 2;
4093 return parseBinaryExpr(">>=");
4094 }
4095 return nullptr;
4096 case 's':
4097 switch (First[1]) {
4098 case 'c': {
4099 First += 2;
4100 Node *T = parseType();
4101 if (T == nullptr)
4102 return T;
4103 Node *Ex = parseExpr();
4104 if (Ex == nullptr)
4105 return Ex;
4106 return make<CastExpr>("static_cast", T, Ex);
4107 }
4108 case 'p': {
4109 First += 2;
4110 Node *Child = parseExpr();
4111 if (Child == nullptr)
4112 return nullptr;
4113 return make<ParameterPackExpansion>(Child);
4114 }
4115 case 'r':
4116 return parseUnresolvedName();
4117 case 't': {
4118 First += 2;
4119 Node *Ty = parseType();
4120 if (Ty == nullptr)
4121 return Ty;
4122 return make<EnclosingExpr>("sizeof (", Ty, ")");
4123 }
4124 case 'z': {
4125 First += 2;
4126 Node *Ex = parseExpr();
4127 if (Ex == nullptr)
4128 return Ex;
4129 return make<EnclosingExpr>("sizeof (", Ex, ")");
4130 }
4131 case 'Z':
4132 First += 2;
4133 if (look() == 'T') {
4134 Node *R = parseTemplateParam();
4135 if (R == nullptr)
4136 return nullptr;
4137 return make<SizeofParamPackExpr>(R);
4138 } else if (look() == 'f') {
4139 Node *FP = parseFunctionParam();
4140 if (FP == nullptr)
4141 return nullptr;
4142 return make<EnclosingExpr>("sizeof...", FP, ")");
4143 }
4144 return nullptr;
4145 }
4146 return nullptr;
4147 case 't':
4148 switch (First[1]) {
4149 case 'e': {
4150 First += 2;
4151 Node *Ex = parseExpr();
4152 if (Ex == nullptr)
4153 return Ex;
4154 return make<EnclosingExpr>("typeid (", Ex, ")");
4155 }
4156 case 'i': {
4157 First += 2;
4158 Node *Ty = parseType();
4159 if (Ty == nullptr)
4160 return Ty;
4161 return make<EnclosingExpr>("typeid (", Ty, ")");
4162 }
4163 case 'l': {
4164 First += 2;
4165 Node *Ty = parseType();
4166 if (Ty == nullptr)
4167 return nullptr;
4168 size_t InitsBegin = Names.size();
4169 while (!consumeIf('E')) {
4170 Node *E = parseBracedExpr();
4171 if (E == nullptr)
4172 return nullptr;
4173 Names.push_back(E);
4174 }
4175 return make<InitListExpr>(Ty, popTrailingNodeArray(InitsBegin));
4176 }
4177 case 'r':
4178 First += 2;
4179 return make<NameType>("throw");
4180 case 'w': {
4181 First += 2;
4182 Node *Ex = parseExpr();
4183 if (Ex == nullptr)
4184 return nullptr;
4185 return make<ThrowExpr>(Ex);
4186 }
4187 }
4188 return nullptr;
4189 case '1':
4190 case '2':
4191 case '3':
4192 case '4':
4193 case '5':
4194 case '6':
4195 case '7':
4196 case '8':
4197 case '9':
4198 return parseUnresolvedName();
4199 }
4200 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00004201}
4202
4203// <call-offset> ::= h <nv-offset> _
4204// ::= v <v-offset> _
4205//
4206// <nv-offset> ::= <offset number>
4207// # non-virtual base override
4208//
4209// <v-offset> ::= <offset number> _ <virtual offset number>
4210// # virtual base override, with vcall offset
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004211bool Db::parseCallOffset() {
4212 // Just scan through the call offset, we never add this information into the
4213 // output.
4214 if (consumeIf('h'))
4215 return parseNumber(true).empty() || !consumeIf('_');
4216 if (consumeIf('v'))
4217 return parseNumber(true).empty() || !consumeIf('_') ||
4218 parseNumber(true).empty() || !consumeIf('_');
4219 return true;
Rafael Espindolab940b662016-09-06 19:16:48 +00004220}
4221
4222// <special-name> ::= TV <type> # virtual table
4223// ::= TT <type> # VTT structure (construction vtable index)
4224// ::= TI <type> # typeinfo structure
4225// ::= TS <type> # typeinfo name (null-terminated byte string)
4226// ::= Tc <call-offset> <call-offset> <base encoding>
4227// # base is the nominal target function of thunk
4228// # first call-offset is 'this' adjustment
4229// # second call-offset is result adjustment
4230// ::= T <call-offset> <base encoding>
4231// # base is the nominal target function of thunk
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004232// ::= GV <object name> # Guard variable for one-time initialization
Rafael Espindolab940b662016-09-06 19:16:48 +00004233// # No <type>
David Bozier60b80d22017-01-31 15:56:36 +00004234// ::= TW <object name> # Thread-local wrapper
4235// ::= TH <object name> # Thread-local initialization
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004236// ::= GR <object name> _ # First temporary
4237// ::= GR <object name> <seq-id> _ # Subsequent temporaries
4238// extension ::= TC <first type> <number> _ <second type> # construction vtable for second-in-first
Rafael Espindolab940b662016-09-06 19:16:48 +00004239// extension ::= GR <object name> # reference temporary for object
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004240Node *Db::parseSpecialName() {
4241 switch (look()) {
4242 case 'T':
4243 switch (look(1)) {
4244 // TV <type> # virtual table
4245 case 'V': {
4246 First += 2;
4247 Node *Ty = parseType();
4248 if (Ty == nullptr)
4249 return nullptr;
4250 return make<SpecialName>("vtable for ", Ty);
4251 }
4252 // TT <type> # VTT structure (construction vtable index)
4253 case 'T': {
4254 First += 2;
4255 Node *Ty = parseType();
4256 if (Ty == nullptr)
4257 return nullptr;
4258 return make<SpecialName>("VTT for ", Ty);
4259 }
4260 // TI <type> # typeinfo structure
4261 case 'I': {
4262 First += 2;
4263 Node *Ty = parseType();
4264 if (Ty == nullptr)
4265 return nullptr;
4266 return make<SpecialName>("typeinfo for ", Ty);
4267 }
4268 // TS <type> # typeinfo name (null-terminated byte string)
4269 case 'S': {
4270 First += 2;
4271 Node *Ty = parseType();
4272 if (Ty == nullptr)
4273 return nullptr;
4274 return make<SpecialName>("typeinfo name for ", Ty);
4275 }
4276 // Tc <call-offset> <call-offset> <base encoding>
4277 case 'c': {
4278 First += 2;
4279 if (parseCallOffset() || parseCallOffset())
4280 return nullptr;
4281 Node *Encoding = parseEncoding();
4282 if (Encoding == nullptr)
4283 return nullptr;
4284 return make<SpecialName>("covariant return thunk to ", Encoding);
4285 }
4286 // extension ::= TC <first type> <number> _ <second type>
4287 // # construction vtable for second-in-first
4288 case 'C': {
4289 First += 2;
4290 Node *FirstType = parseType();
4291 if (FirstType == nullptr)
4292 return nullptr;
4293 if (parseNumber(true).empty() || !consumeIf('_'))
4294 return nullptr;
4295 Node *SecondType = parseType();
4296 if (SecondType == nullptr)
4297 return nullptr;
4298 return make<CtorVtableSpecialName>(SecondType, FirstType);
4299 }
4300 // TW <object name> # Thread-local wrapper
4301 case 'W': {
4302 First += 2;
4303 Node *Name = parseName();
4304 if (Name == nullptr)
4305 return nullptr;
4306 return make<SpecialName>("thread-local wrapper routine for ", Name);
4307 }
4308 // TH <object name> # Thread-local initialization
4309 case 'H': {
4310 First += 2;
4311 Node *Name = parseName();
4312 if (Name == nullptr)
4313 return nullptr;
4314 return make<SpecialName>("thread-local initialization routine for ", Name);
4315 }
4316 // T <call-offset> <base encoding>
4317 default: {
4318 ++First;
4319 bool IsVirt = look() == 'v';
4320 if (parseCallOffset())
4321 return nullptr;
4322 Node *BaseEncoding = parseEncoding();
4323 if (BaseEncoding == nullptr)
4324 return nullptr;
4325 if (IsVirt)
4326 return make<SpecialName>("virtual thunk to ", BaseEncoding);
4327 else
4328 return make<SpecialName>("non-virtual thunk to ", BaseEncoding);
4329 }
4330 }
4331 case 'G':
4332 switch (look(1)) {
4333 // GV <object name> # Guard variable for one-time initialization
4334 case 'V': {
4335 First += 2;
4336 Node *Name = parseName();
4337 if (Name == nullptr)
4338 return nullptr;
4339 return make<SpecialName>("guard variable for ", Name);
4340 }
4341 // GR <object name> # reference temporary for object
4342 // GR <object name> _ # First temporary
4343 // GR <object name> <seq-id> _ # Subsequent temporaries
4344 case 'R': {
4345 First += 2;
4346 Node *Name = parseName();
4347 if (Name == nullptr)
4348 return nullptr;
4349 size_t Count;
4350 bool ParsedSeqId = !parseSeqId(&Count);
4351 if (!consumeIf('_') && ParsedSeqId)
4352 return nullptr;
4353 return make<SpecialName>("reference temporary for ", Name);
4354 }
Rafael Espindolab940b662016-09-06 19:16:48 +00004355 }
4356 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004357 return nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00004358}
4359
4360// <encoding> ::= <function name> <bare-function-type>
4361// ::= <data name>
4362// ::= <special-name>
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004363Node *Db::parseEncoding() {
4364 // Always "tag" templates (insert them into Db::TemplateParams) unless we're
4365 // doing a second parse to resolve a forward template reference, in which case
4366 // we only tag templates if EncodingDepth > 1.
4367 // FIXME: This is kinda broken; it would be better to make a forward reference
4368 // and patch it all in one pass.
4369 SwapAndRestore<bool> SaveTagTemplates(TagTemplates,
4370 TagTemplates || EncodingDepth);
4371 SwapAndRestore<unsigned> SaveEncodingDepth(EncodingDepth, EncodingDepth + 1);
Rafael Espindolab940b662016-09-06 19:16:48 +00004372
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004373 if (look() == 'G' || look() == 'T')
4374 return parseSpecialName();
4375
4376 auto IsEndOfEncoding = [&] {
4377 // The set of chars that can potentially follow an <encoding> (none of which
4378 // can start a <type>). Enumerating these allows us to avoid speculative
4379 // parsing.
4380 return numLeft() == 0 || look() == 'E' || look() == '.' || look() == '_';
4381 };
4382
4383 NameState NameInfo;
4384 Node *Name = parseName(&NameInfo);
4385 if (Name == nullptr || IsEndOfEncoding())
4386 return Name;
4387
4388 TagTemplates = false;
4389
Erik Pilkingtonc7287862018-03-25 22:49:16 +00004390 Node *Attrs = nullptr;
4391 if (consumeIf("Ua9enable_ifI")) {
4392 size_t BeforeArgs = Names.size();
4393 while (!consumeIf('E')) {
4394 Node *Arg = parseTemplateArg();
4395 if (Arg == nullptr)
4396 return nullptr;
4397 Names.push_back(Arg);
4398 }
4399 Attrs = make<EnableIfAttr>(popTrailingNodeArray(BeforeArgs));
4400 }
4401
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004402 Node *ReturnType = nullptr;
4403 if (!NameInfo.CtorDtorConversion && NameInfo.EndsWithTemplateArgs) {
4404 ReturnType = parseType();
4405 if (ReturnType == nullptr)
4406 return nullptr;
4407 }
4408
4409 if (consumeIf('v'))
4410 return make<FunctionEncoding>(ReturnType, Name, NodeArray(),
Erik Pilkingtonc7287862018-03-25 22:49:16 +00004411 Attrs, NameInfo.CVQualifiers,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004412 NameInfo.ReferenceQualifier);
4413
4414 size_t ParamsBegin = Names.size();
4415 do {
4416 Node *Ty = parseType();
4417 if (Ty == nullptr)
4418 return nullptr;
4419 Names.push_back(Ty);
4420 } while (!IsEndOfEncoding());
4421
4422 return make<FunctionEncoding>(ReturnType, Name,
4423 popTrailingNodeArray(ParamsBegin),
Erik Pilkingtonc7287862018-03-25 22:49:16 +00004424 Attrs, NameInfo.CVQualifiers,
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004425 NameInfo.ReferenceQualifier);
4426}
4427
4428template <class Float>
4429struct FloatData;
4430
4431template <>
4432struct FloatData<float>
4433{
4434 static const size_t mangled_size = 8;
4435 static const size_t max_demangled_size = 24;
4436 static constexpr const char* spec = "%af";
4437};
4438
4439constexpr const char* FloatData<float>::spec;
4440
4441template <>
4442struct FloatData<double>
4443{
4444 static const size_t mangled_size = 16;
4445 static const size_t max_demangled_size = 32;
4446 static constexpr const char* spec = "%a";
4447};
4448
4449constexpr const char* FloatData<double>::spec;
4450
4451template <>
4452struct FloatData<long double>
4453{
4454#if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
4455 defined(__wasm__)
4456 static const size_t mangled_size = 32;
4457#elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
4458 static const size_t mangled_size = 16;
4459#else
4460 static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
4461#endif
4462 static const size_t max_demangled_size = 40;
4463 static constexpr const char *spec = "%LaL";
4464};
4465
4466constexpr const char *FloatData<long double>::spec;
4467
4468template <class Float> Node *Db::parseFloatingLiteral() {
4469 const size_t N = FloatData<Float>::mangled_size;
4470 if (numLeft() <= N)
4471 return nullptr;
4472 StringView Data(First, First + N);
4473 for (char C : Data)
4474 if (!std::isxdigit(C))
4475 return nullptr;
4476 First += N;
4477 if (!consumeIf('E'))
4478 return nullptr;
4479 return make<FloatExpr<Float>>(Data);
4480}
4481
4482// <seq-id> ::= <0-9A-Z>+
4483bool Db::parseSeqId(size_t *Out) {
4484 if (!(look() >= '0' && look() <= '9') &&
4485 !(look() >= 'A' && look() <= 'Z'))
4486 return true;
4487
4488 size_t Id = 0;
4489 while (true) {
4490 if (look() >= '0' && look() <= '9') {
4491 Id *= 36;
4492 Id += static_cast<size_t>(look() - '0');
4493 } else if (look() >= 'A' && look() <= 'Z') {
4494 Id *= 36;
4495 Id += static_cast<size_t>(look() - 'A') + 10;
4496 } else {
4497 *Out = Id;
4498 return false;
4499 }
4500 ++First;
4501 }
4502}
4503
4504// <substitution> ::= S <seq-id> _
4505// ::= S_
4506// <substitution> ::= Sa # ::std::allocator
4507// <substitution> ::= Sb # ::std::basic_string
4508// <substitution> ::= Ss # ::std::basic_string < char,
4509// ::std::char_traits<char>,
4510// ::std::allocator<char> >
4511// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
4512// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
4513// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
4514Node *Db::parseSubstitution() {
4515 if (!consumeIf('S'))
4516 return nullptr;
4517
4518 if (std::islower(look())) {
4519 Node *SpecialSub;
4520 switch (look()) {
4521 case 'a':
4522 ++First;
4523 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::allocator);
Rafael Espindolab940b662016-09-06 19:16:48 +00004524 break;
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004525 case 'b':
4526 ++First;
4527 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::basic_string);
4528 break;
4529 case 's':
4530 ++First;
4531 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::string);
4532 break;
4533 case 'i':
4534 ++First;
4535 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::istream);
4536 break;
4537 case 'o':
4538 ++First;
4539 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::ostream);
4540 break;
4541 case 'd':
4542 ++First;
4543 SpecialSub = make<SpecialSubstitution>(SpecialSubKind::iostream);
4544 break;
4545 default:
4546 return nullptr;
4547 }
4548 // Itanium C++ ABI 5.1.2: If a name that would use a built-in <substitution>
4549 // has ABI tags, the tags are appended to the substitution; the result is a
4550 // substitutable component.
4551 Node *WithTags = parseAbiTags(SpecialSub);
4552 if (WithTags != SpecialSub) {
4553 Subs.push_back(WithTags);
4554 SpecialSub = WithTags;
4555 }
4556 return SpecialSub;
4557 }
Rafael Espindolab940b662016-09-06 19:16:48 +00004558
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004559 // ::= S_
4560 if (consumeIf('_')) {
4561 if (Subs.empty())
4562 return nullptr;
4563 return Subs[0];
4564 }
4565
4566 // ::= S <seq-id> _
4567 size_t Index = 0;
4568 if (parseSeqId(&Index))
4569 return nullptr;
4570 ++Index;
4571 if (!consumeIf('_') || Index >= Subs.size())
4572 return nullptr;
4573 return Subs[Index];
4574}
4575
4576// <template-param> ::= T_ # first template parameter
4577// ::= T <parameter-2 non-negative number> _
4578Node *Db::parseTemplateParam() {
4579 if (!consumeIf('T'))
4580 return nullptr;
4581
4582 size_t Index = 0;
4583 if (!consumeIf('_')) {
4584 if (parsePositiveInteger(&Index))
4585 return nullptr;
4586 ++Index;
4587 if (!consumeIf('_'))
4588 return nullptr;
4589 }
4590
4591 // Itanium ABI 5.1.8: In a generic lambda, uses of auto in the parameter list
4592 // are mangled as the corresponding artificial template type parameter.
4593 if (ParsingLambdaParams)
4594 return make<NameType>("auto");
4595
4596 if (Index >= TemplateParams.size()) {
4597 FixForwardReferences = true;
4598 return make<NameType>("FORWARD_REFERENCE");
4599 }
4600 return TemplateParams[Index];
4601}
4602
4603// <template-arg> ::= <type> # type or template
4604// ::= X <expression> E # expression
4605// ::= <expr-primary> # simple expressions
4606// ::= J <template-arg>* E # argument pack
4607// ::= LZ <encoding> E # extension
4608Node *Db::parseTemplateArg() {
4609 switch (look()) {
4610 case 'X': {
4611 ++First;
4612 Node *Arg = parseExpr();
4613 if (Arg == nullptr || !consumeIf('E'))
4614 return nullptr;
4615 return Arg;
4616 }
4617 case 'J': {
4618 ++First;
4619 size_t ArgsBegin = Names.size();
4620 while (!consumeIf('E')) {
4621 Node *Arg = parseTemplateArg();
4622 if (Arg == nullptr)
4623 return nullptr;
4624 Names.push_back(Arg);
4625 }
4626 NodeArray Args = popTrailingNodeArray(ArgsBegin);
4627 return make<TemplateArgumentPack>(Args);
4628 }
4629 case 'L': {
4630 // ::= LZ <encoding> E # extension
4631 if (look(1) == 'Z') {
4632 First += 2;
4633 Node *Arg = parseEncoding();
4634 if (Arg == nullptr || !consumeIf('E'))
4635 return nullptr;
4636 return Arg;
4637 }
4638 // ::= <expr-primary> # simple expressions
4639 return parseExprPrimary();
4640 }
4641 default:
4642 return parseType();
4643 }
4644}
4645
4646// <template-args> ::= I <template-arg>* E
4647// extension, the abi says <template-arg>+
4648Node *Db::parseTemplateArgs() {
4649 if (!consumeIf('I'))
4650 return nullptr;
4651
4652 // <template-params> refer to the innermost <template-args>. Clear out any
4653 // outer args that we may have inserted into TemplateParams.
4654 if (TagTemplates)
4655 TemplateParams.clear();
4656
4657 size_t ArgsBegin = Names.size();
4658 while (!consumeIf('E')) {
4659 if (TagTemplates) {
4660 auto OldParams = std::move(TemplateParams);
4661 Node *Arg = parseTemplateArg();
4662 TemplateParams = std::move(OldParams);
4663 if (Arg == nullptr)
4664 return nullptr;
4665 Names.push_back(Arg);
4666 Node *TableEntry = Arg;
4667 if (Arg->getKind() == Node::KTemplateArgumentPack) {
4668 TableEntry = make<ParameterPack>(
4669 static_cast<TemplateArgumentPack*>(TableEntry)->getElements());
4670 }
4671 TemplateParams.push_back(TableEntry);
4672 } else {
4673 Node *Arg = parseTemplateArg();
4674 if (Arg == nullptr)
4675 return nullptr;
4676 Names.push_back(Arg);
4677 }
4678 }
4679 return make<TemplateArgs>(popTrailingNodeArray(ArgsBegin));
4680}
4681
4682// <discriminator> := _ <non-negative number> # when number < 10
4683// := __ <non-negative number> _ # when number >= 10
4684// extension := decimal-digit+ # at the end of string
4685
4686const char*
4687parse_discriminator(const char* first, const char* last)
4688{
4689 // parse but ignore discriminator
4690 if (first != last)
4691 {
4692 if (*first == '_')
4693 {
4694 const char* t1 = first+1;
4695 if (t1 != last)
4696 {
4697 if (std::isdigit(*t1))
4698 first = t1+1;
4699 else if (*t1 == '_')
4700 {
4701 for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4702 ;
4703 if (t1 != last && *t1 == '_')
4704 first = t1 + 1;
Rafael Espindolab940b662016-09-06 19:16:48 +00004705 }
Rafael Espindolab940b662016-09-06 19:16:48 +00004706 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004707 }
4708 else if (std::isdigit(*first))
4709 {
4710 const char* t1 = first+1;
4711 for (; t1 != last && std::isdigit(*t1); ++t1)
4712 ;
4713 if (t1 == last)
4714 first = last;
4715 }
Rafael Espindolab940b662016-09-06 19:16:48 +00004716 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004717 return first;
Rafael Espindolab940b662016-09-06 19:16:48 +00004718}
4719
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004720// <mangled-name> ::= _Z <encoding>
Rafael Espindolab940b662016-09-06 19:16:48 +00004721// ::= <type>
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004722// extension ::= ___Z <encoding> _block_invoke
4723// extension ::= ___Z <encoding> _block_invoke<decimal-digit>+
4724// extension ::= ___Z <encoding> _block_invoke_<decimal-digit>+
4725Node *Db::parse() {
4726 if (consumeIf("_Z")) {
4727 Node *Encoding = parseEncoding();
4728 if (Encoding == nullptr)
4729 return nullptr;
4730 if (look() == '.') {
4731 Encoding = make<DotSuffix>(Encoding, StringView(First, Last));
4732 First = Last;
4733 }
4734 if (numLeft() != 0)
4735 return nullptr;
4736 return Encoding;
4737 }
Rafael Espindolab940b662016-09-06 19:16:48 +00004738
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004739 if (consumeIf("___Z")) {
4740 Node *Encoding = parseEncoding();
4741 if (Encoding == nullptr || !consumeIf("_block_invoke"))
4742 return nullptr;
4743 bool RequireNumber = consumeIf('_');
4744 if (parseNumber().empty() && RequireNumber)
4745 return nullptr;
4746 if (numLeft() != 0)
4747 return nullptr;
4748 return make<SpecialName>("invocation function for block in ", Encoding);
Rafael Espindolab940b662016-09-06 19:16:48 +00004749 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004750
4751 Node *Ty = parseType();
4752 if (numLeft() != 0)
4753 return nullptr;
4754 return Ty;
Rafael Espindolab940b662016-09-06 19:16:48 +00004755}
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004756} // unnamed namespace
Rafael Espindolab940b662016-09-06 19:16:48 +00004757
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004758enum {
4759 unknown_error = -4,
4760 invalid_args = -3,
4761 invalid_mangled_name = -2,
4762 memory_alloc_failure = -1,
4763 success = 0,
Rafael Espindolab940b662016-09-06 19:16:48 +00004764};
4765
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004766char *llvm::itaniumDemangle(const char *MangledName, char *Buf,
4767 size_t *N, int *Status) {
4768 if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) {
4769 if (Status)
4770 *Status = invalid_args;
Rafael Espindolab940b662016-09-06 19:16:48 +00004771 return nullptr;
4772 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004773
4774 size_t BufSize = Buf != nullptr ? *N : 0;
4775 int InternalStatus = success;
4776 size_t MangledNameLength = std::strlen(MangledName);
4777
4778 Db Parser(MangledName, MangledName + MangledNameLength);
4779 Node *AST = Parser.parse();
4780
4781 if (AST == nullptr)
4782 InternalStatus = invalid_mangled_name;
4783
4784 if (InternalStatus == success && Parser.FixForwardReferences &&
4785 !Parser.TemplateParams.empty()) {
4786 Parser.FixForwardReferences = false;
4787 Parser.TagTemplates = false;
4788 Parser.Names.clear();
4789 Parser.Subs.clear();
4790 Parser.First = MangledName;
4791 Parser.Last = MangledName + MangledNameLength;
4792 AST = Parser.parse();
4793 if (AST == nullptr || Parser.FixForwardReferences)
4794 InternalStatus = invalid_mangled_name;
Rafael Espindolab940b662016-09-06 19:16:48 +00004795 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004796
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004797 if (InternalStatus == success) {
4798 if (Buf == nullptr) {
4799 BufSize = 1024;
4800 Buf = static_cast<char*>(std::malloc(BufSize));
Rafael Espindolab940b662016-09-06 19:16:48 +00004801 }
Erik Pilkingtonbb7feae2018-03-19 15:18:23 +00004802
4803 if (Buf) {
4804 OutputStream Stream(Buf, BufSize);
4805 AST->print(Stream);
4806 Stream += '\0';
4807 if (N != nullptr)
4808 *N = Stream.getCurrentPosition();
4809 Buf = Stream.getBuffer();
4810 } else
4811 InternalStatus = memory_alloc_failure;
4812 }
4813
4814 if (Status)
4815 *Status = InternalStatus;
4816 return InternalStatus == success ? Buf : nullptr;
Rafael Espindolab940b662016-09-06 19:16:48 +00004817}