Skip to content

Commit 134e181

Browse files
lfolgerwerat
authored andcommitted
[lldb] change name demangling to be consistent between windows and linx
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
1 parent cfaa5c3 commit 134e181

File tree

7 files changed

+57
-19
lines changed

7 files changed

+57
-19
lines changed

lldb/source/Core/Mangled.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ void Mangled::SetValue(ConstString name) {
131131
static char *GetMSVCDemangledStr(const char *M) {
132132
char *demangled_cstr = llvm::microsoftDemangle(
133133
M, nullptr, nullptr, nullptr, nullptr,
134-
llvm::MSDemangleFlags(llvm::MSDF_NoAccessSpecifier |
135-
llvm::MSDF_NoCallingConvention |
136-
llvm::MSDF_NoMemberType));
134+
llvm::MSDemangleFlags(
135+
llvm::MSDF_NoAccessSpecifier | llvm::MSDF_NoCallingConvention |
136+
llvm::MSDF_NoMemberType | llvm::MSDF_NoVariableType));
137137

138138
if (Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DEMANGLE)) {
139139
if (demangled_cstr && demangled_cstr[0])

llvm/include/llvm/Demangle/Demangle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ enum MSDemangleFlags {
3838
MSDF_NoCallingConvention = 1 << 2,
3939
MSDF_NoReturnType = 1 << 3,
4040
MSDF_NoMemberType = 1 << 4,
41+
MSDF_NoVariableType = 1 << 5,
4142
};
4243

4344
/// Demangles the Microsoft symbol pointed at by mangled_name and returns it.

llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ enum OutputFlags {
8080
OF_NoAccessSpecifier = 4,
8181
OF_NoMemberType = 8,
8282
OF_NoReturnType = 16,
83+
OF_NoVariableType = 32,
8384
};
8485

8586
// Types

llvm/lib/Demangle/MicrosoftDemangle.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2361,6 +2361,8 @@ char *llvm::microsoftDemangle(const char *MangledName, size_t *NMangled,
23612361
OF = OutputFlags(OF | OF_NoReturnType);
23622362
if (Flags & MSDF_NoMemberType)
23632363
OF = OutputFlags(OF | OF_NoMemberType);
2364+
if (Flags & MSDF_NoVariableType)
2365+
OF = OutputFlags(OF | OF_NoVariableType);
23642366

23652367
int InternalStatus = demangle_success;
23662368
if (D.Error)

llvm/lib/Demangle/MicrosoftDemangleNodes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -613,12 +613,12 @@ void VariableSymbolNode::output(OutputStream &OS, OutputFlags Flags) const {
613613
if (!(Flags & OF_NoMemberType) && IsStatic)
614614
OS << "static ";
615615

616-
if (Type) {
616+
if (!(Flags & OF_NoVariableType) && Type) {
617617
Type->outputPre(OS, Flags);
618618
outputSpaceIfNecessary(OS);
619619
}
620620
Name->output(OS, Flags);
621-
if (Type)
621+
if (!(Flags & OF_NoVariableType) && Type)
622622
Type->outputPost(OS, Flags);
623623
}
624624

llvm/test/Demangle/ms-options.test

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,43 @@
1-
; RUN: llvm-undname < %s | FileCheck %s
2-
; RUN: llvm-undname --no-calling-convention < %s | FileCheck %s --check-prefix=CHECK-NO-CALLING-CONV
3-
; RUN: llvm-undname --no-return-type < %s | FileCheck %s --check-prefix=CHECK-NO-RETURN
4-
; RUN: llvm-undname --no-access-specifier < %s | FileCheck %s --check-prefix=CHECK-NO-ACCESS
5-
; RUN: llvm-undname --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-MEMBER-TYPE
6-
; RUN: llvm-undname --no-calling-convention --no-return-type --no-access-specifier --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-ALL
7-
8-
?func@MyClass@@UEAAHHH@Z
9-
; CHECK: public: virtual int __cdecl MyClass::func(int, int)
10-
; CHECK-NO-CALLING-CONV: public: virtual int MyClass::func(int, int)
11-
; CHECK-NO-RETURN: public: virtual __cdecl MyClass::func(int, int)
12-
; CHECK-NO-ACCESS: {{^}}virtual int __cdecl MyClass::func(int, int)
13-
; CHECK-NO-MEMBER-TYPE: public: int __cdecl MyClass::func(int, int)
14-
; CHECK-NO-ALL: {{^}}MyClass::func(int, int)
1+
; RUN: llvm-undname < %s | FileCheck %s
2+
; RUN: llvm-undname --no-calling-convention < %s | FileCheck %s --check-prefix=CHECK-NO-CALLING-CONV
3+
; RUN: llvm-undname --no-return-type < %s | FileCheck %s --check-prefix=CHECK-NO-RETURN
4+
; RUN: llvm-undname --no-access-specifier < %s | FileCheck %s --check-prefix=CHECK-NO-ACCESS
5+
; RUN: llvm-undname --no-member-type < %s | FileCheck %s --check-prefix=CHECK-NO-MEMBER-TYPE
6+
; RUN: llvm-undname --no-variable-type < %s | FileCheck %s --check-prefix=CHECK-NO-VARIABLE-TYPE
7+
; 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
8+
9+
?func@MyClass@@UEAAHHH@Z
10+
; CHECK: public: virtual int __cdecl MyClass::func(int, int)
11+
; CHECK-NO-CALLING-CONV: public: virtual int MyClass::func(int, int)
12+
; CHECK-NO-RETURN: public: virtual __cdecl MyClass::func(int, int)
13+
; CHECK-NO-ACCESS: {{^}}virtual int __cdecl MyClass::func(int, int)
14+
; CHECK-NO-MEMBER-TYPE: public: int __cdecl MyClass::func(int, int)
15+
; CHECK-NO-VARIABLE-TYPE: public: virtual int __cdecl MyClass::func(int, int)
16+
; CHECK-NO-ALL: {{^}}MyClass::func(int, int)
17+
18+
?array2d@@3PAY09HA
19+
; CHECK: int (*array2d)[10]
20+
; CHECK-NO-CALLING-CONV: int (*array2d)[10]
21+
; CHECK-NO-RETURN: int (*array2d)[10]
22+
; CHECK-NO-ACCESS: int (*array2d)[10]
23+
; CHECK-NO-MEMBER-TYPE: int (*array2d)[10]
24+
; CHECK-NO-VARIABLE-TYPE: array2d
25+
; CHECK-NO-ALL: array2d
26+
27+
?a@abc@@3PAY09HA
28+
; CHECK: int (*abc::a)[10]
29+
; CHECK-NO-CALLING-CONV: int (*abc::a)[10]
30+
; CHECK-NO-RETURN: int (*abc::a)[10]
31+
; CHECK-NO-ACCESS: int (*abc::a)[10]
32+
; CHECK-NO-MEMBER-TYPE: int (*abc::a)[10]
33+
; CHECK-NO-VARIABLE-TYPE: abc::a
34+
; CHECK-NO-ALL: abc::a
35+
36+
?x@@3PEAEEA
37+
; CHECK: unsigned char *x
38+
; CHECK-NO-CALLING-CONV: unsigned char *x
39+
; CHECK-NO-RETURN: unsigned char *x
40+
; CHECK-NO-ACCESS: unsigned char *x
41+
; CHECK-NO-MEMBER-TYPE: unsigned char *x
42+
; CHECK-NO-VARIABLE-TYPE: x
43+
; CHECK-NO-ALL: x

llvm/tools/llvm-undname/llvm-undname.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ cl::opt<bool> NoReturnType("no-return-type", cl::Optional,
4646
cl::opt<bool> NoMemberType("no-member-type", cl::Optional,
4747
cl::desc("skip member types"), cl::Hidden,
4848
cl::init(false), cl::cat(UndNameCategory));
49+
cl::opt<bool> NoVariableType("no-variable-type", cl::Optional,
50+
cl::desc("skip variable types"), cl::Hidden,
51+
cl::init(false), cl::cat(UndNameCategory));
4952
cl::opt<std::string> RawFile("raw-file", cl::Optional,
5053
cl::desc("for fuzzer data"), cl::Hidden,
5154
cl::cat(UndNameCategory));
@@ -68,6 +71,8 @@ static bool msDemangle(const std::string &S) {
6871
Flags = MSDemangleFlags(Flags | MSDF_NoReturnType);
6972
if (NoMemberType)
7073
Flags = MSDemangleFlags(Flags | MSDF_NoMemberType);
74+
if (NoVariableType)
75+
Flags = MSDemangleFlags(Flags | MSDF_NoVariableType);
7176

7277
size_t NRead;
7378
char *ResultBuf =

0 commit comments

Comments
 (0)