123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- MicrosoftDemangleNodes.h ---------------------------------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the AST nodes used in the MSVC demangler.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
- #define LLVM_DEMANGLE_MICROSOFTDEMANGLENODES_H
- #include "llvm/Demangle/StringView.h"
- #include <array>
- #include <cstdint>
- #include <string>
- namespace llvm {
- namespace itanium_demangle {
- class OutputBuffer;
- }
- }
- using llvm::itanium_demangle::OutputBuffer;
- using llvm::itanium_demangle::StringView;
- namespace llvm {
- namespace ms_demangle {
- // Storage classes
- enum Qualifiers : uint8_t {
- Q_None = 0,
- Q_Const = 1 << 0,
- Q_Volatile = 1 << 1,
- Q_Far = 1 << 2,
- Q_Huge = 1 << 3,
- Q_Unaligned = 1 << 4,
- Q_Restrict = 1 << 5,
- Q_Pointer64 = 1 << 6
- };
- enum class StorageClass : uint8_t {
- None,
- PrivateStatic,
- ProtectedStatic,
- PublicStatic,
- Global,
- FunctionLocalStatic,
- };
- enum class PointerAffinity { None, Pointer, Reference, RValueReference };
- enum class FunctionRefQualifier { None, Reference, RValueReference };
- // Calling conventions
- enum class CallingConv : uint8_t {
- None,
- Cdecl,
- Pascal,
- Thiscall,
- Stdcall,
- Fastcall,
- Clrcall,
- Eabi,
- Vectorcall,
- Regcall,
- Swift, // Clang-only
- SwiftAsync, // Clang-only
- };
- enum class ReferenceKind : uint8_t { None, LValueRef, RValueRef };
- enum OutputFlags {
- OF_Default = 0,
- OF_NoCallingConvention = 1,
- OF_NoTagSpecifier = 2,
- OF_NoAccessSpecifier = 4,
- OF_NoMemberType = 8,
- OF_NoReturnType = 16,
- OF_NoVariableType = 32,
- };
- // Types
- enum class PrimitiveKind {
- Void,
- Bool,
- Char,
- Schar,
- Uchar,
- Char8,
- Char16,
- Char32,
- Short,
- Ushort,
- Int,
- Uint,
- Long,
- Ulong,
- Int64,
- Uint64,
- Wchar,
- Float,
- Double,
- Ldouble,
- Nullptr,
- };
- enum class CharKind {
- Char,
- Char16,
- Char32,
- Wchar,
- };
- enum class IntrinsicFunctionKind : uint8_t {
- None,
- New, // ?2 # operator new
- Delete, // ?3 # operator delete
- Assign, // ?4 # operator=
- RightShift, // ?5 # operator>>
- LeftShift, // ?6 # operator<<
- LogicalNot, // ?7 # operator!
- Equals, // ?8 # operator==
- NotEquals, // ?9 # operator!=
- ArraySubscript, // ?A # operator[]
- Pointer, // ?C # operator->
- Dereference, // ?D # operator*
- Increment, // ?E # operator++
- Decrement, // ?F # operator--
- Minus, // ?G # operator-
- Plus, // ?H # operator+
- BitwiseAnd, // ?I # operator&
- MemberPointer, // ?J # operator->*
- Divide, // ?K # operator/
- Modulus, // ?L # operator%
- LessThan, // ?M operator<
- LessThanEqual, // ?N operator<=
- GreaterThan, // ?O operator>
- GreaterThanEqual, // ?P operator>=
- Comma, // ?Q operator,
- Parens, // ?R operator()
- BitwiseNot, // ?S operator~
- BitwiseXor, // ?T operator^
- BitwiseOr, // ?U operator|
- LogicalAnd, // ?V operator&&
- LogicalOr, // ?W operator||
- TimesEqual, // ?X operator*=
- PlusEqual, // ?Y operator+=
- MinusEqual, // ?Z operator-=
- DivEqual, // ?_0 operator/=
- ModEqual, // ?_1 operator%=
- RshEqual, // ?_2 operator>>=
- LshEqual, // ?_3 operator<<=
- BitwiseAndEqual, // ?_4 operator&=
- BitwiseOrEqual, // ?_5 operator|=
- BitwiseXorEqual, // ?_6 operator^=
- VbaseDtor, // ?_D # vbase destructor
- VecDelDtor, // ?_E # vector deleting destructor
- DefaultCtorClosure, // ?_F # default constructor closure
- ScalarDelDtor, // ?_G # scalar deleting destructor
- VecCtorIter, // ?_H # vector constructor iterator
- VecDtorIter, // ?_I # vector destructor iterator
- VecVbaseCtorIter, // ?_J # vector vbase constructor iterator
- VdispMap, // ?_K # virtual displacement map
- EHVecCtorIter, // ?_L # eh vector constructor iterator
- EHVecDtorIter, // ?_M # eh vector destructor iterator
- EHVecVbaseCtorIter, // ?_N # eh vector vbase constructor iterator
- CopyCtorClosure, // ?_O # copy constructor closure
- LocalVftableCtorClosure, // ?_T # local vftable constructor closure
- ArrayNew, // ?_U operator new[]
- ArrayDelete, // ?_V operator delete[]
- ManVectorCtorIter, // ?__A managed vector ctor iterator
- ManVectorDtorIter, // ?__B managed vector dtor iterator
- EHVectorCopyCtorIter, // ?__C EH vector copy ctor iterator
- EHVectorVbaseCopyCtorIter, // ?__D EH vector vbase copy ctor iterator
- VectorCopyCtorIter, // ?__G vector copy constructor iterator
- VectorVbaseCopyCtorIter, // ?__H vector vbase copy constructor iterator
- ManVectorVbaseCopyCtorIter, // ?__I managed vector vbase copy constructor
- CoAwait, // ?__L operator co_await
- Spaceship, // ?__M operator<=>
- MaxIntrinsic
- };
- enum class SpecialIntrinsicKind {
- None,
- Vftable,
- Vbtable,
- Typeof,
- VcallThunk,
- LocalStaticGuard,
- StringLiteralSymbol,
- UdtReturning,
- Unknown,
- DynamicInitializer,
- DynamicAtexitDestructor,
- RttiTypeDescriptor,
- RttiBaseClassDescriptor,
- RttiBaseClassArray,
- RttiClassHierarchyDescriptor,
- RttiCompleteObjLocator,
- LocalVftable,
- LocalStaticThreadGuard,
- };
- // Function classes
- enum FuncClass : uint16_t {
- FC_None = 0,
- FC_Public = 1 << 0,
- FC_Protected = 1 << 1,
- FC_Private = 1 << 2,
- FC_Global = 1 << 3,
- FC_Static = 1 << 4,
- FC_Virtual = 1 << 5,
- FC_Far = 1 << 6,
- FC_ExternC = 1 << 7,
- FC_NoParameterList = 1 << 8,
- FC_VirtualThisAdjust = 1 << 9,
- FC_VirtualThisAdjustEx = 1 << 10,
- FC_StaticThisAdjust = 1 << 11,
- };
- enum class TagKind { Class, Struct, Union, Enum };
- enum class NodeKind {
- Unknown,
- Md5Symbol,
- PrimitiveType,
- FunctionSignature,
- Identifier,
- NamedIdentifier,
- VcallThunkIdentifier,
- LocalStaticGuardIdentifier,
- IntrinsicFunctionIdentifier,
- ConversionOperatorIdentifier,
- DynamicStructorIdentifier,
- StructorIdentifier,
- LiteralOperatorIdentifier,
- ThunkSignature,
- PointerType,
- TagType,
- ArrayType,
- Custom,
- IntrinsicType,
- NodeArray,
- QualifiedName,
- TemplateParameterReference,
- EncodedStringLiteral,
- IntegerLiteral,
- RttiBaseClassDescriptor,
- LocalStaticGuardVariable,
- FunctionSymbol,
- VariableSymbol,
- SpecialTableSymbol
- };
- struct Node {
- explicit Node(NodeKind K) : Kind(K) {}
- virtual ~Node() = default;
- NodeKind kind() const { return Kind; }
- virtual void output(OutputBuffer &OB, OutputFlags Flags) const = 0;
- std::string toString(OutputFlags Flags = OF_Default) const;
- private:
- NodeKind Kind;
- };
- struct TypeNode;
- struct PrimitiveTypeNode;
- struct FunctionSignatureNode;
- struct IdentifierNode;
- struct NamedIdentifierNode;
- struct VcallThunkIdentifierNode;
- struct IntrinsicFunctionIdentifierNode;
- struct LiteralOperatorIdentifierNode;
- struct ConversionOperatorIdentifierNode;
- struct StructorIdentifierNode;
- struct ThunkSignatureNode;
- struct PointerTypeNode;
- struct ArrayTypeNode;
- struct TagTypeNode;
- struct NodeArrayNode;
- struct QualifiedNameNode;
- struct TemplateParameterReferenceNode;
- struct EncodedStringLiteralNode;
- struct IntegerLiteralNode;
- struct RttiBaseClassDescriptorNode;
- struct LocalStaticGuardVariableNode;
- struct SymbolNode;
- struct FunctionSymbolNode;
- struct VariableSymbolNode;
- struct SpecialTableSymbolNode;
- struct TypeNode : public Node {
- explicit TypeNode(NodeKind K) : Node(K) {}
- 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 {
- outputPre(OB, Flags);
- outputPost(OB, Flags);
- }
- Qualifiers Quals = Q_None;
- };
- struct PrimitiveTypeNode : public TypeNode {
- explicit PrimitiveTypeNode(PrimitiveKind K)
- : TypeNode(NodeKind::PrimitiveType), PrimKind(K) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override {}
- PrimitiveKind PrimKind;
- };
- struct FunctionSignatureNode : public TypeNode {
- explicit FunctionSignatureNode(NodeKind K) : TypeNode(K) {}
- FunctionSignatureNode() : TypeNode(NodeKind::FunctionSignature) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- // Valid if this FunctionTypeNode is the Pointee of a PointerType or
- // MemberPointerType.
- PointerAffinity Affinity = PointerAffinity::None;
- // The function's calling convention.
- CallingConv CallConvention = CallingConv::None;
- // Function flags (gloabl, public, etc)
- FuncClass FunctionClass = FC_Global;
- FunctionRefQualifier RefQualifier = FunctionRefQualifier::None;
- // The return type of the function.
- TypeNode *ReturnType = nullptr;
- // True if this is a C-style ... varargs function.
- bool IsVariadic = false;
- // Function parameters
- NodeArrayNode *Params = nullptr;
- // True if the function type is noexcept.
- bool IsNoexcept = false;
- };
- struct IdentifierNode : public Node {
- explicit IdentifierNode(NodeKind K) : Node(K) {}
- NodeArrayNode *TemplateParams = nullptr;
- protected:
- void outputTemplateParameters(OutputBuffer &OB, OutputFlags Flags) const;
- };
- struct VcallThunkIdentifierNode : public IdentifierNode {
- VcallThunkIdentifierNode() : IdentifierNode(NodeKind::VcallThunkIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- uint64_t OffsetInVTable = 0;
- };
- struct DynamicStructorIdentifierNode : public IdentifierNode {
- DynamicStructorIdentifierNode()
- : IdentifierNode(NodeKind::DynamicStructorIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- VariableSymbolNode *Variable = nullptr;
- QualifiedNameNode *Name = nullptr;
- bool IsDestructor = false;
- };
- struct NamedIdentifierNode : public IdentifierNode {
- NamedIdentifierNode() : IdentifierNode(NodeKind::NamedIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- StringView Name;
- };
- struct IntrinsicFunctionIdentifierNode : public IdentifierNode {
- explicit IntrinsicFunctionIdentifierNode(IntrinsicFunctionKind Operator)
- : IdentifierNode(NodeKind::IntrinsicFunctionIdentifier),
- Operator(Operator) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- IntrinsicFunctionKind Operator;
- };
- struct LiteralOperatorIdentifierNode : public IdentifierNode {
- LiteralOperatorIdentifierNode()
- : IdentifierNode(NodeKind::LiteralOperatorIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- StringView Name;
- };
- struct LocalStaticGuardIdentifierNode : public IdentifierNode {
- LocalStaticGuardIdentifierNode()
- : IdentifierNode(NodeKind::LocalStaticGuardIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- bool IsThread = false;
- uint32_t ScopeIndex = 0;
- };
- struct ConversionOperatorIdentifierNode : public IdentifierNode {
- ConversionOperatorIdentifierNode()
- : IdentifierNode(NodeKind::ConversionOperatorIdentifier) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- // The type that this operator converts too.
- TypeNode *TargetType = nullptr;
- };
- struct StructorIdentifierNode : public IdentifierNode {
- StructorIdentifierNode() : IdentifierNode(NodeKind::StructorIdentifier) {}
- explicit StructorIdentifierNode(bool IsDestructor)
- : IdentifierNode(NodeKind::StructorIdentifier),
- IsDestructor(IsDestructor) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- // The name of the class that this is a structor of.
- IdentifierNode *Class = nullptr;
- bool IsDestructor = false;
- };
- struct ThunkSignatureNode : public FunctionSignatureNode {
- ThunkSignatureNode() : FunctionSignatureNode(NodeKind::ThunkSignature) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- struct ThisAdjustor {
- uint32_t StaticOffset = 0;
- int32_t VBPtrOffset = 0;
- int32_t VBOffsetOffset = 0;
- int32_t VtordispOffset = 0;
- };
- ThisAdjustor ThisAdjust;
- };
- struct PointerTypeNode : public TypeNode {
- PointerTypeNode() : TypeNode(NodeKind::PointerType) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- // Is this a pointer, reference, or rvalue-reference?
- PointerAffinity Affinity = PointerAffinity::None;
- // If this is a member pointer, this is the class that the member is in.
- QualifiedNameNode *ClassParent = nullptr;
- // Represents a type X in "a pointer to X", "a reference to X", or
- // "rvalue-reference to X"
- TypeNode *Pointee = nullptr;
- };
- struct TagTypeNode : public TypeNode {
- explicit TagTypeNode(TagKind Tag) : TypeNode(NodeKind::TagType), Tag(Tag) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- QualifiedNameNode *QualifiedName = nullptr;
- TagKind Tag;
- };
- struct ArrayTypeNode : public TypeNode {
- ArrayTypeNode() : TypeNode(NodeKind::ArrayType) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputDimensionsImpl(OutputBuffer &OB, OutputFlags Flags) const;
- void outputOneDimension(OutputBuffer &OB, OutputFlags Flags, Node *N) const;
- // A list of array dimensions. e.g. [3,4,5] in `int Foo[3][4][5]`
- NodeArrayNode *Dimensions = nullptr;
- // The type of array element.
- TypeNode *ElementType = nullptr;
- };
- struct IntrinsicNode : public TypeNode {
- IntrinsicNode() : TypeNode(NodeKind::IntrinsicType) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override {}
- };
- struct CustomTypeNode : public TypeNode {
- CustomTypeNode() : TypeNode(NodeKind::Custom) {}
- void outputPre(OutputBuffer &OB, OutputFlags Flags) const override;
- void outputPost(OutputBuffer &OB, OutputFlags Flags) const override;
- IdentifierNode *Identifier = nullptr;
- };
- struct NodeArrayNode : public Node {
- NodeArrayNode() : Node(NodeKind::NodeArray) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- void output(OutputBuffer &OB, OutputFlags Flags, StringView Separator) const;
- Node **Nodes = nullptr;
- size_t Count = 0;
- };
- struct QualifiedNameNode : public Node {
- QualifiedNameNode() : Node(NodeKind::QualifiedName) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- NodeArrayNode *Components = nullptr;
- IdentifierNode *getUnqualifiedIdentifier() {
- Node *LastComponent = Components->Nodes[Components->Count - 1];
- return static_cast<IdentifierNode *>(LastComponent);
- }
- };
- struct TemplateParameterReferenceNode : public Node {
- TemplateParameterReferenceNode()
- : Node(NodeKind::TemplateParameterReference) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- SymbolNode *Symbol = nullptr;
- int ThunkOffsetCount = 0;
- std::array<int64_t, 3> ThunkOffsets;
- PointerAffinity Affinity = PointerAffinity::None;
- bool IsMemberPointer = false;
- };
- struct IntegerLiteralNode : public Node {
- IntegerLiteralNode() : Node(NodeKind::IntegerLiteral) {}
- IntegerLiteralNode(uint64_t Value, bool IsNegative)
- : Node(NodeKind::IntegerLiteral), Value(Value), IsNegative(IsNegative) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- uint64_t Value = 0;
- bool IsNegative = false;
- };
- struct RttiBaseClassDescriptorNode : public IdentifierNode {
- RttiBaseClassDescriptorNode()
- : IdentifierNode(NodeKind::RttiBaseClassDescriptor) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- uint32_t NVOffset = 0;
- int32_t VBPtrOffset = 0;
- uint32_t VBTableOffset = 0;
- uint32_t Flags = 0;
- };
- struct SymbolNode : public Node {
- explicit SymbolNode(NodeKind K) : Node(K) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- QualifiedNameNode *Name = nullptr;
- };
- struct SpecialTableSymbolNode : public SymbolNode {
- explicit SpecialTableSymbolNode()
- : SymbolNode(NodeKind::SpecialTableSymbol) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- QualifiedNameNode *TargetName = nullptr;
- Qualifiers Quals = Qualifiers::Q_None;
- };
- struct LocalStaticGuardVariableNode : public SymbolNode {
- LocalStaticGuardVariableNode()
- : SymbolNode(NodeKind::LocalStaticGuardVariable) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- bool IsVisible = false;
- };
- struct EncodedStringLiteralNode : public SymbolNode {
- EncodedStringLiteralNode() : SymbolNode(NodeKind::EncodedStringLiteral) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- StringView DecodedString;
- bool IsTruncated = false;
- CharKind Char = CharKind::Char;
- };
- struct VariableSymbolNode : public SymbolNode {
- VariableSymbolNode() : SymbolNode(NodeKind::VariableSymbol) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- StorageClass SC = StorageClass::None;
- TypeNode *Type = nullptr;
- };
- struct FunctionSymbolNode : public SymbolNode {
- FunctionSymbolNode() : SymbolNode(NodeKind::FunctionSymbol) {}
- void output(OutputBuffer &OB, OutputFlags Flags) const override;
- FunctionSignatureNode *Signature = nullptr;
- };
- } // namespace ms_demangle
- } // namespace llvm
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|