From: Zachary Turner Date: Wed, 2 Jan 2019 18:33:12 +0000 (+0000) Subject: [MS Demangler] Add a flag for dumping types without tag specifier. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed72a6443a3697cc05138bf87688e8e4478e0fdb;p=llvm [MS Demangler] Add a flag for dumping types without tag specifier. Sometimes it's useful to be able to output demangled names without tag specifiers like "struct", "class", etc. This patch adds a flag enabling this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350241 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Demangle/MicrosoftDemangleNodes.h b/include/llvm/Demangle/MicrosoftDemangleNodes.h index 1eca6762475..e4802ae314d 100644 --- a/include/llvm/Demangle/MicrosoftDemangleNodes.h +++ b/include/llvm/Demangle/MicrosoftDemangleNodes.h @@ -53,6 +53,7 @@ enum class ReferenceKind : uint8_t { None, LValueRef, RValueRef }; enum OutputFlags { OF_Default = 0, OF_NoCallingConvention = 1, + OF_NoTagSpecifier = 2, }; // Types @@ -235,7 +236,7 @@ struct Node { virtual void output(OutputStream &OS, OutputFlags Flags) const = 0; - std::string toString() const; + std::string toString(OutputFlags Flags = OF_Default) const; private: NodeKind Kind; diff --git a/lib/Demangle/MicrosoftDemangleNodes.cpp b/lib/Demangle/MicrosoftDemangleNodes.cpp index a588dca5b7b..49518ef57d6 100644 --- a/lib/Demangle/MicrosoftDemangleNodes.cpp +++ b/lib/Demangle/MicrosoftDemangleNodes.cpp @@ -114,10 +114,10 @@ static void outputCallingConvention(OutputStream &OS, CallingConv CC) { } } -std::string Node::toString() const { +std::string Node::toString(OutputFlags Flags) const { OutputStream OS; initializeOutputStream(nullptr, nullptr, OS, 1024); - this->output(OS, llvm::ms_demangle::OF_Default); + this->output(OS, Flags); OS << '\0'; return {OS.getBuffer()}; } @@ -510,13 +510,15 @@ void PointerTypeNode::outputPost(OutputStream &OS, OutputFlags Flags) const { } void TagTypeNode::outputPre(OutputStream &OS, OutputFlags Flags) const { - switch (Tag) { - OUTPUT_ENUM_CLASS_VALUE(TagKind, Class, "class"); - OUTPUT_ENUM_CLASS_VALUE(TagKind, Struct, "struct"); - OUTPUT_ENUM_CLASS_VALUE(TagKind, Union, "union"); - OUTPUT_ENUM_CLASS_VALUE(TagKind, Enum, "enum"); + if (!(Flags & OF_NoTagSpecifier)) { + switch (Tag) { + OUTPUT_ENUM_CLASS_VALUE(TagKind, Class, "class"); + OUTPUT_ENUM_CLASS_VALUE(TagKind, Struct, "struct"); + OUTPUT_ENUM_CLASS_VALUE(TagKind, Union, "union"); + OUTPUT_ENUM_CLASS_VALUE(TagKind, Enum, "enum"); + } + OS << " "; } - OS << " "; QualifiedName->output(OS, Flags); outputQualifiers(OS, Quals, true, false); }