diff --git a/lldb/source/Core/Mangled.cpp b/lldb/source/Core/Mangled.cpp --- a/lldb/source/Core/Mangled.cpp +++ b/lldb/source/Core/Mangled.cpp @@ -131,9 +131,9 @@ static char *GetMSVCDemangledStr(const char *M) { char *demangled_cstr = llvm::microsoftDemangle( M, nullptr, nullptr, nullptr, nullptr, - llvm::MSDemangleFlags(llvm::MSDF_NoAccessSpecifier | - llvm::MSDF_NoCallingConvention | - llvm::MSDF_NoMemberType)); + llvm::MSDemangleFlags( + llvm::MSDF_NoAccessSpecifier | llvm::MSDF_NoCallingConvention | + llvm::MSDF_NoMemberType | llvm::MSDF_NoVariableType)); if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) { if (demangled_cstr && demangled_cstr[0]) diff --git a/llvm/include/llvm/Demangle/Demangle.h b/llvm/include/llvm/Demangle/Demangle.h --- a/llvm/include/llvm/Demangle/Demangle.h +++ b/llvm/include/llvm/Demangle/Demangle.h @@ -38,6 +38,7 @@ MSDF_NoCallingConvention = 1 << 2, MSDF_NoReturnType = 1 << 3, MSDF_NoMemberType = 1 << 4, + MSDF_NoVariableType = 1 << 5, }; /// Demangles the Microsoft symbol pointed at by mangled_name and returns it. diff --git a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h --- a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h +++ b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h @@ -80,6 +80,7 @@ OF_NoAccessSpecifier = 4, OF_NoMemberType = 8, OF_NoReturnType = 16, + OF_NoVariableType = 32, }; // Types diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -2361,6 +2361,8 @@ OF = OutputFlags(OF | OF_NoReturnType); if (Flags & MSDF_NoMemberType) OF = OutputFlags(OF | OF_NoMemberType); + if (Flags & MSDF_NoVariableType) + OF = OutputFlags(OF | OF_NoVariableType); int InternalStatus = demangle_success; if (D.Error) diff --git a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp --- a/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangleNodes.cpp @@ -613,12 +613,12 @@ if (!(Flags & OF_NoMemberType) && IsStatic) OS << "static "; - if (Type) { + if (!(Flags & OF_NoVariableType) && Type) { Type->outputPre(OS, Flags); outputSpaceIfNecessary(OS); } Name->output(OS, Flags); - if (Type) + if (!(Flags & OF_NoVariableType) && Type) Type->outputPost(OS, Flags); } diff --git a/llvm/test/Demangle/ms-options.test b/llvm/test/Demangle/ms-options.test --- a/llvm/test/Demangle/ms-options.test +++ b/llvm/test/Demangle/ms-options.test @@ -1,14 +1,43 @@ -; RUN: llvm-undname < %s | FileCheck %s -; RUN: llvm-undname --no-calling-convention < %s | FileCheck %s --check-prefix=CHECK-NO-CALLING-CONV -; RUN: llvm-undname --no-return-type < %s | FileCheck %s --check-prefix=CHECK-NO-RETURN -; RUN: llvm-undname --no-access-specifier < %s | FileCheck %s --check-prefix=CHECK-NO-ACCESS -; RUN: llvm-undname --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-MEMBER-TYPE -; RUN: llvm-undname --no-calling-convention --no-return-type --no-access-specifier --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-ALL - -?func@MyClass@@UEAAHHH@Z -; CHECK: public: virtual int __cdecl MyClass::func(int, int) -; CHECK-NO-CALLING-CONV: public: virtual int MyClass::func(int, int) -; CHECK-NO-RETURN: public: virtual __cdecl MyClass::func(int, int) -; CHECK-NO-ACCESS: {{^}}virtual int __cdecl MyClass::func(int, int) -; CHECK-NO-MEMBER-TYPE: public: int __cdecl MyClass::func(int, int) -; CHECK-NO-ALL: {{^}}MyClass::func(int, int) +; RUN: llvm-undname < %s | FileCheck %s +; RUN: llvm-undname --no-calling-convention < %s | FileCheck %s --check-prefix=CHECK-NO-CALLING-CONV +; RUN: llvm-undname --no-return-type < %s | FileCheck %s --check-prefix=CHECK-NO-RETURN +; RUN: llvm-undname --no-access-specifier < %s | FileCheck %s --check-prefix=CHECK-NO-ACCESS +; RUN: llvm-undname --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-MEMBER-TYPE +; RUN: llvm-undname --no-variable-type < %s | FileCheck %s --check-prefix=CHECK-NO-VARIABLE-TYPE +; RUN: llvm-undname --no-calling-convention --no-return-type --no-access-specifier --no-member-type --no-variable-type < %s | FileCheck %s --check-prefix=CHECK-NO-ALL + +?func@MyClass@@UEAAHHH@Z +; CHECK: public: virtual int __cdecl MyClass::func(int, int) +; CHECK-NO-CALLING-CONV: public: virtual int MyClass::func(int, int) +; CHECK-NO-RETURN: public: virtual __cdecl MyClass::func(int, int) +; CHECK-NO-ACCESS: {{^}}virtual int __cdecl MyClass::func(int, int) +; CHECK-NO-MEMBER-TYPE: public: int __cdecl MyClass::func(int, int) +; CHECK-NO-VARIABLE-TYPE: public: virtual int __cdecl MyClass::func(int, int) +; CHECK-NO-ALL: {{^}}MyClass::func(int, int) + +?array2d@@3PAY09HA +; CHECK: int (*array2d)[10] +; CHECK-NO-CALLING-CONV: int (*array2d)[10] +; CHECK-NO-RETURN: int (*array2d)[10] +; CHECK-NO-ACCESS: int (*array2d)[10] +; CHECK-NO-MEMBER-TYPE: int (*array2d)[10] +; CHECK-NO-VARIABLE-TYPE: array2d +; CHECK-NO-ALL: array2d + +?a@abc@@3PAY09HA +; CHECK: int (*abc::a)[10] +; CHECK-NO-CALLING-CONV: int (*abc::a)[10] +; CHECK-NO-RETURN: int (*abc::a)[10] +; CHECK-NO-ACCESS: int (*abc::a)[10] +; CHECK-NO-MEMBER-TYPE: int (*abc::a)[10] +; CHECK-NO-VARIABLE-TYPE: abc::a +; CHECK-NO-ALL: abc::a + +?x@@3PEAEEA +; CHECK: unsigned char *x +; CHECK-NO-CALLING-CONV: unsigned char *x +; CHECK-NO-RETURN: unsigned char *x +; CHECK-NO-ACCESS: unsigned char *x +; CHECK-NO-MEMBER-TYPE: unsigned char *x +; CHECK-NO-VARIABLE-TYPE: x +; CHECK-NO-ALL: x diff --git a/llvm/tools/llvm-undname/llvm-undname.cpp b/llvm/tools/llvm-undname/llvm-undname.cpp --- a/llvm/tools/llvm-undname/llvm-undname.cpp +++ b/llvm/tools/llvm-undname/llvm-undname.cpp @@ -46,6 +46,9 @@ cl::opt NoMemberType("no-member-type", cl::Optional, cl::desc("skip member types"), cl::Hidden, cl::init(false), cl::cat(UndNameCategory)); +cl::opt NoVariableType("no-variable-type", cl::Optional, + cl::desc("skip variable types"), cl::Hidden, + cl::init(false), cl::cat(UndNameCategory)); cl::opt RawFile("raw-file", cl::Optional, cl::desc("for fuzzer data"), cl::Hidden, cl::cat(UndNameCategory)); @@ -68,6 +71,8 @@ Flags = MSDemangleFlags(Flags | MSDF_NoReturnType); if (NoMemberType) Flags = MSDemangleFlags(Flags | MSDF_NoMemberType); + if (NoVariableType) + Flags = MSDemangleFlags(Flags | MSDF_NoVariableType); size_t NRead; char *ResultBuf =