10b57cec5SDimitry Andric //===- MicrosoftDemangleNodes.h ---------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file defines the AST nodes used in the MSVC demangler. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 13fe6060f1SDimitry Andric #ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H 14fe6060f1SDimitry Andric #define LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "llvm/Demangle/DemangleConfig.h" 170b57cec5SDimitry Andric #include "llvm/Demangle/StringView.h" 180b57cec5SDimitry Andric #include <array> 19c14a5a88SDimitry Andric #include <cstdint> 20c14a5a88SDimitry Andric #include <string> 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric namespace llvm { 230b57cec5SDimitry Andric namespace itanium_demangle { 240b57cec5SDimitry Andric class OutputStream; 250b57cec5SDimitry Andric } 260b57cec5SDimitry Andric } 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric using llvm::itanium_demangle::OutputStream; 290b57cec5SDimitry Andric using llvm::itanium_demangle::StringView; 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric namespace llvm { 320b57cec5SDimitry Andric namespace ms_demangle { 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric // Storage classes 350b57cec5SDimitry Andric enum Qualifiers : uint8_t { 360b57cec5SDimitry Andric Q_None = 0, 370b57cec5SDimitry Andric Q_Const = 1 << 0, 380b57cec5SDimitry Andric Q_Volatile = 1 << 1, 390b57cec5SDimitry Andric Q_Far = 1 << 2, 400b57cec5SDimitry Andric Q_Huge = 1 << 3, 410b57cec5SDimitry Andric Q_Unaligned = 1 << 4, 420b57cec5SDimitry Andric Q_Restrict = 1 << 5, 430b57cec5SDimitry Andric Q_Pointer64 = 1 << 6 440b57cec5SDimitry Andric }; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric enum class StorageClass : uint8_t { 470b57cec5SDimitry Andric None, 480b57cec5SDimitry Andric PrivateStatic, 490b57cec5SDimitry Andric ProtectedStatic, 500b57cec5SDimitry Andric PublicStatic, 510b57cec5SDimitry Andric Global, 520b57cec5SDimitry Andric FunctionLocalStatic, 530b57cec5SDimitry Andric }; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric enum class PointerAffinity { None, Pointer, Reference, RValueReference }; 560b57cec5SDimitry Andric enum class FunctionRefQualifier { None, Reference, RValueReference }; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric // Calling conventions 590b57cec5SDimitry Andric enum class CallingConv : uint8_t { 600b57cec5SDimitry Andric None, 610b57cec5SDimitry Andric Cdecl, 620b57cec5SDimitry Andric Pascal, 630b57cec5SDimitry Andric Thiscall, 640b57cec5SDimitry Andric Stdcall, 650b57cec5SDimitry Andric Fastcall, 660b57cec5SDimitry Andric Clrcall, 670b57cec5SDimitry Andric Eabi, 680b57cec5SDimitry Andric Vectorcall, 690b57cec5SDimitry Andric Regcall, 70fe6060f1SDimitry Andric Swift, // Clang-only 71fe6060f1SDimitry Andric SwiftAsync, // Clang-only 720b57cec5SDimitry Andric }; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric enum class ReferenceKind : uint8_t { None, LValueRef, RValueRef }; 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric enum OutputFlags { 770b57cec5SDimitry Andric OF_Default = 0, 780b57cec5SDimitry Andric OF_NoCallingConvention = 1, 790b57cec5SDimitry Andric OF_NoTagSpecifier = 2, 808bcb0991SDimitry Andric OF_NoAccessSpecifier = 4, 818bcb0991SDimitry Andric OF_NoMemberType = 8, 828bcb0991SDimitry Andric OF_NoReturnType = 16, 830b57cec5SDimitry Andric }; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric // Types 860b57cec5SDimitry Andric enum class PrimitiveKind { 870b57cec5SDimitry Andric Void, 880b57cec5SDimitry Andric Bool, 890b57cec5SDimitry Andric Char, 900b57cec5SDimitry Andric Schar, 910b57cec5SDimitry Andric Uchar, 920b57cec5SDimitry Andric Char8, 930b57cec5SDimitry Andric Char16, 940b57cec5SDimitry Andric Char32, 950b57cec5SDimitry Andric Short, 960b57cec5SDimitry Andric Ushort, 970b57cec5SDimitry Andric Int, 980b57cec5SDimitry Andric Uint, 990b57cec5SDimitry Andric Long, 1000b57cec5SDimitry Andric Ulong, 1010b57cec5SDimitry Andric Int64, 1020b57cec5SDimitry Andric Uint64, 1030b57cec5SDimitry Andric Wchar, 1040b57cec5SDimitry Andric Float, 1050b57cec5SDimitry Andric Double, 1060b57cec5SDimitry Andric Ldouble, 1070b57cec5SDimitry Andric Nullptr, 1080b57cec5SDimitry Andric }; 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric enum class CharKind { 1110b57cec5SDimitry Andric Char, 1120b57cec5SDimitry Andric Char16, 1130b57cec5SDimitry Andric Char32, 1140b57cec5SDimitry Andric Wchar, 1150b57cec5SDimitry Andric }; 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric enum class IntrinsicFunctionKind : uint8_t { 1180b57cec5SDimitry Andric None, 1190b57cec5SDimitry Andric New, // ?2 # operator new 1200b57cec5SDimitry Andric Delete, // ?3 # operator delete 1210b57cec5SDimitry Andric Assign, // ?4 # operator= 1220b57cec5SDimitry Andric RightShift, // ?5 # operator>> 1230b57cec5SDimitry Andric LeftShift, // ?6 # operator<< 1240b57cec5SDimitry Andric LogicalNot, // ?7 # operator! 1250b57cec5SDimitry Andric Equals, // ?8 # operator== 1260b57cec5SDimitry Andric NotEquals, // ?9 # operator!= 1270b57cec5SDimitry Andric ArraySubscript, // ?A # operator[] 1280b57cec5SDimitry Andric Pointer, // ?C # operator-> 1290b57cec5SDimitry Andric Dereference, // ?D # operator* 1300b57cec5SDimitry Andric Increment, // ?E # operator++ 1310b57cec5SDimitry Andric Decrement, // ?F # operator-- 1320b57cec5SDimitry Andric Minus, // ?G # operator- 1330b57cec5SDimitry Andric Plus, // ?H # operator+ 1340b57cec5SDimitry Andric BitwiseAnd, // ?I # operator& 1350b57cec5SDimitry Andric MemberPointer, // ?J # operator->* 1360b57cec5SDimitry Andric Divide, // ?K # operator/ 1370b57cec5SDimitry Andric Modulus, // ?L # operator% 1380b57cec5SDimitry Andric LessThan, // ?M operator< 1390b57cec5SDimitry Andric LessThanEqual, // ?N operator<= 1400b57cec5SDimitry Andric GreaterThan, // ?O operator> 1410b57cec5SDimitry Andric GreaterThanEqual, // ?P operator>= 1420b57cec5SDimitry Andric Comma, // ?Q operator, 1430b57cec5SDimitry Andric Parens, // ?R operator() 1440b57cec5SDimitry Andric BitwiseNot, // ?S operator~ 1450b57cec5SDimitry Andric BitwiseXor, // ?T operator^ 1460b57cec5SDimitry Andric BitwiseOr, // ?U operator| 1470b57cec5SDimitry Andric LogicalAnd, // ?V operator&& 1480b57cec5SDimitry Andric LogicalOr, // ?W operator|| 1490b57cec5SDimitry Andric TimesEqual, // ?X operator*= 1500b57cec5SDimitry Andric PlusEqual, // ?Y operator+= 1510b57cec5SDimitry Andric MinusEqual, // ?Z operator-= 1520b57cec5SDimitry Andric DivEqual, // ?_0 operator/= 1530b57cec5SDimitry Andric ModEqual, // ?_1 operator%= 1540b57cec5SDimitry Andric RshEqual, // ?_2 operator>>= 1550b57cec5SDimitry Andric LshEqual, // ?_3 operator<<= 1560b57cec5SDimitry Andric BitwiseAndEqual, // ?_4 operator&= 1570b57cec5SDimitry Andric BitwiseOrEqual, // ?_5 operator|= 1580b57cec5SDimitry Andric BitwiseXorEqual, // ?_6 operator^= 1590b57cec5SDimitry Andric VbaseDtor, // ?_D # vbase destructor 1600b57cec5SDimitry Andric VecDelDtor, // ?_E # vector deleting destructor 1610b57cec5SDimitry Andric DefaultCtorClosure, // ?_F # default constructor closure 1620b57cec5SDimitry Andric ScalarDelDtor, // ?_G # scalar deleting destructor 1630b57cec5SDimitry Andric VecCtorIter, // ?_H # vector constructor iterator 1640b57cec5SDimitry Andric VecDtorIter, // ?_I # vector destructor iterator 1650b57cec5SDimitry Andric VecVbaseCtorIter, // ?_J # vector vbase constructor iterator 1660b57cec5SDimitry Andric VdispMap, // ?_K # virtual displacement map 1670b57cec5SDimitry Andric EHVecCtorIter, // ?_L # eh vector constructor iterator 1680b57cec5SDimitry Andric EHVecDtorIter, // ?_M # eh vector destructor iterator 1690b57cec5SDimitry Andric EHVecVbaseCtorIter, // ?_N # eh vector vbase constructor iterator 1700b57cec5SDimitry Andric CopyCtorClosure, // ?_O # copy constructor closure 1710b57cec5SDimitry Andric LocalVftableCtorClosure, // ?_T # local vftable constructor closure 1720b57cec5SDimitry Andric ArrayNew, // ?_U operator new[] 1730b57cec5SDimitry Andric ArrayDelete, // ?_V operator delete[] 1740b57cec5SDimitry Andric ManVectorCtorIter, // ?__A managed vector ctor iterator 1750b57cec5SDimitry Andric ManVectorDtorIter, // ?__B managed vector dtor iterator 1760b57cec5SDimitry Andric EHVectorCopyCtorIter, // ?__C EH vector copy ctor iterator 1770b57cec5SDimitry Andric EHVectorVbaseCopyCtorIter, // ?__D EH vector vbase copy ctor iterator 1780b57cec5SDimitry Andric VectorCopyCtorIter, // ?__G vector copy constructor iterator 1790b57cec5SDimitry Andric VectorVbaseCopyCtorIter, // ?__H vector vbase copy constructor iterator 1800b57cec5SDimitry Andric ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy constructor 1810b57cec5SDimitry Andric CoAwait, // ?__L operator co_await 1820b57cec5SDimitry Andric Spaceship, // ?__M operator<=> 1830b57cec5SDimitry Andric MaxIntrinsic 1840b57cec5SDimitry Andric }; 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric enum class SpecialIntrinsicKind { 1870b57cec5SDimitry Andric None, 1880b57cec5SDimitry Andric Vftable, 1890b57cec5SDimitry Andric Vbtable, 1900b57cec5SDimitry Andric Typeof, 1910b57cec5SDimitry Andric VcallThunk, 1920b57cec5SDimitry Andric LocalStaticGuard, 1930b57cec5SDimitry Andric StringLiteralSymbol, 1940b57cec5SDimitry Andric UdtReturning, 1950b57cec5SDimitry Andric Unknown, 1960b57cec5SDimitry Andric DynamicInitializer, 1970b57cec5SDimitry Andric DynamicAtexitDestructor, 1980b57cec5SDimitry Andric RttiTypeDescriptor, 1990b57cec5SDimitry Andric RttiBaseClassDescriptor, 2000b57cec5SDimitry Andric RttiBaseClassArray, 2010b57cec5SDimitry Andric RttiClassHierarchyDescriptor, 2020b57cec5SDimitry Andric RttiCompleteObjLocator, 2030b57cec5SDimitry Andric LocalVftable, 2040b57cec5SDimitry Andric LocalStaticThreadGuard, 2050b57cec5SDimitry Andric }; 2060b57cec5SDimitry Andric 2070b57cec5SDimitry Andric // Function classes 2080b57cec5SDimitry Andric enum FuncClass : uint16_t { 2090b57cec5SDimitry Andric FC_None = 0, 2100b57cec5SDimitry Andric FC_Public = 1 << 0, 2110b57cec5SDimitry Andric FC_Protected = 1 << 1, 2120b57cec5SDimitry Andric FC_Private = 1 << 2, 2130b57cec5SDimitry Andric FC_Global = 1 << 3, 2140b57cec5SDimitry Andric FC_Static = 1 << 4, 2150b57cec5SDimitry Andric FC_Virtual = 1 << 5, 2160b57cec5SDimitry Andric FC_Far = 1 << 6, 2170b57cec5SDimitry Andric FC_ExternC = 1 << 7, 2180b57cec5SDimitry Andric FC_NoParameterList = 1 << 8, 2190b57cec5SDimitry Andric FC_VirtualThisAdjust = 1 << 9, 2200b57cec5SDimitry Andric FC_VirtualThisAdjustEx = 1 << 10, 2210b57cec5SDimitry Andric FC_StaticThisAdjust = 1 << 11, 2220b57cec5SDimitry Andric }; 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric enum class TagKind { Class, Struct, Union, Enum }; 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric enum class NodeKind { 2270b57cec5SDimitry Andric Unknown, 2280b57cec5SDimitry Andric Md5Symbol, 2290b57cec5SDimitry Andric PrimitiveType, 2300b57cec5SDimitry Andric FunctionSignature, 2310b57cec5SDimitry Andric Identifier, 2320b57cec5SDimitry Andric NamedIdentifier, 2330b57cec5SDimitry Andric VcallThunkIdentifier, 2340b57cec5SDimitry Andric LocalStaticGuardIdentifier, 2350b57cec5SDimitry Andric IntrinsicFunctionIdentifier, 2360b57cec5SDimitry Andric ConversionOperatorIdentifier, 2370b57cec5SDimitry Andric DynamicStructorIdentifier, 2380b57cec5SDimitry Andric StructorIdentifier, 2390b57cec5SDimitry Andric LiteralOperatorIdentifier, 2400b57cec5SDimitry Andric ThunkSignature, 2410b57cec5SDimitry Andric PointerType, 2420b57cec5SDimitry Andric TagType, 2430b57cec5SDimitry Andric ArrayType, 2440b57cec5SDimitry Andric Custom, 2450b57cec5SDimitry Andric IntrinsicType, 2460b57cec5SDimitry Andric NodeArray, 2470b57cec5SDimitry Andric QualifiedName, 2480b57cec5SDimitry Andric TemplateParameterReference, 2490b57cec5SDimitry Andric EncodedStringLiteral, 2500b57cec5SDimitry Andric IntegerLiteral, 2510b57cec5SDimitry Andric RttiBaseClassDescriptor, 2520b57cec5SDimitry Andric LocalStaticGuardVariable, 2530b57cec5SDimitry Andric FunctionSymbol, 2540b57cec5SDimitry Andric VariableSymbol, 2550b57cec5SDimitry Andric SpecialTableSymbol 2560b57cec5SDimitry Andric }; 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric struct Node { 2590b57cec5SDimitry Andric explicit Node(NodeKind K) : Kind(K) {} 2600b57cec5SDimitry Andric virtual ~Node() = default; 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andric NodeKind kind() const { return Kind; } 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric virtual void output(OutputStream &OS, OutputFlags Flags) const = 0; 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric std::string toString(OutputFlags Flags = OF_Default) const; 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric private: 2690b57cec5SDimitry Andric NodeKind Kind; 2700b57cec5SDimitry Andric }; 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric struct TypeNode; 2730b57cec5SDimitry Andric struct PrimitiveTypeNode; 2740b57cec5SDimitry Andric struct FunctionSignatureNode; 2750b57cec5SDimitry Andric struct IdentifierNode; 2760b57cec5SDimitry Andric struct NamedIdentifierNode; 2770b57cec5SDimitry Andric struct VcallThunkIdentifierNode; 2780b57cec5SDimitry Andric struct IntrinsicFunctionIdentifierNode; 2790b57cec5SDimitry Andric struct LiteralOperatorIdentifierNode; 2800b57cec5SDimitry Andric struct ConversionOperatorIdentifierNode; 2810b57cec5SDimitry Andric struct StructorIdentifierNode; 2820b57cec5SDimitry Andric struct ThunkSignatureNode; 2830b57cec5SDimitry Andric struct PointerTypeNode; 2840b57cec5SDimitry Andric struct ArrayTypeNode; 2850b57cec5SDimitry Andric struct CustomNode; 2860b57cec5SDimitry Andric struct TagTypeNode; 2870b57cec5SDimitry Andric struct IntrinsicTypeNode; 2880b57cec5SDimitry Andric struct NodeArrayNode; 2890b57cec5SDimitry Andric struct QualifiedNameNode; 2900b57cec5SDimitry Andric struct TemplateParameterReferenceNode; 2910b57cec5SDimitry Andric struct EncodedStringLiteralNode; 2920b57cec5SDimitry Andric struct IntegerLiteralNode; 2930b57cec5SDimitry Andric struct RttiBaseClassDescriptorNode; 2940b57cec5SDimitry Andric struct LocalStaticGuardVariableNode; 2950b57cec5SDimitry Andric struct SymbolNode; 2960b57cec5SDimitry Andric struct FunctionSymbolNode; 2970b57cec5SDimitry Andric struct VariableSymbolNode; 2980b57cec5SDimitry Andric struct SpecialTableSymbolNode; 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andric struct TypeNode : public Node { 3010b57cec5SDimitry Andric explicit TypeNode(NodeKind K) : Node(K) {} 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andric virtual void outputPre(OutputStream &OS, OutputFlags Flags) const = 0; 3040b57cec5SDimitry Andric virtual void outputPost(OutputStream &OS, OutputFlags Flags) const = 0; 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override { 3070b57cec5SDimitry Andric outputPre(OS, Flags); 3080b57cec5SDimitry Andric outputPost(OS, Flags); 3090b57cec5SDimitry Andric } 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric Qualifiers Quals = Q_None; 3120b57cec5SDimitry Andric }; 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andric struct PrimitiveTypeNode : public TypeNode { 3150b57cec5SDimitry Andric explicit PrimitiveTypeNode(PrimitiveKind K) 3160b57cec5SDimitry Andric : TypeNode(NodeKind::PrimitiveType), PrimKind(K) {} 3170b57cec5SDimitry Andric 3185ffd83dbSDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 3195ffd83dbSDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override {} 3200b57cec5SDimitry Andric 3210b57cec5SDimitry Andric PrimitiveKind PrimKind; 3220b57cec5SDimitry Andric }; 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric struct FunctionSignatureNode : public TypeNode { 3250b57cec5SDimitry Andric explicit FunctionSignatureNode(NodeKind K) : TypeNode(K) {} 3260b57cec5SDimitry Andric FunctionSignatureNode() : TypeNode(NodeKind::FunctionSignature) {} 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 3290b57cec5SDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andric // Valid if this FunctionTypeNode is the Pointee of a PointerType or 3320b57cec5SDimitry Andric // MemberPointerType. 3330b57cec5SDimitry Andric PointerAffinity Affinity = PointerAffinity::None; 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric // The function's calling convention. 3360b57cec5SDimitry Andric CallingConv CallConvention = CallingConv::None; 3370b57cec5SDimitry Andric 3380b57cec5SDimitry Andric // Function flags (gloabl, public, etc) 3390b57cec5SDimitry Andric FuncClass FunctionClass = FC_Global; 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andric FunctionRefQualifier RefQualifier = FunctionRefQualifier::None; 3420b57cec5SDimitry Andric 3430b57cec5SDimitry Andric // The return type of the function. 3440b57cec5SDimitry Andric TypeNode *ReturnType = nullptr; 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andric // True if this is a C-style ... varargs function. 3470b57cec5SDimitry Andric bool IsVariadic = false; 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric // Function parameters 3500b57cec5SDimitry Andric NodeArrayNode *Params = nullptr; 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andric // True if the function type is noexcept. 3530b57cec5SDimitry Andric bool IsNoexcept = false; 3540b57cec5SDimitry Andric }; 3550b57cec5SDimitry Andric 3560b57cec5SDimitry Andric struct IdentifierNode : public Node { 3570b57cec5SDimitry Andric explicit IdentifierNode(NodeKind K) : Node(K) {} 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andric NodeArrayNode *TemplateParams = nullptr; 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andric protected: 3620b57cec5SDimitry Andric void outputTemplateParameters(OutputStream &OS, OutputFlags Flags) const; 3630b57cec5SDimitry Andric }; 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andric struct VcallThunkIdentifierNode : public IdentifierNode { 3660b57cec5SDimitry Andric VcallThunkIdentifierNode() : IdentifierNode(NodeKind::VcallThunkIdentifier) {} 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric uint64_t OffsetInVTable = 0; 3710b57cec5SDimitry Andric }; 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric struct DynamicStructorIdentifierNode : public IdentifierNode { 3740b57cec5SDimitry Andric DynamicStructorIdentifierNode() 3750b57cec5SDimitry Andric : IdentifierNode(NodeKind::DynamicStructorIdentifier) {} 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 3780b57cec5SDimitry Andric 3790b57cec5SDimitry Andric VariableSymbolNode *Variable = nullptr; 3800b57cec5SDimitry Andric QualifiedNameNode *Name = nullptr; 3810b57cec5SDimitry Andric bool IsDestructor = false; 3820b57cec5SDimitry Andric }; 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric struct NamedIdentifierNode : public IdentifierNode { 3850b57cec5SDimitry Andric NamedIdentifierNode() : IdentifierNode(NodeKind::NamedIdentifier) {} 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andric StringView Name; 3900b57cec5SDimitry Andric }; 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric struct IntrinsicFunctionIdentifierNode : public IdentifierNode { 3930b57cec5SDimitry Andric explicit IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator) 3940b57cec5SDimitry Andric : IdentifierNode(NodeKind::IntrinsicFunctionIdentifier), 3950b57cec5SDimitry Andric Operator(Operator) {} 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric IntrinsicFunctionKind Operator; 4000b57cec5SDimitry Andric }; 4010b57cec5SDimitry Andric 4020b57cec5SDimitry Andric struct LiteralOperatorIdentifierNode : public IdentifierNode { 4030b57cec5SDimitry Andric LiteralOperatorIdentifierNode() 4040b57cec5SDimitry Andric : IdentifierNode(NodeKind::LiteralOperatorIdentifier) {} 4050b57cec5SDimitry Andric 4060b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 4070b57cec5SDimitry Andric 4080b57cec5SDimitry Andric StringView Name; 4090b57cec5SDimitry Andric }; 4100b57cec5SDimitry Andric 4110b57cec5SDimitry Andric struct LocalStaticGuardIdentifierNode : public IdentifierNode { 4120b57cec5SDimitry Andric LocalStaticGuardIdentifierNode() 4130b57cec5SDimitry Andric : IdentifierNode(NodeKind::LocalStaticGuardIdentifier) {} 4140b57cec5SDimitry Andric 4150b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric bool IsThread = false; 4180b57cec5SDimitry Andric uint32_t ScopeIndex = 0; 4190b57cec5SDimitry Andric }; 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andric struct ConversionOperatorIdentifierNode : public IdentifierNode { 4220b57cec5SDimitry Andric ConversionOperatorIdentifierNode() 4230b57cec5SDimitry Andric : IdentifierNode(NodeKind::ConversionOperatorIdentifier) {} 4240b57cec5SDimitry Andric 4250b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andric // The type that this operator converts too. 4280b57cec5SDimitry Andric TypeNode *TargetType = nullptr; 4290b57cec5SDimitry Andric }; 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andric struct StructorIdentifierNode : public IdentifierNode { 4320b57cec5SDimitry Andric StructorIdentifierNode() : IdentifierNode(NodeKind::StructorIdentifier) {} 4330b57cec5SDimitry Andric explicit StructorIdentifierNode(bool IsDestructor) 4340b57cec5SDimitry Andric : IdentifierNode(NodeKind::StructorIdentifier), 4350b57cec5SDimitry Andric IsDestructor(IsDestructor) {} 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andric // The name of the class that this is a structor of. 4400b57cec5SDimitry Andric IdentifierNode *Class = nullptr; 4410b57cec5SDimitry Andric bool IsDestructor = false; 4420b57cec5SDimitry Andric }; 4430b57cec5SDimitry Andric 4440b57cec5SDimitry Andric struct ThunkSignatureNode : public FunctionSignatureNode { 4450b57cec5SDimitry Andric ThunkSignatureNode() : FunctionSignatureNode(NodeKind::ThunkSignature) {} 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 4480b57cec5SDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 4490b57cec5SDimitry Andric 4500b57cec5SDimitry Andric struct ThisAdjustor { 4510b57cec5SDimitry Andric uint32_t StaticOffset = 0; 4520b57cec5SDimitry Andric int32_t VBPtrOffset = 0; 4530b57cec5SDimitry Andric int32_t VBOffsetOffset = 0; 4540b57cec5SDimitry Andric int32_t VtordispOffset = 0; 4550b57cec5SDimitry Andric }; 4560b57cec5SDimitry Andric 4570b57cec5SDimitry Andric ThisAdjustor ThisAdjust; 4580b57cec5SDimitry Andric }; 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andric struct PointerTypeNode : public TypeNode { 4610b57cec5SDimitry Andric PointerTypeNode() : TypeNode(NodeKind::PointerType) {} 4620b57cec5SDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 4630b57cec5SDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andric // Is this a pointer, reference, or rvalue-reference? 4660b57cec5SDimitry Andric PointerAffinity Affinity = PointerAffinity::None; 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric // If this is a member pointer, this is the class that the member is in. 4690b57cec5SDimitry Andric QualifiedNameNode *ClassParent = nullptr; 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andric // Represents a type X in "a pointer to X", "a reference to X", or 4720b57cec5SDimitry Andric // "rvalue-reference to X" 4730b57cec5SDimitry Andric TypeNode *Pointee = nullptr; 4740b57cec5SDimitry Andric }; 4750b57cec5SDimitry Andric 4760b57cec5SDimitry Andric struct TagTypeNode : public TypeNode { 4770b57cec5SDimitry Andric explicit TagTypeNode(TagKind Tag) : TypeNode(NodeKind::TagType), Tag(Tag) {} 4780b57cec5SDimitry Andric 4795ffd83dbSDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 4805ffd83dbSDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric QualifiedNameNode *QualifiedName = nullptr; 4830b57cec5SDimitry Andric TagKind Tag; 4840b57cec5SDimitry Andric }; 4850b57cec5SDimitry Andric 4860b57cec5SDimitry Andric struct ArrayTypeNode : public TypeNode { 4870b57cec5SDimitry Andric ArrayTypeNode() : TypeNode(NodeKind::ArrayType) {} 4880b57cec5SDimitry Andric 4895ffd83dbSDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 4905ffd83dbSDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andric void outputDimensionsImpl(OutputStream &OS, OutputFlags Flags) const; 4930b57cec5SDimitry Andric void outputOneDimension(OutputStream &OS, OutputFlags Flags, Node *N) const; 4940b57cec5SDimitry Andric 4950b57cec5SDimitry Andric // A list of array dimensions. e.g. [3,4,5] in `int Foo[3][4][5]` 4960b57cec5SDimitry Andric NodeArrayNode *Dimensions = nullptr; 4970b57cec5SDimitry Andric 4980b57cec5SDimitry Andric // The type of array element. 4990b57cec5SDimitry Andric TypeNode *ElementType = nullptr; 5000b57cec5SDimitry Andric }; 5010b57cec5SDimitry Andric 5020b57cec5SDimitry Andric struct IntrinsicNode : public TypeNode { 5030b57cec5SDimitry Andric IntrinsicNode() : TypeNode(NodeKind::IntrinsicType) {} 5040b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override {} 5050b57cec5SDimitry Andric }; 5060b57cec5SDimitry Andric 5070b57cec5SDimitry Andric struct CustomTypeNode : public TypeNode { 5080b57cec5SDimitry Andric CustomTypeNode() : TypeNode(NodeKind::Custom) {} 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andric void outputPre(OutputStream &OS, OutputFlags Flags) const override; 5110b57cec5SDimitry Andric void outputPost(OutputStream &OS, OutputFlags Flags) const override; 5120b57cec5SDimitry Andric 513480093f4SDimitry Andric IdentifierNode *Identifier = nullptr; 5140b57cec5SDimitry Andric }; 5150b57cec5SDimitry Andric 5160b57cec5SDimitry Andric struct NodeArrayNode : public Node { 5170b57cec5SDimitry Andric NodeArrayNode() : Node(NodeKind::NodeArray) {} 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags, StringView Separator) const; 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andric Node **Nodes = nullptr; 5240b57cec5SDimitry Andric size_t Count = 0; 5250b57cec5SDimitry Andric }; 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andric struct QualifiedNameNode : public Node { 5280b57cec5SDimitry Andric QualifiedNameNode() : Node(NodeKind::QualifiedName) {} 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5310b57cec5SDimitry Andric 5320b57cec5SDimitry Andric NodeArrayNode *Components = nullptr; 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric IdentifierNode *getUnqualifiedIdentifier() { 5350b57cec5SDimitry Andric Node *LastComponent = Components->Nodes[Components->Count - 1]; 5360b57cec5SDimitry Andric return static_cast<IdentifierNode *>(LastComponent); 5370b57cec5SDimitry Andric } 5380b57cec5SDimitry Andric }; 5390b57cec5SDimitry Andric 5400b57cec5SDimitry Andric struct TemplateParameterReferenceNode : public Node { 5410b57cec5SDimitry Andric TemplateParameterReferenceNode() 5420b57cec5SDimitry Andric : Node(NodeKind::TemplateParameterReference) {} 5430b57cec5SDimitry Andric 5440b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric SymbolNode *Symbol = nullptr; 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andric int ThunkOffsetCount = 0; 5490b57cec5SDimitry Andric std::array<int64_t, 3> ThunkOffsets; 5500b57cec5SDimitry Andric PointerAffinity Affinity = PointerAffinity::None; 5510b57cec5SDimitry Andric bool IsMemberPointer = false; 5520b57cec5SDimitry Andric }; 5530b57cec5SDimitry Andric 5540b57cec5SDimitry Andric struct IntegerLiteralNode : public Node { 5550b57cec5SDimitry Andric IntegerLiteralNode() : Node(NodeKind::IntegerLiteral) {} 5560b57cec5SDimitry Andric IntegerLiteralNode(uint64_t Value, bool IsNegative) 5570b57cec5SDimitry Andric : Node(NodeKind::IntegerLiteral), Value(Value), IsNegative(IsNegative) {} 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5600b57cec5SDimitry Andric 5610b57cec5SDimitry Andric uint64_t Value = 0; 5620b57cec5SDimitry Andric bool IsNegative = false; 5630b57cec5SDimitry Andric }; 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andric struct RttiBaseClassDescriptorNode : public IdentifierNode { 5660b57cec5SDimitry Andric RttiBaseClassDescriptorNode() 5670b57cec5SDimitry Andric : IdentifierNode(NodeKind::RttiBaseClassDescriptor) {} 5680b57cec5SDimitry Andric 5690b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andric uint32_t NVOffset = 0; 5720b57cec5SDimitry Andric int32_t VBPtrOffset = 0; 5730b57cec5SDimitry Andric uint32_t VBTableOffset = 0; 5740b57cec5SDimitry Andric uint32_t Flags = 0; 5750b57cec5SDimitry Andric }; 5760b57cec5SDimitry Andric 5770b57cec5SDimitry Andric struct SymbolNode : public Node { 5780b57cec5SDimitry Andric explicit SymbolNode(NodeKind K) : Node(K) {} 5790b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5800b57cec5SDimitry Andric QualifiedNameNode *Name = nullptr; 5810b57cec5SDimitry Andric }; 5820b57cec5SDimitry Andric 5830b57cec5SDimitry Andric struct SpecialTableSymbolNode : public SymbolNode { 5840b57cec5SDimitry Andric explicit SpecialTableSymbolNode() 5850b57cec5SDimitry Andric : SymbolNode(NodeKind::SpecialTableSymbol) {} 5860b57cec5SDimitry Andric 5870b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5880b57cec5SDimitry Andric QualifiedNameNode *TargetName = nullptr; 589480093f4SDimitry Andric Qualifiers Quals = Qualifiers::Q_None; 5900b57cec5SDimitry Andric }; 5910b57cec5SDimitry Andric 5920b57cec5SDimitry Andric struct LocalStaticGuardVariableNode : public SymbolNode { 5930b57cec5SDimitry Andric LocalStaticGuardVariableNode() 5940b57cec5SDimitry Andric : SymbolNode(NodeKind::LocalStaticGuardVariable) {} 5950b57cec5SDimitry Andric 5960b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 5970b57cec5SDimitry Andric 5980b57cec5SDimitry Andric bool IsVisible = false; 5990b57cec5SDimitry Andric }; 6000b57cec5SDimitry Andric 6010b57cec5SDimitry Andric struct EncodedStringLiteralNode : public SymbolNode { 6020b57cec5SDimitry Andric EncodedStringLiteralNode() : SymbolNode(NodeKind::EncodedStringLiteral) {} 6030b57cec5SDimitry Andric 6040b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 6050b57cec5SDimitry Andric 6060b57cec5SDimitry Andric StringView DecodedString; 6070b57cec5SDimitry Andric bool IsTruncated = false; 6080b57cec5SDimitry Andric CharKind Char = CharKind::Char; 6090b57cec5SDimitry Andric }; 6100b57cec5SDimitry Andric 6110b57cec5SDimitry Andric struct VariableSymbolNode : public SymbolNode { 6120b57cec5SDimitry Andric VariableSymbolNode() : SymbolNode(NodeKind::VariableSymbol) {} 6130b57cec5SDimitry Andric 6140b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andric StorageClass SC = StorageClass::None; 6170b57cec5SDimitry Andric TypeNode *Type = nullptr; 6180b57cec5SDimitry Andric }; 6190b57cec5SDimitry Andric 6200b57cec5SDimitry Andric struct FunctionSymbolNode : public SymbolNode { 6210b57cec5SDimitry Andric FunctionSymbolNode() : SymbolNode(NodeKind::FunctionSymbol) {} 6220b57cec5SDimitry Andric 6230b57cec5SDimitry Andric void output(OutputStream &OS, OutputFlags Flags) const override; 6240b57cec5SDimitry Andric 6250b57cec5SDimitry Andric FunctionSignatureNode *Signature = nullptr; 6260b57cec5SDimitry Andric }; 6270b57cec5SDimitry Andric 6280b57cec5SDimitry Andric } // namespace ms_demangle 6290b57cec5SDimitry Andric } // namespace llvm 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric #endif 632