File indexing completed on 2026-05-10 08:43:48
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
0014 #define LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
0015
0016 #include <array>
0017 #include <cstdint>
0018 #include <string>
0019 #include <string_view>
0020
0021 namespace llvm {
0022 namespace itanium_demangle {
0023 class OutputBuffer;
0024 }
0025 }
0026
0027 using llvm::itanium_demangle::OutputBuffer;
0028
0029 namespace llvm {
0030 namespace ms_demangle {
0031
0032
0033 enum Qualifiers : uint8_t {
0034 Q_None = 0,
0035 Q_Const = 1 << 0,
0036 Q_Volatile = 1 << 1,
0037 Q_Far = 1 << 2,
0038 Q_Huge = 1 << 3,
0039 Q_Unaligned = 1 << 4,
0040 Q_Restrict = 1 << 5,
0041 Q_Pointer64 = 1 << 6
0042 };
0043
0044 enum class StorageClass : uint8_t {
0045 None,
0046 PrivateStatic,
0047 ProtectedStatic,
0048 PublicStatic,
0049 Global,
0050 FunctionLocalStatic,
0051 };
0052
0053 enum class PointerAffinity { None, Pointer, Reference, RValueReference };
0054 enum class FunctionRefQualifier { None, Reference, RValueReference };
0055
0056
0057 enum class CallingConv : uint8_t {
0058 None,
0059 Cdecl,
0060 Pascal,
0061 Thiscall,
0062 Stdcall,
0063 Fastcall,
0064 Clrcall,
0065 Eabi,
0066 Vectorcall,
0067 Regcall,
0068 Swift,
0069 SwiftAsync,
0070 };
0071
0072 enum class ReferenceKind : uint8_t { None, LValueRef, RValueRef };
0073
0074 enum OutputFlags {
0075 OF_Default = 0,
0076 OF_NoCallingConvention = 1,
0077 OF_NoTagSpecifier = 2,
0078 OF_NoAccessSpecifier = 4,
0079 OF_NoMemberType = 8,
0080 OF_NoReturnType = 16,
0081 OF_NoVariableType = 32,
0082 };
0083
0084
0085 enum class PrimitiveKind {
0086 Void,
0087 Bool,
0088 Char,
0089 Schar,
0090 Uchar,
0091 Char8,
0092 Char16,
0093 Char32,
0094 Short,
0095 Ushort,
0096 Int,
0097 Uint,
0098 Long,
0099 Ulong,
0100 Int64,
0101 Uint64,
0102 Wchar,
0103 Float,
0104 Double,
0105 Ldouble,
0106 Nullptr,
0107 Auto,
0108 DecltypeAuto,
0109 };
0110
0111 enum class CharKind {
0112 Char,
0113 Char16,
0114 Char32,
0115 Wchar,
0116 };
0117
0118 enum class IntrinsicFunctionKind : uint8_t {
0119 None,
0120 New,
0121 Delete,
0122 Assign,
0123 RightShift,
0124 LeftShift,
0125 LogicalNot,
0126 Equals,
0127 NotEquals,
0128 ArraySubscript,
0129 Pointer,
0130 Dereference,
0131 Increment,
0132 Decrement,
0133 Minus,
0134 Plus,
0135 BitwiseAnd,
0136 MemberPointer,
0137 Divide,
0138 Modulus,
0139 LessThan,
0140 LessThanEqual,
0141 GreaterThan,
0142 GreaterThanEqual,
0143 Comma,
0144 Parens,
0145 BitwiseNot,
0146 BitwiseXor,
0147 BitwiseOr,
0148 LogicalAnd,
0149 LogicalOr,
0150 TimesEqual,
0151 PlusEqual,
0152 MinusEqual,
0153 DivEqual,
0154 ModEqual,
0155 RshEqual,
0156 LshEqual,
0157 BitwiseAndEqual,
0158 BitwiseOrEqual,
0159 BitwiseXorEqual,
0160 VbaseDtor,
0161 VecDelDtor,
0162 DefaultCtorClosure,
0163 ScalarDelDtor,
0164 VecCtorIter,
0165 VecDtorIter,
0166 VecVbaseCtorIter,
0167 VdispMap,
0168 EHVecCtorIter,
0169 EHVecDtorIter,
0170 EHVecVbaseCtorIter,
0171 CopyCtorClosure,
0172 LocalVftableCtorClosure,
0173 ArrayNew,
0174 ArrayDelete,
0175 ManVectorCtorIter,
0176 ManVectorDtorIter,
0177 EHVectorCopyCtorIter,
0178 EHVectorVbaseCopyCtorIter,
0179 VectorCopyCtorIter,
0180 VectorVbaseCopyCtorIter,
0181 ManVectorVbaseCopyCtorIter,
0182 CoAwait,
0183 Spaceship,
0184 MaxIntrinsic
0185 };
0186
0187 enum class SpecialIntrinsicKind {
0188 None,
0189 Vftable,
0190 Vbtable,
0191 Typeof,
0192 VcallThunk,
0193 LocalStaticGuard,
0194 StringLiteralSymbol,
0195 UdtReturning,
0196 Unknown,
0197 DynamicInitializer,
0198 DynamicAtexitDestructor,
0199 RttiTypeDescriptor,
0200 RttiBaseClassDescriptor,
0201 RttiBaseClassArray,
0202 RttiClassHierarchyDescriptor,
0203 RttiCompleteObjLocator,
0204 LocalVftable,
0205 LocalStaticThreadGuard,
0206 };
0207
0208
0209 enum FuncClass : uint16_t {
0210 FC_None = 0,
0211 FC_Public = 1 << 0,
0212 FC_Protected = 1 << 1,
0213 FC_Private = 1 << 2,
0214 FC_Global = 1 << 3,
0215 FC_Static = 1 << 4,
0216 FC_Virtual = 1 << 5,
0217 FC_Far = 1 << 6,
0218 FC_ExternC = 1 << 7,
0219 FC_NoParameterList = 1 << 8,
0220 FC_VirtualThisAdjust = 1 << 9,
0221 FC_VirtualThisAdjustEx = 1 << 10,
0222 FC_StaticThisAdjust = 1 << 11,
0223 };
0224
0225 enum class TagKind { Class, Struct, Union, Enum };
0226
0227 enum class NodeKind {
0228 Unknown,
0229 Md5Symbol,
0230 PrimitiveType,
0231 FunctionSignature,
0232 Identifier,
0233 NamedIdentifier,
0234 VcallThunkIdentifier,
0235 LocalStaticGuardIdentifier,
0236 IntrinsicFunctionIdentifier,
0237 ConversionOperatorIdentifier,
0238 DynamicStructorIdentifier,
0239 StructorIdentifier,
0240 LiteralOperatorIdentifier,
0241 ThunkSignature,
0242 PointerType,
0243 TagType,
0244 ArrayType,
0245 Custom,
0246 IntrinsicType,
0247 NodeArray,
0248 QualifiedName,
0249 TemplateParameterReference,
0250 EncodedStringLiteral,
0251 IntegerLiteral,
0252 RttiBaseClassDescriptor,
0253 LocalStaticGuardVariable,
0254 FunctionSymbol,
0255 VariableSymbol,
0256 SpecialTableSymbol
0257 };
0258
0259 struct Node {
0260 explicit Node(NodeKind K) : Kind(K) {}
0261 virtual ~Node() = default;
0262
0263 NodeKind kind() const { return Kind; }
0264
0265 virtual void output(OutputBuffer &OB, OutputFlags Flags) const = 0;
0266
0267 std::string toString(OutputFlags Flags = OF_Default) const;
0268
0269 private:
0270 NodeKind Kind;
0271 };
0272
0273 struct TypeNode;
0274 struct PrimitiveTypeNode;
0275 struct FunctionSignatureNode;
0276 struct IdentifierNode;
0277 struct NamedIdentifierNode;
0278 struct VcallThunkIdentifierNode;
0279 struct IntrinsicFunctionIdentifierNode;
0280 struct LiteralOperatorIdentifierNode;
0281 struct ConversionOperatorIdentifierNode;
0282 struct StructorIdentifierNode;
0283 struct ThunkSignatureNode;
0284 struct PointerTypeNode;
0285 struct ArrayTypeNode;
0286 struct TagTypeNode;
0287 struct NodeArrayNode;
0288 struct QualifiedNameNode;
0289 struct TemplateParameterReferenceNode;
0290 struct EncodedStringLiteralNode;
0291 struct IntegerLiteralNode;
0292 struct RttiBaseClassDescriptorNode;
0293 struct LocalStaticGuardVariableNode;
0294 struct SymbolNode;
0295 struct FunctionSymbolNode;
0296 struct VariableSymbolNode;
0297 struct SpecialTableSymbolNode;
0298
0299 struct TypeNode : public Node {
0300 explicit TypeNode(NodeKind K) : Node(K) {}
0301
0302 virtual void outputPre(OutputBuffer &OB, OutputFlags Flags) const = 0;
0303 virtual void outputPost(OutputBuffer &OB, OutputFlags Flags) const = 0;
0304
0305 void output(OutputBuffer &OB, OutputFlags Flags) const override {
0306 outputPre(OB, Flags);
0307 outputPost(OB, Flags);
0308 }
0309
0310 Qualifiers Quals = Q_None;
0311 };
0312
0313 struct PrimitiveTypeNode : public TypeNode {
0314 explicit PrimitiveTypeNode(PrimitiveKind K)
0315 : TypeNode(NodeKind::PrimitiveType), PrimKind(K) {}
0316
0317 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0318 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override {}
0319
0320 PrimitiveKind PrimKind;
0321 };
0322
0323 struct FunctionSignatureNode : public TypeNode {
0324 explicit FunctionSignatureNode(NodeKind K) : TypeNode(K) {}
0325 FunctionSignatureNode() : TypeNode(NodeKind::FunctionSignature) {}
0326
0327 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0328 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0329
0330
0331
0332 PointerAffinity Affinity = PointerAffinity::None;
0333
0334
0335 CallingConv CallConvention = CallingConv::None;
0336
0337
0338 FuncClass FunctionClass = FC_Global;
0339
0340 FunctionRefQualifier RefQualifier = FunctionRefQualifier::None;
0341
0342
0343 TypeNode *ReturnType = nullptr;
0344
0345
0346 bool IsVariadic = false;
0347
0348
0349 NodeArrayNode *Params = nullptr;
0350
0351
0352 bool IsNoexcept = false;
0353 };
0354
0355 struct IdentifierNode : public Node {
0356 explicit IdentifierNode(NodeKind K) : Node(K) {}
0357
0358 NodeArrayNode *TemplateParams = nullptr;
0359
0360 protected:
0361 void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const;
0362 };
0363
0364 struct VcallThunkIdentifierNode : public IdentifierNode {
0365 VcallThunkIdentifierNode() : IdentifierNode(NodeKind::VcallThunkIdentifier) {}
0366
0367 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0368
0369 uint64_t OffsetInVTable = 0;
0370 };
0371
0372 struct DynamicStructorIdentifierNode : public IdentifierNode {
0373 DynamicStructorIdentifierNode()
0374 : IdentifierNode(NodeKind::DynamicStructorIdentifier) {}
0375
0376 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0377
0378 VariableSymbolNode *Variable = nullptr;
0379 QualifiedNameNode *Name = nullptr;
0380 bool IsDestructor = false;
0381 };
0382
0383 struct NamedIdentifierNode : public IdentifierNode {
0384 NamedIdentifierNode() : IdentifierNode(NodeKind::NamedIdentifier) {}
0385
0386 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0387
0388 std::string_view Name;
0389 };
0390
0391 struct IntrinsicFunctionIdentifierNode : public IdentifierNode {
0392 explicit IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator)
0393 : IdentifierNode(NodeKind::IntrinsicFunctionIdentifier),
0394 Operator(Operator) {}
0395
0396 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0397
0398 IntrinsicFunctionKind Operator;
0399 };
0400
0401 struct LiteralOperatorIdentifierNode : public IdentifierNode {
0402 LiteralOperatorIdentifierNode()
0403 : IdentifierNode(NodeKind::LiteralOperatorIdentifier) {}
0404
0405 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0406
0407 std::string_view Name;
0408 };
0409
0410 struct LocalStaticGuardIdentifierNode : public IdentifierNode {
0411 LocalStaticGuardIdentifierNode()
0412 : IdentifierNode(NodeKind::LocalStaticGuardIdentifier) {}
0413
0414 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0415
0416 bool IsThread = false;
0417 uint32_t ScopeIndex = 0;
0418 };
0419
0420 struct ConversionOperatorIdentifierNode : public IdentifierNode {
0421 ConversionOperatorIdentifierNode()
0422 : IdentifierNode(NodeKind::ConversionOperatorIdentifier) {}
0423
0424 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0425
0426
0427 TypeNode *TargetType = nullptr;
0428 };
0429
0430 struct StructorIdentifierNode : public IdentifierNode {
0431 StructorIdentifierNode() : IdentifierNode(NodeKind::StructorIdentifier) {}
0432 explicit StructorIdentifierNode(bool IsDestructor)
0433 : IdentifierNode(NodeKind::StructorIdentifier),
0434 IsDestructor(IsDestructor) {}
0435
0436 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0437
0438
0439 IdentifierNode *Class = nullptr;
0440 bool IsDestructor = false;
0441 };
0442
0443 struct ThunkSignatureNode : public FunctionSignatureNode {
0444 ThunkSignatureNode() : FunctionSignatureNode(NodeKind::ThunkSignature) {}
0445
0446 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0447 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0448
0449 struct ThisAdjustor {
0450 uint32_t StaticOffset = 0;
0451 int32_t VBPtrOffset = 0;
0452 int32_t VBOffsetOffset = 0;
0453 int32_t VtordispOffset = 0;
0454 };
0455
0456 ThisAdjustor ThisAdjust;
0457 };
0458
0459 struct PointerTypeNode : public TypeNode {
0460 PointerTypeNode() : TypeNode(NodeKind::PointerType) {}
0461 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0462 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0463
0464
0465 PointerAffinity Affinity = PointerAffinity::None;
0466
0467
0468 QualifiedNameNode *ClassParent = nullptr;
0469
0470
0471
0472 TypeNode *Pointee = nullptr;
0473 };
0474
0475 struct TagTypeNode : public TypeNode {
0476 explicit TagTypeNode(TagKind Tag) : TypeNode(NodeKind::TagType), Tag(Tag) {}
0477
0478 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0479 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0480
0481 QualifiedNameNode *QualifiedName = nullptr;
0482 TagKind Tag;
0483 };
0484
0485 struct ArrayTypeNode : public TypeNode {
0486 ArrayTypeNode() : TypeNode(NodeKind::ArrayType) {}
0487
0488 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0489 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0490
0491 void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
0492 void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
0493
0494
0495 NodeArrayNode *Dimensions = nullptr;
0496
0497
0498 TypeNode *ElementType = nullptr;
0499 };
0500
0501 struct IntrinsicNode : public TypeNode {
0502 IntrinsicNode() : TypeNode(NodeKind::IntrinsicType) {}
0503 void output(OutputBuffer &OB, OutputFlags Flags) const override {}
0504 };
0505
0506 struct CustomTypeNode : public TypeNode {
0507 CustomTypeNode() : TypeNode(NodeKind::Custom) {}
0508
0509 void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
0510 void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
0511
0512 IdentifierNode *Identifier = nullptr;
0513 };
0514
0515 struct NodeArrayNode : public Node {
0516 NodeArrayNode() : Node(NodeKind::NodeArray) {}
0517
0518 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0519
0520 void output(OutputBuffer &OB, OutputFlags Flags,
0521 std::string_view Separator) const;
0522
0523 Node **Nodes = nullptr;
0524 size_t Count = 0;
0525 };
0526
0527 struct QualifiedNameNode : public Node {
0528 QualifiedNameNode() : Node(NodeKind::QualifiedName) {}
0529
0530 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0531
0532 NodeArrayNode *Components = nullptr;
0533
0534 IdentifierNode *getUnqualifiedIdentifier() {
0535 Node *LastComponent = Components->Nodes[Components->Count - 1];
0536 return static_cast<IdentifierNode *>(LastComponent);
0537 }
0538 };
0539
0540 struct TemplateParameterReferenceNode : public Node {
0541 TemplateParameterReferenceNode()
0542 : Node(NodeKind::TemplateParameterReference) {}
0543
0544 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0545
0546 SymbolNode *Symbol = nullptr;
0547
0548 int ThunkOffsetCount = 0;
0549 std::array<int64_t, 3> ThunkOffsets;
0550 PointerAffinity Affinity = PointerAffinity::None;
0551 bool IsMemberPointer = false;
0552 };
0553
0554 struct IntegerLiteralNode : public Node {
0555 IntegerLiteralNode() : Node(NodeKind::IntegerLiteral) {}
0556 IntegerLiteralNode(uint64_t Value, bool IsNegative)
0557 : Node(NodeKind::IntegerLiteral), Value(Value), IsNegative(IsNegative) {}
0558
0559 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0560
0561 uint64_t Value = 0;
0562 bool IsNegative = false;
0563 };
0564
0565 struct RttiBaseClassDescriptorNode : public IdentifierNode {
0566 RttiBaseClassDescriptorNode()
0567 : IdentifierNode(NodeKind::RttiBaseClassDescriptor) {}
0568
0569 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0570
0571 uint32_t NVOffset = 0;
0572 int32_t VBPtrOffset = 0;
0573 uint32_t VBTableOffset = 0;
0574 uint32_t Flags = 0;
0575 };
0576
0577 struct SymbolNode : public Node {
0578 explicit SymbolNode(NodeKind K) : Node(K) {}
0579 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0580 QualifiedNameNode *Name = nullptr;
0581 };
0582
0583 struct SpecialTableSymbolNode : public SymbolNode {
0584 explicit SpecialTableSymbolNode()
0585 : SymbolNode(NodeKind::SpecialTableSymbol) {}
0586
0587 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0588 QualifiedNameNode *TargetName = nullptr;
0589 Qualifiers Quals = Qualifiers::Q_None;
0590 };
0591
0592 struct LocalStaticGuardVariableNode : public SymbolNode {
0593 LocalStaticGuardVariableNode()
0594 : SymbolNode(NodeKind::LocalStaticGuardVariable) {}
0595
0596 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0597
0598 bool IsVisible = false;
0599 };
0600
0601 struct EncodedStringLiteralNode : public SymbolNode {
0602 EncodedStringLiteralNode() : SymbolNode(NodeKind::EncodedStringLiteral) {}
0603
0604 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0605
0606 std::string_view DecodedString;
0607 bool IsTruncated = false;
0608 CharKind Char = CharKind::Char;
0609 };
0610
0611 struct VariableSymbolNode : public SymbolNode {
0612 VariableSymbolNode() : SymbolNode(NodeKind::VariableSymbol) {}
0613
0614 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0615
0616 StorageClass SC = StorageClass::None;
0617 TypeNode *Type = nullptr;
0618 };
0619
0620 struct FunctionSymbolNode : public SymbolNode {
0621 FunctionSymbolNode() : SymbolNode(NodeKind::FunctionSymbol) {}
0622
0623 void output(OutputBuffer &OB, OutputFlags Flags) const override;
0624
0625 FunctionSignatureNode *Signature = nullptr;
0626 };
0627
0628 }
0629 }
0630
0631 #endif