LLVM 23.0.0git
MicrosoftDemangleNodes.h
Go to the documentation of this file.
1//===- MicrosoftDemangleNodes.h ---------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the AST nodes used in the MSVC demangler.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
14#define LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
15
16#include "DemangleConfig.h"
17#include <array>
18#include <cstdint>
19#include <string>
20#include <string_view>
21
22namespace llvm {
24class OutputBuffer;
25}
26}
27
28using llvm::itanium_demangle::OutputBuffer;
29
30namespace llvm {
31namespace ms_demangle {
32
33// Storage classes
35 Q_None = 0,
36 Q_Const = 1 << 0,
37 Q_Volatile = 1 << 1,
38 Q_Far = 1 << 2,
39 Q_Huge = 1 << 3,
40 Q_Unaligned = 1 << 4,
41 Q_Restrict = 1 << 5,
42 Q_Pointer64 = 1 << 6
43};
44
53
56
57// Calling conventions
72
74
86
87// Types
113
120
123 New, // ?2 # operator new
124 Delete, // ?3 # operator delete
125 Assign, // ?4 # operator=
126 RightShift, // ?5 # operator>>
127 LeftShift, // ?6 # operator<<
128 LogicalNot, // ?7 # operator!
129 Equals, // ?8 # operator==
130 NotEquals, // ?9 # operator!=
131 ArraySubscript, // ?A # operator[]
132 Pointer, // ?C # operator->
133 Dereference, // ?D # operator*
134 Increment, // ?E # operator++
135 Decrement, // ?F # operator--
136 Minus, // ?G # operator-
137 Plus, // ?H # operator+
138 BitwiseAnd, // ?I # operator&
139 MemberPointer, // ?J # operator->*
140 Divide, // ?K # operator/
141 Modulus, // ?L # operator%
142 LessThan, // ?M operator<
143 LessThanEqual, // ?N operator<=
144 GreaterThan, // ?O operator>
145 GreaterThanEqual, // ?P operator>=
146 Comma, // ?Q operator,
147 Parens, // ?R operator()
148 BitwiseNot, // ?S operator~
149 BitwiseXor, // ?T operator^
150 BitwiseOr, // ?U operator|
151 LogicalAnd, // ?V operator&&
152 LogicalOr, // ?W operator||
153 TimesEqual, // ?X operator*=
154 PlusEqual, // ?Y operator+=
155 MinusEqual, // ?Z operator-=
156 DivEqual, // ?_0 operator/=
157 ModEqual, // ?_1 operator%=
158 RshEqual, // ?_2 operator>>=
159 LshEqual, // ?_3 operator<<=
160 BitwiseAndEqual, // ?_4 operator&=
161 BitwiseOrEqual, // ?_5 operator|=
162 BitwiseXorEqual, // ?_6 operator^=
163 VbaseDtor, // ?_D # vbase destructor
164 VecDelDtor, // ?_E # vector deleting destructor
165 DefaultCtorClosure, // ?_F # default constructor closure
166 ScalarDelDtor, // ?_G # scalar deleting destructor
167 VecCtorIter, // ?_H # vector constructor iterator
168 VecDtorIter, // ?_I # vector destructor iterator
169 VecVbaseCtorIter, // ?_J # vector vbase constructor iterator
170 VdispMap, // ?_K # virtual displacement map
171 EHVecCtorIter, // ?_L # eh vector constructor iterator
172 EHVecDtorIter, // ?_M # eh vector destructor iterator
173 EHVecVbaseCtorIter, // ?_N # eh vector vbase constructor iterator
174 CopyCtorClosure, // ?_O # copy constructor closure
175 LocalVftableCtorClosure, // ?_T # local vftable constructor closure
176 ArrayNew, // ?_U operator new[]
177 ArrayDelete, // ?_V operator delete[]
178 ManVectorCtorIter, // ?__A managed vector ctor iterator
179 ManVectorDtorIter, // ?__B managed vector dtor iterator
180 EHVectorCopyCtorIter, // ?__C EH vector copy ctor iterator
181 EHVectorVbaseCopyCtorIter, // ?__D EH vector vbase copy ctor iterator
182 VectorCopyCtorIter, // ?__G vector copy constructor iterator
183 VectorVbaseCopyCtorIter, // ?__H vector vbase copy constructor iterator
184 ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy constructor
185 CoAwait, // ?__L operator co_await
186 Spaceship, // ?__M operator<=>
188};
189
210
211// Function classes
214 FC_Public = 1 << 0,
215 FC_Protected = 1 << 1,
216 FC_Private = 1 << 2,
217 FC_Global = 1 << 3,
218 FC_Static = 1 << 4,
219 FC_Virtual = 1 << 5,
220 FC_Far = 1 << 6,
221 FC_ExternC = 1 << 7,
226};
227
228enum class TagKind { Class, Struct, Union, Enum };
229
278
279struct Node {
280 explicit Node(NodeKind K) : Kind(K) {}
281 virtual ~Node() = default;
282
283 NodeKind kind() const { return Kind; }
284
285 virtual void output(OutputBuffer &OB, OutputFlags Flags) const = 0;
286
287 DEMANGLE_ABI std::string toString(OutputFlags Flags = OF_Default) const;
288
289private:
290 NodeKind Kind;
291};
292
293struct TypeNode;
294struct PrimitiveTypeNode;
296struct IdentifierNode;
303struct ThunkSignatureNode;
304struct PointerTypeNode;
305struct ArrayTypeNode;
306struct TagTypeNode;
307struct NodeArrayNode;
308struct QualifiedNameNode;
311struct IntegerLiteralNode;
314struct SymbolNode;
315struct FunctionSymbolNode;
316struct VariableSymbolNode;
319
320struct TypeNode : public Node {
321 explicit TypeNode(NodeKind K) : Node(K) {}
322
323 virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const = 0;
324 virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const = 0;
325
326 void output(OutputBuffer &OB, OutputFlags Flags) const override {
327 outputPre(OB, Flags);
328 outputPost(OB, Flags);
329 }
330
331 static bool classof(const Node *N) {
332 return N->kind() >= NodeKind::TypeStart && N->kind() <= NodeKind::TypeEnd;
333 }
334
336};
337
341
342 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
343 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override {}
344
345 static bool classof(const Node *N) {
346 return N->kind() == NodeKind::PrimitiveType;
347 }
348
350};
351
355
356 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
357 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
358
359 static bool classof(const Node *N) {
360 return N->kind() >= NodeKind::FunctionSignature &&
362 }
363
364 // Valid if this FunctionTypeNode is the Pointee of a PointerType or
365 // MemberPointerType.
367
368 // The function's calling convention.
370
371 // Function flags (global, public, etc)
373
375
376 // The return type of the function.
378
379 // True if this is a C-style ... varargs function.
380 bool IsVariadic = false;
381
382 // Function parameters
384
385 // True if the function type is noexcept.
386 bool IsNoexcept = false;
387};
388
389struct IdentifierNode : public Node {
390 explicit IdentifierNode(NodeKind K) : Node(K) {}
391
392 static bool classof(const Node *N) {
393 return N->kind() >= NodeKind::IdentifierStart &&
394 N->kind() <= NodeKind::IdentifierEnd;
395 }
396
398
399protected:
401 OutputFlags Flags) const;
402};
403
406
407 void output(OutputBuffer &OB, OutputFlags Flags) const override;
408
409 static bool classof(const Node *N) {
410 return N->kind() == NodeKind::VcallThunkIdentifier;
411 }
412
414};
415
419
420 void output(OutputBuffer &OB, OutputFlags Flags) const override;
421
422 static bool classof(const Node *N) {
423 return N->kind() == NodeKind::DynamicStructorIdentifier;
424 }
425
428 bool IsDestructor = false;
429};
430
433
434 void output(OutputBuffer &OB, OutputFlags Flags) const override;
435
436 static bool classof(const Node *N) {
437 return N->kind() == NodeKind::NamedIdentifier;
438 }
439
440 std::string_view Name;
441};
442
456
460
461 void output(OutputBuffer &OB, OutputFlags Flags) const override;
462
463 static bool classof(const Node *N) {
464 return N->kind() == NodeKind::LiteralOperatorIdentifier;
465 }
466
467 std::string_view Name;
468};
469
473
474 void output(OutputBuffer &OB, OutputFlags Flags) const override;
475
476 static bool classof(const Node *N) {
477 return N->kind() == NodeKind::LocalStaticGuardIdentifier;
478 }
479
480 bool IsThread = false;
482};
483
487
488 void output(OutputBuffer &OB, OutputFlags Flags) const override;
489
490 static bool classof(const Node *N) {
492 }
493
494 // The type that this operator converts too.
496};
497
503
504 void output(OutputBuffer &OB, OutputFlags Flags) const override;
505
506 static bool classof(const Node *N) {
507 return N->kind() == NodeKind::StructorIdentifier;
508 }
509
510 // The name of the class that this is a structor of.
512 bool IsDestructor = false;
513};
514
517
518 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
519 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
520
521 static bool classof(const Node *N) {
522 return N->kind() == NodeKind::ThunkSignature;
523 }
524
527 int32_t VBPtrOffset = 0;
528 int32_t VBOffsetOffset = 0;
529 int32_t VtordispOffset = 0;
530 };
531
533};
534
537 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
538 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
539
540 static bool classof(const Node *N) {
541 return N->kind() == NodeKind::PointerType;
542 }
543
544 // Is this a pointer, reference, or rvalue-reference?
546
547 // If this is a member pointer, this is the class that the member is in.
549
551
552 // Represents a type X in "a pointer to X", "a reference to X", or
553 // "rvalue-reference to X"
554 TypeNode *Pointee = nullptr;
555};
556
559
560 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
561 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
562
563 static bool classof(const Node *N) { return N->kind() == NodeKind::TagType; }
564
567};
568
571
572 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
573 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
574
575 void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
576 void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
577
578 static bool classof(const Node *N) {
579 return N->kind() == NodeKind::ArrayType;
580 }
581
582 // A list of array dimensions. e.g. [3,4,5] in `int Foo[3][4][5]`
584
585 // The type of array element.
587};
588
589struct IntrinsicNode : public TypeNode {
591 void output(OutputBuffer &OB, OutputFlags Flags) const override {}
592
593 static bool classof(const Node *N) {
594 return N->kind() == NodeKind::IntrinsicType;
595 }
596};
597
600
601 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
602 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
603
604 static bool classof(const Node *N) { return N->kind() == NodeKind::Custom; }
605
607};
608
611
612 void output(OutputBuffer &OB, OutputFlags Flags) const override;
613
614 void output(OutputBuffer &OB, OutputFlags Flags,
615 std::string_view Separator) const;
616
617 static bool classof(const Node *N) {
618 return N->kind() == NodeKind::NodeArray;
619 }
620
621 Node **Nodes = nullptr;
622 size_t Count = 0;
623};
624
627
628 void output(OutputBuffer &OB, OutputFlags Flags) const override;
629
630 static bool classof(const Node *N) {
631 return N->kind() == NodeKind::QualifiedName;
632 }
633
635
637 Node *LastComponent = Components->Nodes[Components->Count - 1];
638 return static_cast<IdentifierNode *>(LastComponent);
639 }
640};
641
645
646 void output(OutputBuffer &OB, OutputFlags Flags) const override;
647
648 static bool classof(const Node *N) {
649 return N->kind() == NodeKind::TemplateParameterReference;
650 }
651
652 SymbolNode *Symbol = nullptr;
653
655 std::array<int64_t, 3> ThunkOffsets;
657 bool IsMemberPointer = false;
658};
659
664
665 void output(OutputBuffer &OB, OutputFlags Flags) const override;
666
667 static bool classof(const Node *N) {
668 return N->kind() == NodeKind::IntegerLiteral;
669 }
670
672 bool IsNegative = false;
673};
674
678
679 void output(OutputBuffer &OB, OutputFlags Flags) const override;
680
681 static bool classof(const Node *N) {
682 return N->kind() == NodeKind::RttiBaseClassDescriptor;
683 }
684
686 int32_t VBPtrOffset = 0;
689};
690
691struct DEMANGLE_ABI SymbolNode : public Node {
692 explicit SymbolNode(NodeKind K) : Node(K) {}
693 void output(OutputBuffer &OB, OutputFlags Flags) const override;
694
695 static bool classof(const Node *N) {
696 return N->kind() >= NodeKind::SymbolStart &&
697 N->kind() <= NodeKind::SymbolEnd;
698 }
699
701};
702
706
707 void output(OutputBuffer &OB, OutputFlags Flags) const override;
708
709 static bool classof(const Node *N) {
710 return N->kind() == NodeKind::SpecialTableSymbol;
711 }
712
715};
716
720
721 void output(OutputBuffer &OB, OutputFlags Flags) const override;
722
723 static bool classof(const Node *N) {
724 return N->kind() == NodeKind::LocalStaticGuardVariable;
725 }
726
727 bool IsVisible = false;
728};
729
732
733 void output(OutputBuffer &OB, OutputFlags Flags) const override;
734
735 static bool classof(const Node *N) {
736 return N->kind() == NodeKind::EncodedStringLiteral;
737 }
738
739 std::string_view DecodedString;
740 bool IsTruncated = false;
742};
743
746
747 void output(OutputBuffer &OB, OutputFlags Flags) const override;
748
749 static bool classof(const Node *N) {
750 return N->kind() == NodeKind::VariableSymbol;
751 }
752
753 virtual bool shouldOutputName(OutputFlags Flags) const { return true; }
754
756 TypeNode *Type = nullptr;
757};
758
761
762 bool shouldOutputName(OutputFlags Flags) const override {
763 return !(Flags & OF_NoDecorativeRTTITypeDescriptor);
764 }
765};
766
769
770 void output(OutputBuffer &OB, OutputFlags Flags) const override;
771
772 static bool classof(const Node *N) {
773 return N->kind() == NodeKind::FunctionSymbol;
774 }
775
777};
778
781
782 // __ptrauth takes three arguments:
783 // - key
784 // - isAddressDiscriminated
785 // - extra discriminator
786 static constexpr unsigned NumArgs = 3;
787 typedef std::array<uint64_t, NumArgs> ArgArray;
788
789 void output(OutputBuffer &OB, OutputFlags Flags) const override;
790
791 static bool classof(const Node *N) {
792 return N->kind() == NodeKind::PointerAuthQualifier;
793 }
794
795 // List of arguments.
797};
798
799} // namespace ms_demangle
800} // namespace llvm
801
802#endif
#define DEMANGLE_ABI
DEMANGLE_ABI is the export/visibility macro used to mark symbols declared in llvm/Demangle as exporte...
This is an optimization pass for GlobalISel generic memory operations.
#define N
DEMANGLE_ABI void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const
IntegerLiteralNode(uint64_t Value, bool IsNegative)
IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator)
void output(OutputBuffer &OB, OutputFlags Flags) const override
virtual void output(OutputBuffer &OB, OutputFlags Flags) const =0
virtual ~Node()=default
DEMANGLE_ABI std::string toString(OutputFlags Flags=OF_Default) const
void output(OutputBuffer &OB, OutputFlags Flags) const override
PointerAuthQualifierNode * PointerAuthQualifier
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
static bool classof(const Node *N)
static bool classof(const Node *N)
void output(OutputBuffer &OB, OutputFlags Flags) const override
virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const =0
virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const =0
static bool classof(const Node *N)
bool shouldOutputName(OutputFlags Flags) const override
virtual bool shouldOutputName(OutputFlags Flags) const