LLVM 20.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 <array>
17#include <cstdint>
18#include <string>
19#include <string_view>
20
21namespace llvm {
22namespace itanium_demangle {
23class OutputBuffer;
24}
25}
26
27using llvm::itanium_demangle::OutputBuffer;
28
29namespace llvm {
30namespace ms_demangle {
31
32// Storage classes
34 Q_None = 0,
35 Q_Const = 1 << 0,
36 Q_Volatile = 1 << 1,
37 Q_Far = 1 << 2,
38 Q_Huge = 1 << 3,
39 Q_Unaligned = 1 << 4,
40 Q_Restrict = 1 << 5,
41 Q_Pointer64 = 1 << 6
42};
43
44enum class StorageClass : uint8_t {
45 None,
49 Global,
51};
52
55
56// Calling conventions
57enum class CallingConv : uint8_t {
58 None,
59 Cdecl,
60 Pascal,
62 Stdcall,
64 Clrcall,
65 Eabi,
67 Regcall,
68 Swift, // Clang-only
69 SwiftAsync, // Clang-only
70};
71
73
82};
83
84// Types
85enum class PrimitiveKind {
86 Void,
87 Bool,
88 Char,
89 Schar,
90 Uchar,
91 Char8,
92 Char16,
93 Char32,
94 Short,
95 Ushort,
96 Int,
97 Uint,
98 Long,
99 Ulong,
100 Int64,
101 Uint64,
102 Wchar,
103 Float,
104 Double,
105 Ldouble,
106 Nullptr,
107 Auto,
109};
110
111enum class CharKind {
112 Char,
113 Char16,
114 Char32,
115 Wchar,
116};
117
119 None,
120 New, // ?2 # operator new
121 Delete, // ?3 # operator delete
122 Assign, // ?4 # operator=
123 RightShift, // ?5 # operator>>
124 LeftShift, // ?6 # operator<<
125 LogicalNot, // ?7 # operator!
126 Equals, // ?8 # operator==
127 NotEquals, // ?9 # operator!=
128 ArraySubscript, // ?A # operator[]
129 Pointer, // ?C # operator->
130 Dereference, // ?D # operator*
131 Increment, // ?E # operator++
132 Decrement, // ?F # operator--
133 Minus, // ?G # operator-
134 Plus, // ?H # operator+
135 BitwiseAnd, // ?I # operator&
136 MemberPointer, // ?J # operator->*
137 Divide, // ?K # operator/
138 Modulus, // ?L # operator%
139 LessThan, // ?M operator<
140 LessThanEqual, // ?N operator<=
141 GreaterThan, // ?O operator>
142 GreaterThanEqual, // ?P operator>=
143 Comma, // ?Q operator,
144 Parens, // ?R operator()
145 BitwiseNot, // ?S operator~
146 BitwiseXor, // ?T operator^
147 BitwiseOr, // ?U operator|
148 LogicalAnd, // ?V operator&&
149 LogicalOr, // ?W operator||
150 TimesEqual, // ?X operator*=
151 PlusEqual, // ?Y operator+=
152 MinusEqual, // ?Z operator-=
153 DivEqual, // ?_0 operator/=
154 ModEqual, // ?_1 operator%=
155 RshEqual, // ?_2 operator>>=
156 LshEqual, // ?_3 operator<<=
157 BitwiseAndEqual, // ?_4 operator&=
158 BitwiseOrEqual, // ?_5 operator|=
159 BitwiseXorEqual, // ?_6 operator^=
160 VbaseDtor, // ?_D # vbase destructor
161 VecDelDtor, // ?_E # vector deleting destructor
162 DefaultCtorClosure, // ?_F # default constructor closure
163 ScalarDelDtor, // ?_G # scalar deleting destructor
164 VecCtorIter, // ?_H # vector constructor iterator
165 VecDtorIter, // ?_I # vector destructor iterator
166 VecVbaseCtorIter, // ?_J # vector vbase constructor iterator
167 VdispMap, // ?_K # virtual displacement map
168 EHVecCtorIter, // ?_L # eh vector constructor iterator
169 EHVecDtorIter, // ?_M # eh vector destructor iterator
170 EHVecVbaseCtorIter, // ?_N # eh vector vbase constructor iterator
171 CopyCtorClosure, // ?_O # copy constructor closure
172 LocalVftableCtorClosure, // ?_T # local vftable constructor closure
173 ArrayNew, // ?_U operator new[]
174 ArrayDelete, // ?_V operator delete[]
175 ManVectorCtorIter, // ?__A managed vector ctor iterator
176 ManVectorDtorIter, // ?__B managed vector dtor iterator
177 EHVectorCopyCtorIter, // ?__C EH vector copy ctor iterator
178 EHVectorVbaseCopyCtorIter, // ?__D EH vector vbase copy ctor iterator
179 VectorCopyCtorIter, // ?__G vector copy constructor iterator
180 VectorVbaseCopyCtorIter, // ?__H vector vbase copy constructor iterator
181 ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy constructor
182 CoAwait, // ?__L operator co_await
183 Spaceship, // ?__M operator<=>
185};
186
188 None,
189 Vftable,
190 Vbtable,
191 Typeof,
196 Unknown,
206};
207
208// Function classes
211 FC_Public = 1 << 0,
212 FC_Protected = 1 << 1,
213 FC_Private = 1 << 2,
214 FC_Global = 1 << 3,
215 FC_Static = 1 << 4,
216 FC_Virtual = 1 << 5,
217 FC_Far = 1 << 6,
218 FC_ExternC = 1 << 7,
223};
224
225enum class TagKind { Class, Struct, Union, Enum };
226
227enum class NodeKind {
228 Unknown,
229 Md5Symbol,
243 TagType,
244 ArrayType,
245 Custom,
247 NodeArray,
257};
258
259struct Node {
260 explicit Node(NodeKind K) : Kind(K) {}
261 virtual ~Node() = default;
262
263 NodeKind kind() const { return Kind; }
264
265 virtual void output(OutputBuffer &OB, OutputFlags Flags) const = 0;
266
267 std::string toString(OutputFlags Flags = OF_Default) const;
268
269private:
270 NodeKind Kind;
271};
272
273struct TypeNode;
274struct PrimitiveTypeNode;
276struct IdentifierNode;
283struct ThunkSignatureNode;
284struct PointerTypeNode;
285struct ArrayTypeNode;
286struct TagTypeNode;
287struct NodeArrayNode;
288struct QualifiedNameNode;
291struct IntegerLiteralNode;
294struct SymbolNode;
295struct FunctionSymbolNode;
296struct VariableSymbolNode;
298
299struct TypeNode : public Node {
300 explicit TypeNode(NodeKind K) : Node(K) {}
301
302 virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const = 0;
303 virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const = 0;
304
305 void output(OutputBuffer &OB, OutputFlags Flags) const override {
306 outputPre(OB, Flags);
307 outputPost(OB, Flags);
308 }
309
311};
312
316
317 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
318 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override {}
319
321};
322
326
327 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
328 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
329
330 // Valid if this FunctionTypeNode is the Pointee of a PointerType or
331 // MemberPointerType.
333
334 // The function's calling convention.
336
337 // Function flags (global, public, etc)
339
341
342 // The return type of the function.
344
345 // True if this is a C-style ... varargs function.
346 bool IsVariadic = false;
347
348 // Function parameters
350
351 // True if the function type is noexcept.
352 bool IsNoexcept = false;
353};
354
355struct IdentifierNode : public Node {
356 explicit IdentifierNode(NodeKind K) : Node(K) {}
357
359
360protected:
362};
363
366
367 void output(OutputBuffer &OB, OutputFlags Flags) const override;
368
370};
371
375
376 void output(OutputBuffer &OB, OutputFlags Flags) const override;
377
380 bool IsDestructor = false;
381};
382
385
386 void output(OutputBuffer &OB, OutputFlags Flags) const override;
387
388 std::string_view Name;
389};
390
395
396 void output(OutputBuffer &OB, OutputFlags Flags) const override;
397
399};
400
404
405 void output(OutputBuffer &OB, OutputFlags Flags) const override;
406
407 std::string_view Name;
408};
409
413
414 void output(OutputBuffer &OB, OutputFlags Flags) const override;
415
416 bool IsThread = false;
418};
419
423
424 void output(OutputBuffer &OB, OutputFlags Flags) const override;
425
426 // The type that this operator converts too.
428};
429
435
436 void output(OutputBuffer &OB, OutputFlags Flags) const override;
437
438 // The name of the class that this is a structor of.
440 bool IsDestructor = false;
441};
442
445
446 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
447 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
448
451 int32_t VBPtrOffset = 0;
452 int32_t VBOffsetOffset = 0;
453 int32_t VtordispOffset = 0;
454 };
455
457};
458
459struct PointerTypeNode : public TypeNode {
461 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
462 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
463
464 // Is this a pointer, reference, or rvalue-reference?
466
467 // If this is a member pointer, this is the class that the member is in.
469
470 // Represents a type X in "a pointer to X", "a reference to X", or
471 // "rvalue-reference to X"
472 TypeNode *Pointee = nullptr;
473};
474
475struct TagTypeNode : public TypeNode {
477
478 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
479 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
480
483};
484
485struct ArrayTypeNode : public TypeNode {
487
488 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
489 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
490
491 void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
492 void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
493
494 // A list of array dimensions. e.g. [3,4,5] in `int Foo[3][4][5]`
496
497 // The type of array element.
499};
500
501struct IntrinsicNode : public TypeNode {
503 void output(OutputBuffer &OB, OutputFlags Flags) const override {}
504};
505
506struct CustomTypeNode : public TypeNode {
508
509 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
510 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
511
513};
514
515struct NodeArrayNode : public Node {
517
518 void output(OutputBuffer &OB, OutputFlags Flags) const override;
519
520 void output(OutputBuffer &OB, OutputFlags Flags,
521 std::string_view Separator) const;
522
523 Node **Nodes = nullptr;
524 size_t Count = 0;
525};
526
527struct QualifiedNameNode : public Node {
529
530 void output(OutputBuffer &OB, OutputFlags Flags) const override;
531
533
535 Node *LastComponent = Components->Nodes[Components->Count - 1];
536 return static_cast<IdentifierNode *>(LastComponent);
537 }
538};
539
543
544 void output(OutputBuffer &OB, OutputFlags Flags) const override;
545
546 SymbolNode *Symbol = nullptr;
547
549 std::array<int64_t, 3> ThunkOffsets;
551 bool IsMemberPointer = false;
552};
553
554struct IntegerLiteralNode : public Node {
558
559 void output(OutputBuffer &OB, OutputFlags Flags) const override;
560
562 bool IsNegative = false;
563};
564
568
569 void output(OutputBuffer &OB, OutputFlags Flags) const override;
570
572 int32_t VBPtrOffset = 0;
575};
576
577struct SymbolNode : public Node {
578 explicit SymbolNode(NodeKind K) : Node(K) {}
579 void output(OutputBuffer &OB, OutputFlags Flags) const override;
581};
582
586
587 void output(OutputBuffer &OB, OutputFlags Flags) const override;
590};
591
595
596 void output(OutputBuffer &OB, OutputFlags Flags) const override;
597
598 bool IsVisible = false;
599};
600
603
604 void output(OutputBuffer &OB, OutputFlags Flags) const override;
605
606 std::string_view DecodedString;
607 bool IsTruncated = false;
609};
610
613
614 void output(OutputBuffer &OB, OutputFlags Flags) const override;
615
617 TypeNode *Type = nullptr;
618};
619
622
623 void output(OutputBuffer &OB, OutputFlags Flags) const override;
624
626};
627
628} // namespace ms_demangle
629} // namespace llvm
630
631#endif
Class to represent array types.
Definition: DerivedTypes.h:395
This is a utility class that provides an abstraction for the common functionality between Instruction...
Definition: Operator.h:32
Class to represent pointers.
Definition: DerivedTypes.h:670
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM Value Representation.
Definition: Value.h:74
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
#define N
Determine the kind of a node from its type.
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const
void output(OutputBuffer &OB, OutputFlags Flags) const override
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const
IntegerLiteralNode(uint64_t Value, bool IsNegative)
void output(OutputBuffer &OB, OutputFlags Flags) const override
IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator)
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
virtual void output(OutputBuffer &OB, OutputFlags Flags) const =0
virtual ~Node()=default
std::string toString(OutputFlags Flags=OF_Default) const
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override
void outputPost(OutputBuffer &OB, OutputFlags Flags) const override
void outputPre(OutputBuffer &OB, OutputFlags Flags) const override
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
void output(OutputBuffer &OB, OutputFlags Flags) const override
void output(OutputBuffer &OB, OutputFlags Flags) const override