]> granicus.if.org Git - llvm/commitdiff
[MS Demangler] Add a flag for dumping types without tag specifier.
authorZachary Turner <zturner@google.com>
Wed, 2 Jan 2019 18:33:12 +0000 (18:33 +0000)
committerZachary Turner <zturner@google.com>
Wed, 2 Jan 2019 18:33:12 +0000 (18:33 +0000)
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

include/llvm/Demangle/MicrosoftDemangleNodes.h
lib/Demangle/MicrosoftDemangleNodes.cpp

index 1eca6762475a0f502fcee27f39ffadd16648408a..e4802ae314d9916b7d365e22f255c1bcba14a9e7 100644 (file)
@@ -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;
index a588dca5b7ba338bdf5498965099833b47d886c0..49518ef57d6ccb47b6edc4e0d54d75629ea0c175 100644 (file)
@@ -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);
 }