LLVM 24.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 void outputPreSignature(OutputBuffer &OB, OutputFlags Flags) const;
360
361 static bool classof(const Node *N) {
362 return N->kind() >= NodeKind::FunctionSignature &&
364 }
365
366 // Valid if this FunctionTypeNode is the Pointee of a PointerType or
367 // MemberPointerType.
369
370 // The function's calling convention.
372
373 // Function flags (global, public, etc)
375
377
378 // The return type of the function.
380
381 // True if this is a C-style ... varargs function.
382 bool IsVariadic = false;
383
384 // Function parameters
386
387 // True if the function type is noexcept.
388 bool IsNoexcept = false;
389};
390
391struct IdentifierNode : public Node {
393
394 static bool classof(const Node *N) {
395 return N->kind() >= NodeKind::IdentifierStart &&
396 N->kind() <= NodeKind::IdentifierEnd;
397 }
398
400
401protected:
403 OutputFlags Flags) const;
404};
405
408
409 void output(OutputBuffer &OB, OutputFlags Flags) const override;
410
411 static bool classof(const Node *N) {
412 return N->kind() == NodeKind::VcallThunkIdentifier;
413 }
414
416};
417
421
422 void output(OutputBuffer &OB, OutputFlags Flags) const override;
423
424 static bool classof(const Node *N) {
425 return N->kind() == NodeKind::DynamicStructorIdentifier;
426 }
427
430 bool IsDestructor = false;
431};
432
435
436 void output(OutputBuffer &OB, OutputFlags Flags) const override;
437
438 static bool classof(const Node *N) {
439 return N->kind() == NodeKind::NamedIdentifier;
440 }
441
442 std::string_view Name;
443};
444
458
462
463 void output(OutputBuffer &OB, OutputFlags Flags) const override;
464
465 static bool classof(const Node *N) {
466 return N->kind() == NodeKind::LiteralOperatorIdentifier;
467 }
468
469 std::string_view Name;
470};
471
475
476 void output(OutputBuffer &OB, OutputFlags Flags) const override;
477
478 static bool classof(const Node *N) {
479 return N->kind() == NodeKind::LocalStaticGuardIdentifier;
480 }
481
482 bool IsThread = false;
484};
485
489
490 void output(OutputBuffer &OB, OutputFlags Flags) const override;
491
492 static bool classof(const Node *N) {
494 }
495
496 // The type that this operator converts too.
498};
499
505
506 void output(OutputBuffer &OB, OutputFlags Flags) const override;
507
508 static bool classof(const Node *N) {
509 return N->kind() == NodeKind::StructorIdentifier;
510 }
511
512 // The name of the class that this is a structor of.
514 bool IsDestructor = false;
515};
516
519
520 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
521 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
522
523 static bool classof(const Node *N) {
524 return N->kind() == NodeKind::ThunkSignature;
525 }
526
529 int32_t VBPtrOffset = 0;
530 int32_t VBOffsetOffset = 0;
531 int32_t VtordispOffset = 0;
532 };
533
535};
536
539 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
540 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
541
542 static bool classof(const Node *N) {
543 return N->kind() == NodeKind::PointerType;
544 }
545
546 // Is this a pointer, reference, or rvalue-reference?
548
549 // If this is a member pointer, this is the class that the member is in.
551
553
554 // Represents a type X in "a pointer to X", "a reference to X", or
555 // "rvalue-reference to X"
556 TypeNode *Pointee = nullptr;
557};
558
561
562 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
563 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
564
565 static bool classof(const Node *N) { return N->kind() == NodeKind::TagType; }
566
569};
570
573
574 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
575 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
576
577 void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
578 void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
579
580 static bool classof(const Node *N) {
581 return N->kind() == NodeKind::ArrayType;
582 }
583
584 // A list of array dimensions. e.g. [3,4,5] in `int Foo[3][4][5]`
586
587 // The type of array element.
589};
590
591struct IntrinsicNode : public TypeNode {
593 void output(OutputBuffer &OB, OutputFlags Flags) const override {}
594
595 static bool classof(const Node *N) {
596 return N->kind() == NodeKind::IntrinsicType;
597 }
598};
599
602
603 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
604 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
605
606 static bool classof(const Node *N) { return N->kind() == NodeKind::Custom; }
607
609};
610
613
614 void output(OutputBuffer &OB, OutputFlags Flags) const override;
615
616 void output(OutputBuffer &OB, OutputFlags Flags,
617 std::string_view Separator) const;
618
619 static bool classof(const Node *N) {
620 return N->kind() == NodeKind::NodeArray;
621 }
622
623 Node **Nodes = nullptr;
624 size_t Count = 0;
625};
626
629
630 void output(OutputBuffer &OB, OutputFlags Flags) const override;
631
632 static bool classof(const Node *N) {
633 return N->kind() == NodeKind::QualifiedName;
634 }
635
637
639 Node *LastComponent = Components->Nodes[Components->Count - 1];
640 return static_cast<IdentifierNode *>(LastComponent);
641 }
642};
643
647
648 void output(OutputBuffer &OB, OutputFlags Flags) const override;
649
650 static bool classof(const Node *N) {
651 return N->kind() == NodeKind::TemplateParameterReference;
652 }
653
654 SymbolNode *Symbol = nullptr;
655
657 std::array<int64_t, 3> ThunkOffsets;
659 bool IsMemberPointer = false;
660};
661
666
667 void output(OutputBuffer &OB, OutputFlags Flags) const override;
668
669 static bool classof(const Node *N) {
670 return N->kind() == NodeKind::IntegerLiteral;
671 }
672
674 bool IsNegative = false;
675};
676
680
681 void output(OutputBuffer &OB, OutputFlags Flags) const override;
682
683 static bool classof(const Node *N) {
684 return N->kind() == NodeKind::RttiBaseClassDescriptor;
685 }
686
688 int32_t VBPtrOffset = 0;
691};
692
693struct DEMANGLE_ABI SymbolNode : public Node {
694 explicit SymbolNode(NodeKind K) : Node(K) {}
695 void output(OutputBuffer &OB, OutputFlags Flags) const override;
696
697 static bool classof(const Node *N) {
698 return N->kind() >= NodeKind::SymbolStart &&
699 N->kind() <= NodeKind::SymbolEnd;
700 }
701
703};
704
708
709 void output(OutputBuffer &OB, OutputFlags Flags) const override;
710
711 static bool classof(const Node *N) {
712 return N->kind() == NodeKind::SpecialTableSymbol;
713 }
714
717};
718
722
723 void output(OutputBuffer &OB, OutputFlags Flags) const override;
724
725 static bool classof(const Node *N) {
726 return N->kind() == NodeKind::LocalStaticGuardVariable;
727 }
728
729 bool IsVisible = false;
730};
731
734
735 void output(OutputBuffer &OB, OutputFlags Flags) const override;
736
737 static bool classof(const Node *N) {
738 return N->kind() == NodeKind::EncodedStringLiteral;
739 }
740
741 std::string_view DecodedString;
742 bool IsTruncated = false;
744};
745
748
749 void output(OutputBuffer &OB, OutputFlags Flags) const override;
750
751 static bool classof(const Node *N) {
752 return N->kind() == NodeKind::VariableSymbol;
753 }
754
755 virtual bool shouldOutputName(OutputFlags Flags) const { return true; }
756
758 TypeNode *Type = nullptr;
759};
760
763
764 bool shouldOutputName(OutputFlags Flags) const override {
765 return !(Flags & OF_NoDecorativeRTTITypeDescriptor);
766 }
767};
768
771
772 void output(OutputBuffer &OB, OutputFlags Flags) const override;
773
774 static bool classof(const Node *N) {
775 return N->kind() == NodeKind::FunctionSymbol;
776 }
777
779};
780
783
784 // __ptrauth takes three arguments:
785 // - key
786 // - isAddressDiscriminated
787 // - extra discriminator
788 static constexpr unsigned NumArgs = 3;
789 typedef std::array<uint64_t, NumArgs> ArgArray;
790
791 void output(OutputBuffer &OB, OutputFlags Flags) const override;
792
793 static bool classof(const Node *N) {
794 return N->kind() == NodeKind::PointerAuthQualifier;
795 }
796
797 // List of arguments.
799};
800
801} // namespace ms_demangle
802} // namespace llvm
803
804#endif
unsigned uint64_t
#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