LLVM: lib/Demangle/MicrosoftDemangleNodes.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
15#include
16#include
17
18using namespace llvm;
20
21#define OUTPUT_ENUM_CLASS_VALUE(Enum, Value, Desc) \
22 case Enum::Value: \
23 OB << Desc; \
24 break;
25
26
28 if (OB.empty())
29 return;
30
31 char C = OB.back();
32 if (std::isalnum(C) || C == '>')
33 OB << " ";
34}
35
37 switch (Q) {
39 OB << "const";
40 break;
42 OB << "volatile";
43 break;
45 OB << "__restrict";
46 break;
47 default:
48 break;
49 }
50}
51
54 if (!(Q & Mask))
55 return NeedSpace;
56
57 if (NeedSpace)
58 OB << " ";
59
61 return true;
62}
63
65 bool SpaceAfter) {
67 return;
68
69 size_t Pos1 = OB.getCurrentPosition();
73 size_t Pos2 = OB.getCurrentPosition();
74 if (SpaceAfter && Pos2 > Pos1)
75 OB << " ";
76}
77
80
81 switch (CC) {
82 case CallingConv::Cdecl:
83 OB << "__cdecl";
84 break;
85 case CallingConv::Fastcall:
86 OB << "__fastcall";
87 break;
88 case CallingConv::Pascal:
89 OB << "__pascal";
90 break;
91 case CallingConv::Regcall:
92 OB << "__regcall";
93 break;
94 case CallingConv::Stdcall:
95 OB << "__stdcall";
96 break;
97 case CallingConv::Thiscall:
98 OB << "__thiscall";
99 break;
100 case CallingConv::Eabi:
101 OB << "__eabi";
102 break;
103 case CallingConv::Vectorcall:
104 OB << "__vectorcall";
105 break;
106 case CallingConv::Clrcall:
107 OB << "__clrcall";
108 break;
110 OB << "__attribute__((__swiftcall__)) ";
111 break;
112 case CallingConv::SwiftAsync:
113 OB << "__attribute__((__swiftasynccall__)) ";
114 break;
115 default:
116 break;
117 }
118}
119
122 this->output(OB, Flags);
123 std::string_view SV = OB;
124 std::string Owned(SV.begin(), SV.end());
125 std::free(OB.getBuffer());
126 return Owned;
127}
128
157
159 output(OB, Flags, ", ");
160}
161
163 std::string_view Separator) const {
165 return;
167 Nodes[0]->output(OB, Flags);
168 for (size_t I = 1; I < Count; ++I) {
169 OB << Separator;
170 Nodes[I]->output(OB, Flags);
171 }
172}
173
176 switch (Char) {
178 OB << "L\"";
179 break;
181 OB << "\"";
182 break;
184 OB << "u\"";
185 break;
187 OB << "U\"";
188 break;
189 }
192 OB << "...";
193}
194
200
204 OB << "{";
206 OB << "&";
207
209 Symbol->output(OB, Flags);
211 OB << ", ";
212 }
213
218 }
220 OB << "}";
221}
222
226 return;
227 OB << "<";
229 OB << ">";
230}
231
235 OB << "`dynamic atexit destructor for ";
236 else
237 OB << "`dynamic initializer for ";
238
240 OB << "`";
242 OB << "''";
243 } else {
244 OB << "'";
245 Name->output(OB, Flags);
246 OB << "''";
247 }
248}
249
254
267 "operator[]");
276 "operator->*");
283 "operator>=");
299 "operator&=");
301 "operator|=");
303 "operator^=");
306 "`vector deleting dtor'");
308 "`default ctor closure'");
310 "`scalar deleting dtor'");
312 "`vector ctor iterator'");
314 "`vector dtor iterator'");
316 "`vector vbase ctor iterator'");
318 "`virtual displacement map'");
320 "`eh vector ctor iterator'");
322 "`eh vector dtor iterator'");
324 "`eh vector vbase ctor iterator'");
326 "`copy ctor closure'");
328 "`local vftable ctor closure'");
331 "operator delete[]");
333 "`managed vector ctor iterator'");
335 "`managed vector dtor iterator'");
337 "`EH vector copy ctor iterator'");
339 "`EH vector vbase copy ctor iterator'");
341 "`vector copy ctor iterator'");
343 "`vector vbase copy constructor iterator'");
345 "`managed vector vbase copy constructor iterator'");
347 "operator co_await");
351 break;
352 }
354}
355
359 OB << "`local static thread guard'";
360 else
361 OB << "`local static guard'";
364}
365
368 OB << "operator";
370 OB << " ";
372}
373
376 OB << "~";
377 Class->output(OB, Flags);
379}
380
383 OB << "operator \"\"" << Name;
385}
386
391 OB << "public: ";
393 OB << "protected: ";
395 OB << "private: ";
396 }
397
401 OB << "static ";
402 }
404 OB << "virtual ";
405
407 OB << "extern \"C\" ";
408 }
409
412 OB << " ";
413 }
414
417}
418
422 OB << "(";
424 Params->output(OB, Flags);
425 else
426 OB << "void";
427
429 if (OB.back() != '(')
430 OB << ", ";
431 OB << "...";
432 }
433 OB << ")";
434 }
435
437 OB << " const";
439 OB << " volatile";
441 OB << " __restrict";
443 OB << " __unaligned";
444
446 OB << " noexcept";
447
449 OB << " &";
451 OB << " &&";
452
455}
456
458 OB << "[thunk]: ";
459
461}
462
465 OB << "`adjustor{" << ThisAdjust.StaticOffset << "}'";
468 OB << "`vtordispex{" << ThisAdjust.VBPtrOffset << ", "
470 << ", " << ThisAdjust.StaticOffset << "}'";
471 } else {
472 OB << "`vtordisp{" << ThisAdjust.VtordispOffset << ", "
474 }
475 }
476
478}
479
482
483
487 } else
488 Pointee->outputPre(OB, Flags);
489
491
493 OB << "__unaligned ";
494
496 OB << "(";
498 OB << "(";
502 OB << " ";
503 }
504
507 OB << "::";
508 }
509
512 OB << "*";
513 break;
515 OB << "&";
516 break;
518 OB << "&&";
519 break;
520 default:
522 }
524
527}
528
532 OB << ")";
533
534 Pointee->outputPost(OB, Flags);
535}
536
539 switch (Tag) {
544 }
545 OB << " ";
546 }
549}
550
552
557
562 if (ILN->Value != 0)
563 ILN->output(OB, Flags);
564}
565
569 return;
570
573 OB << "][";
575 }
576}
577
579 OB << "[";
581 OB << "]";
582
584}
585
587 Name->output(OB, Flags);
588}
589
593 Name->output(OB, Flags);
594 Signature->outputPost(OB, Flags);
595}
596
599 OB << "__ptrauth(";
601 OB << ")";
602}
603
605 const char *AccessSpec = nullptr;
606 bool IsStatic = true;
607 switch (SC) {
609 AccessSpec = "private";
610 break;
612 AccessSpec = "public";
613 break;
615 AccessSpec = "protected";
616 break;
617 default:
618 IsStatic = false;
619 break;
620 }
622 OB << AccessSpec << ": ";
624 OB << "static ";
625
627 Type->outputPre(OB, Flags);
629 }
630 Name->output(OB, Flags);
632 Type->outputPost(OB, Flags);
633}
634
639
643
646 OB << "`RTTI Base Class Descriptor at (";
648 << this->Flags;
649 OB << ")'";
650}
651
654 Name->output(OB, Flags);
655}
656
661
664 Name->output(OB, Flags);
666 OB << "{for `";
668 OB << "'}";
669 }
670}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void outputCallingConvention(OutputBuffer &OB, CallingConv CC)
Definition MicrosoftDemangleNodes.cpp:78
#define OUTPUT_ENUM_CLASS_VALUE(Enum, Value, Desc)
Definition MicrosoftDemangleNodes.cpp:21
static void outputSingleQualifier(OutputBuffer &OB, Qualifiers Q)
Definition MicrosoftDemangleNodes.cpp:36
static bool outputQualifierIfPresent(OutputBuffer &OB, Qualifiers Q, Qualifiers Mask, bool NeedSpace)
Definition MicrosoftDemangleNodes.cpp:52
static void outputQualifiers(OutputBuffer &OB, Qualifiers Q, bool SpaceBefore, bool SpaceAfter)
Definition MicrosoftDemangleNodes.cpp:64
static void outputSpaceIfNecessary(OutputBuffer &OB)
Definition MicrosoftDemangleNodes.cpp:27
CallingConv Namespace - This namespace contains an enum with a value for the well-known calling conve...
@ Swift
Calling convention for Swift.
@ C
The default llvm calling convention, compatible with C.
@ ManVectorVbaseCopyCtorIter
@ EHVectorVbaseCopyCtorIter
@ LocalVftableCtorClosure
@ VectorVbaseCopyCtorIter
This is an optimization pass for GlobalISel generic memory operations.
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:578
void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const
Definition MicrosoftDemangleNodes.cpp:558
NodeArrayNode * Dimensions
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:553
void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const
Definition MicrosoftDemangleNodes.cpp:566
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:366
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:638
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:635
IdentifierNode * Identifier
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:232
VariableSymbolNode * Variable
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:174
std::string_view DecodedString
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:387
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:419
FunctionRefQualifier RefQualifier
CallingConv CallConvention
FunctionSignatureNode * Signature
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:590
NodeArrayNode * TemplateParams
DEMANGLE_ABI void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const
Definition MicrosoftDemangleNodes.cpp:223
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:195
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:255
IntrinsicFunctionKind Operator
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:381
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:356
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:652
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:250
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:158
virtual void output(OutputBuffer &OB, OutputFlags Flags) const =0
DEMANGLE_ABI std::string toString(OutputFlags Flags=OF_Default) const
Definition MicrosoftDemangleNodes.cpp:120
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:597
NodeArrayNode * Components
QualifiedNameNode * ClassParent
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:529
PointerAuthQualifierNode * PointerAuthQualifier
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:480
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:129
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:640
NodeArrayNode * Components
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:644
NodeArrayNode * TargetNames
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:662
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:374
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:586
QualifiedNameNode * QualifiedName
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:551
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:537
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:201
std::array< int64_t, 3 > ThunkOffsets
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:463
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:457
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:604
void output(OutputBuffer &OB, OutputFlags Flags) const override
Definition MicrosoftDemangleNodes.cpp:657