[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.

llvm-svn: 350241
This commit is contained in:
Zachary Turner 2019-01-02 18:33:12 +00:00
parent b3130b4fdf
commit ba797b6dae
2 changed files with 12 additions and 9 deletions

View 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;

View 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);
}