diff options
author | Zachary Turner <zturner@google.com> | 2018-11-01 15:07:32 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-11-01 15:07:32 +0000 |
commit | 7ba905635f44b646853f7ac0a73438edec7a88c5 (patch) | |
tree | 345636a52f181124665db45af5b143337d7e91ae /llvm/lib/Demangle/MicrosoftDemangle.cpp | |
parent | d5d72243558272a3778201f505412c64357c714a (diff) | |
download | llvm-7ba905635f44b646853f7ac0a73438edec7a88c5.zip llvm-7ba905635f44b646853f7ac0a73438edec7a88c5.tar.gz llvm-7ba905635f44b646853f7ac0a73438edec7a88c5.tar.bz2 |
[MS Demangler] Expose the Demangler AST publicly.
LLDB would like to use this in order to build a clang AST from
a mangled name.
This is NFC otherwise.
llvm-svn: 345837
Diffstat (limited to 'llvm/lib/Demangle/MicrosoftDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 167 |
1 files changed, 12 insertions, 155 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index 59fb7c9..882e4a57 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -14,8 +14,9 @@ // //===----------------------------------------------------------------------===// -#include "MicrosoftDemangleNodes.h" +#include "llvm/Demangle/MicrosoftDemangle.h" #include "llvm/Demangle/Demangle.h" +#include "llvm/Demangle/MicrosoftDemangleNodes.h" #include "llvm/Demangle/Compiler.h" #include "llvm/Demangle/StringView.h" @@ -33,21 +34,12 @@ static bool startsWithDigit(StringView S) { return !S.empty() && std::isdigit(S.front()); } -enum class QualifierMangleMode { Drop, Mangle, Result }; struct NodeList { Node *N = nullptr; NodeList *Next = nullptr; }; -enum class FunctionIdentifierCodeGroup { Basic, Under, DoubleUnder }; - -enum NameBackrefBehavior : uint8_t { - NBB_None = 0, // don't save any names as backrefs. - NBB_Template = 1 << 0, // save template instanations. - NBB_Simple = 1 << 1, // save simple names. -}; - static bool isMemberPointer(StringView MangledName) { switch (MangledName.popFront()) { case '$': @@ -246,151 +238,6 @@ demanglePointerCVQualifiers(StringView &MangledName) { return std::make_pair(Q_None, PointerAffinity::Pointer); } -namespace { - -struct BackrefContext { - static constexpr size_t Max = 10; - - TypeNode *FunctionParams[Max]; - size_t FunctionParamCount = 0; - - // The first 10 BackReferences in a mangled name can be back-referenced by - // special name @[0-9]. This is a storage for the first 10 BackReferences. - NamedIdentifierNode *Names[Max]; - size_t NamesCount = 0; -}; - -// Demangler class takes the main role in demangling symbols. -// It has a set of functions to parse mangled symbols into Type instances. -// It also has a set of functions to cnovert Type instances to strings. -class Demangler { -public: - Demangler() = default; - virtual ~Demangler() = default; - - // You are supposed to call parse() first and then check if error is true. If - // it is false, call output() to write the formatted name to the given stream. - SymbolNode *parse(StringView &MangledName); - - // True if an error occurred. - bool Error = false; - - void dumpBackReferences(); - -private: - SymbolNode *demangleEncodedSymbol(StringView &MangledName, - QualifiedNameNode *QN); - - VariableSymbolNode *demangleVariableEncoding(StringView &MangledName, - StorageClass SC); - FunctionSymbolNode *demangleFunctionEncoding(StringView &MangledName); - - Qualifiers demanglePointerExtQualifiers(StringView &MangledName); - - // Parser functions. This is a recursive-descent parser. - TypeNode *demangleType(StringView &MangledName, QualifierMangleMode QMM); - PrimitiveTypeNode *demanglePrimitiveType(StringView &MangledName); - CustomTypeNode *demangleCustomType(StringView &MangledName); - TagTypeNode *demangleClassType(StringView &MangledName); - PointerTypeNode *demanglePointerType(StringView &MangledName); - PointerTypeNode *demangleMemberPointerType(StringView &MangledName); - FunctionSignatureNode *demangleFunctionType(StringView &MangledName, - bool HasThisQuals); - - ArrayTypeNode *demangleArrayType(StringView &MangledName); - - NodeArrayNode *demangleTemplateParameterList(StringView &MangledName); - NodeArrayNode *demangleFunctionParameterList(StringView &MangledName); - - std::pair<uint64_t, bool> demangleNumber(StringView &MangledName); - uint64_t demangleUnsigned(StringView &MangledName); - int64_t demangleSigned(StringView &MangledName); - - void memorizeString(StringView s); - void memorizeIdentifier(IdentifierNode *Identifier); - - /// Allocate a copy of \p Borrowed into memory that we own. - StringView copyString(StringView Borrowed); - - QualifiedNameNode *demangleFullyQualifiedTypeName(StringView &MangledName); - QualifiedNameNode *demangleFullyQualifiedSymbolName(StringView &MangledName); - - IdentifierNode *demangleUnqualifiedTypeName(StringView &MangledName, - bool Memorize); - IdentifierNode *demangleUnqualifiedSymbolName(StringView &MangledName, - NameBackrefBehavior NBB); - - QualifiedNameNode *demangleNameScopeChain(StringView &MangledName, - IdentifierNode *UnqualifiedName); - IdentifierNode *demangleNameScopePiece(StringView &MangledName); - - NamedIdentifierNode *demangleBackRefName(StringView &MangledName); - IdentifierNode *demangleTemplateInstantiationName(StringView &MangledName, - NameBackrefBehavior NBB); - IdentifierNode *demangleFunctionIdentifierCode(StringView &MangledName); - IdentifierNode * - demangleFunctionIdentifierCode(StringView &MangledName, - FunctionIdentifierCodeGroup Group); - StructorIdentifierNode *demangleStructorIdentifier(StringView &MangledName, - bool IsDestructor); - ConversionOperatorIdentifierNode * - demangleConversionOperatorIdentifier(StringView &MangledName); - LiteralOperatorIdentifierNode * - demangleLiteralOperatorIdentifier(StringView &MangledName); - - SymbolNode *demangleSpecialIntrinsic(StringView &MangledName); - SpecialTableSymbolNode * - demangleSpecialTableSymbolNode(StringView &MangledName, - SpecialIntrinsicKind SIK); - LocalStaticGuardVariableNode * - demangleLocalStaticGuard(StringView &MangledName); - VariableSymbolNode *demangleUntypedVariable(ArenaAllocator &Arena, - StringView &MangledName, - StringView VariableName); - VariableSymbolNode * - demangleRttiBaseClassDescriptorNode(ArenaAllocator &Arena, - StringView &MangledName); - FunctionSymbolNode *demangleInitFiniStub(StringView &MangledName, - bool IsDestructor); - - NamedIdentifierNode *demangleSimpleName(StringView &MangledName, - bool Memorize); - NamedIdentifierNode *demangleAnonymousNamespaceName(StringView &MangledName); - NamedIdentifierNode *demangleLocallyScopedNamePiece(StringView &MangledName); - EncodedStringLiteralNode *demangleStringLiteral(StringView &MangledName); - FunctionSymbolNode *demangleVcallThunkNode(StringView &MangledName); - - StringView demangleSimpleString(StringView &MangledName, bool Memorize); - - FuncClass demangleFunctionClass(StringView &MangledName); - CallingConv demangleCallingConvention(StringView &MangledName); - StorageClass demangleVariableStorageClass(StringView &MangledName); - void demangleThrowSpecification(StringView &MangledName); - wchar_t demangleWcharLiteral(StringView &MangledName); - uint8_t demangleCharLiteral(StringView &MangledName); - - std::pair<Qualifiers, bool> demangleQualifiers(StringView &MangledName); - - // Memory allocator. - ArenaAllocator Arena; - - // A single type uses one global back-ref table for all function params. - // This means back-refs can even go "into" other types. Examples: - // - // // Second int* is a back-ref to first. - // void foo(int *, int*); - // - // // Second int* is not a back-ref to first (first is not a function param). - // int* foo(int*); - // - // // Second int* is a back-ref to first (ALL function types share the same - // // back-ref map. - // using F = void(*)(int*); - // F G(int *); - BackrefContext Backrefs; -}; -} // namespace - StringView Demangler::copyString(StringView Borrowed) { char *Stable = Arena.allocUnalignedBuffer(Borrowed.size() + 1); std::strcpy(Stable, Borrowed.begin()); @@ -886,6 +733,16 @@ SymbolNode *Demangler::parse(StringView &MangledName) { return Symbol; } +TagTypeNode *Demangler::parseTagUniqueName(StringView &MangledName) { + if (!MangledName.consumeFront(".?A")) + return nullptr; + MangledName.consumeFront(".?A"); + if (MangledName.empty()) + return nullptr; + + return demangleClassType(MangledName); +} + // <type-encoding> ::= <storage-class> <variable-type> // <storage-class> ::= 0 # private static member // ::= 1 # protected static member |