[lldb] change name demangling to be consistent between windows and linx
authorLasse Folger <lassefolger@google.com>
Tue, 19 Oct 2021 10:03:19 +0000 (12:03 +0200)
committerAndy Yankovsky <werat@google.com>
Tue, 19 Oct 2021 10:04:37 +0000 (12:04 +0200)
When printing names in lldb on windows these names contain the full type information while on linux only the name is contained.

This change introduces a flag in the Microsoft demangler to control if the type information should be included.
With the flag enabled demangled name contains only the qualified name, e.g:
without flag -> with flag
int (*array2d)[10] -> array2d
int (*abc::array2d)[10] -> abc::array2d
const int *x -> x

For globals there is a second inconsistency which is not yet addressed by this change. On linux globals (in global namespace) are prefixed with :: while on windows they are not.

Reviewed By: teemperor, rnk

Differential Revision: https://reviews.llvm.org/D111715

lldb/source/Core/Mangled.cpp
llvm/include/llvm/Demangle/Demangle.h
llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
llvm/lib/Demangle/MicrosoftDemangle.cpp
llvm/lib/Demangle/MicrosoftDemangleNodes.cpp
llvm/test/Demangle/ms-options.test
llvm/tools/llvm-undname/llvm-undname.cpp

index 35b1082..e36d412 100644 (file)
@@ -131,9 +131,9 @@ void Mangled::SetValue(ConstString name) {
 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])
index 8d61fa1..521795f 100644 (file)
@@ -38,6 +38,7 @@ enum MSDemangleFlags {
   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.
index 77446e9..7f3ee5a 100644 (file)
@@ -80,6 +80,7 @@ enum OutputFlags {
   OF_NoAccessSpecifier = 4,
   OF_NoMemberType = 8,
   OF_NoReturnType = 16,
+  OF_NoVariableType = 32,
 };
 
 // Types
index 3032071..15d7056 100644 (file)
@@ -2361,6 +2361,8 @@ char *llvm::microsoftDemangle(const char *MangledName, size_t *NMangled,
     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)
index 9fe157b..56a0737 100644 (file)
@@ -613,12 +613,12 @@ void VariableSymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
   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);
 }
 
index 1699ad6..94663a5 100644 (file)
@@ -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\r
+; RUN: llvm-undname --no-calling-convention < %s | FileCheck %s --check-prefix=CHECK-NO-CALLING-CONV\r
+; RUN: llvm-undname --no-return-type < %s | FileCheck %s --check-prefix=CHECK-NO-RETURN\r
+; RUN: llvm-undname --no-access-specifier < %s | FileCheck %s --check-prefix=CHECK-NO-ACCESS\r
+; RUN: llvm-undname --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-MEMBER-TYPE\r
+; RUN: llvm-undname --no-variable-type < %s | FileCheck %s --check-prefix=CHECK-NO-VARIABLE-TYPE\r
+; 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\r
+\r
+?func@MyClass@@UEAAHHH@Z\r
+; CHECK: public: virtual int __cdecl MyClass::func(int, int)\r
+; CHECK-NO-CALLING-CONV: public: virtual int MyClass::func(int, int)\r
+; CHECK-NO-RETURN: public: virtual __cdecl MyClass::func(int, int)\r
+; CHECK-NO-ACCESS: {{^}}virtual int __cdecl MyClass::func(int, int)\r
+; CHECK-NO-MEMBER-TYPE: public: int __cdecl MyClass::func(int, int)\r
+; CHECK-NO-VARIABLE-TYPE: public: virtual int __cdecl MyClass::func(int, int)\r
+; CHECK-NO-ALL: {{^}}MyClass::func(int, int)\r
+\r
+?array2d@@3PAY09HA\r
+; CHECK: int (*array2d)[10]\r
+; CHECK-NO-CALLING-CONV: int (*array2d)[10]\r
+; CHECK-NO-RETURN: int (*array2d)[10]\r
+; CHECK-NO-ACCESS: int (*array2d)[10]\r
+; CHECK-NO-MEMBER-TYPE: int (*array2d)[10]\r
+; CHECK-NO-VARIABLE-TYPE: array2d\r
+; CHECK-NO-ALL: array2d\r
+\r
+?a@abc@@3PAY09HA\r
+; CHECK: int (*abc::a)[10]\r
+; CHECK-NO-CALLING-CONV: int (*abc::a)[10]\r
+; CHECK-NO-RETURN: int (*abc::a)[10]\r
+; CHECK-NO-ACCESS: int (*abc::a)[10]\r
+; CHECK-NO-MEMBER-TYPE: int (*abc::a)[10]\r
+; CHECK-NO-VARIABLE-TYPE: abc::a\r
+; CHECK-NO-ALL: abc::a\r
+\r
+?x@@3PEAEEA\r
+; CHECK: unsigned char *x\r
+; CHECK-NO-CALLING-CONV: unsigned char *x\r
+; CHECK-NO-RETURN: unsigned char *x\r
+; CHECK-NO-ACCESS: unsigned char *x\r
+; CHECK-NO-MEMBER-TYPE: unsigned char *x\r
+; CHECK-NO-VARIABLE-TYPE: x\r
+; CHECK-NO-ALL: x\r
index c6714cf..cc35cdf 100644 (file)
@@ -46,6 +46,9 @@ cl::opt<bool> NoReturnType("no-return-type", cl::Optional,
 cl::opt<bool> NoMemberType("no-member-type", cl::Optional,
                            cl::desc("skip member types"), cl::Hidden,
                            cl::init(false), cl::cat(UndNameCategory));
+cl::opt<bool> NoVariableType("no-variable-type", cl::Optional,
+                             cl::desc("skip variable types"), cl::Hidden,
+                             cl::init(false), cl::cat(UndNameCategory));
 cl::opt<std::string> RawFile("raw-file", cl::Optional,
                              cl::desc("for fuzzer data"), cl::Hidden,
                              cl::cat(UndNameCategory));
@@ -68,6 +71,8 @@ static bool msDemangle(const std::string &S) {
     Flags = MSDemangleFlags(Flags | MSDF_NoReturnType);
   if (NoMemberType)
     Flags = MSDemangleFlags(Flags | MSDF_NoMemberType);
+  if (NoVariableType)
+    Flags = MSDemangleFlags(Flags | MSDF_NoVariableType);
 
   size_t NRead;
   char *ResultBuf =