1 //===-- MangledTest.cpp ---------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
10 #include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h"
11 #include "TestingSupport/SubsystemRAII.h"
12 #include "TestingSupport/TestUtilities.h"
13
14 #include "lldb/Core/Mangled.h"
15 #include "lldb/Core/Module.h"
16 #include "lldb/Core/ModuleSpec.h"
17 #include "lldb/Host/FileSystem.h"
18 #include "lldb/Host/HostInfo.h"
19 #include "lldb/Symbol/SymbolContext.h"
20
21 #include "llvm/Support/FileUtilities.h"
22 #include "llvm/Support/Path.h"
23 #include "llvm/Support/Program.h"
24 #include "llvm/Testing/Support/Error.h"
25
26 #include "gtest/gtest.h"
27
28 using namespace lldb;
29 using namespace lldb_private;
30
TEST(MangledTest,ResultForValidName)31 TEST(MangledTest, ResultForValidName) {
32 ConstString MangledName("_ZN1a1b1cIiiiEEvm");
33 Mangled TheMangled(MangledName);
34 ConstString TheDemangled = TheMangled.GetDemangledName();
35
36 ConstString ExpectedResult("void a::b::c<int, int, int>(unsigned long)");
37 EXPECT_STREQ(ExpectedResult.GetCString(), TheDemangled.GetCString());
38 }
39
TEST(MangledTest,ResultForBlockInvocation)40 TEST(MangledTest, ResultForBlockInvocation) {
41 ConstString MangledName("___Z1fU13block_pointerFviE_block_invoke");
42 Mangled TheMangled(MangledName);
43 ConstString TheDemangled = TheMangled.GetDemangledName();
44
45 ConstString ExpectedResult(
46 "invocation function for block in f(void (int) block_pointer)");
47 EXPECT_STREQ(ExpectedResult.GetCString(), TheDemangled.GetCString());
48 }
49
TEST(MangledTest,EmptyForInvalidName)50 TEST(MangledTest, EmptyForInvalidName) {
51 ConstString MangledName("_ZN1a1b1cmxktpEEvm");
52 Mangled TheMangled(MangledName);
53 ConstString TheDemangled = TheMangled.GetDemangledName();
54
55 EXPECT_STREQ("", TheDemangled.GetCString());
56 }
57
TEST(MangledTest,NameIndexes_FindFunctionSymbols)58 TEST(MangledTest, NameIndexes_FindFunctionSymbols) {
59 SubsystemRAII<FileSystem, HostInfo, ObjectFileELF, SymbolFileSymtab>
60 subsystems;
61
62 auto ExpectedFile = TestFile::fromYaml(R"(
63 --- !ELF
64 FileHeader:
65 Class: ELFCLASS64
66 Data: ELFDATA2LSB
67 Type: ET_EXEC
68 Machine: EM_X86_64
69 Sections:
70 - Name: .text
71 Type: SHT_PROGBITS
72 Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
73 AddressAlign: 0x0000000000000010
74 Size: 0x20
75 - Name: .anothertext
76 Type: SHT_PROGBITS
77 Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
78 Address: 0x0000000000000010
79 AddressAlign: 0x0000000000000010
80 Size: 0x40
81 - Name: .data
82 Type: SHT_PROGBITS
83 Flags: [ SHF_WRITE, SHF_ALLOC ]
84 Address: 0x00000000000000A8
85 AddressAlign: 0x0000000000000004
86 Content: '01000000'
87 Symbols:
88 - Name: somedata
89 Type: STT_OBJECT
90 Section: .anothertext
91 Value: 0x0000000000000045
92 Binding: STB_GLOBAL
93 - Name: main
94 Type: STT_FUNC
95 Section: .anothertext
96 Value: 0x0000000000000010
97 Size: 0x000000000000003F
98 Binding: STB_GLOBAL
99 - Name: _Z3foov
100 Type: STT_FUNC
101 Section: .text
102 Size: 0x000000000000000D
103 Binding: STB_GLOBAL
104 - Name: puts@GLIBC_2.5
105 Type: STT_FUNC
106 Section: .text
107 Size: 0x000000000000000D
108 Binding: STB_GLOBAL
109 - Name: puts@GLIBC_2.6
110 Type: STT_FUNC
111 Section: .text
112 Size: 0x000000000000000D
113 Binding: STB_GLOBAL
114 - Name: _Z5annotv@VERSION3
115 Type: STT_FUNC
116 Section: .text
117 Size: 0x000000000000000D
118 Binding: STB_GLOBAL
119 - Name: _ZN1AC2Ev
120 Type: STT_FUNC
121 Section: .text
122 Size: 0x000000000000000D
123 Binding: STB_GLOBAL
124 - Name: _ZN1AD2Ev
125 Type: STT_FUNC
126 Section: .text
127 Size: 0x000000000000000D
128 Binding: STB_GLOBAL
129 - Name: _ZN1A3barEv
130 Type: STT_FUNC
131 Section: .text
132 Size: 0x000000000000000D
133 Binding: STB_GLOBAL
134 - Name: _ZGVZN4llvm4dbgsEvE7thestrm
135 Type: STT_FUNC
136 Section: .text
137 Size: 0x000000000000000D
138 Binding: STB_GLOBAL
139 - Name: _ZZN4llvm4dbgsEvE7thestrm
140 Type: STT_FUNC
141 Section: .text
142 Size: 0x000000000000000D
143 Binding: STB_GLOBAL
144 - Name: _ZTVN5clang4DeclE
145 Type: STT_FUNC
146 Section: .text
147 Size: 0x000000000000000D
148 Binding: STB_GLOBAL
149 - Name: -[ObjCfoo]
150 Type: STT_FUNC
151 Section: .text
152 Size: 0x000000000000000D
153 Binding: STB_GLOBAL
154 - Name: +[B ObjCbar(WithCategory)]
155 Type: STT_FUNC
156 Section: .text
157 Size: 0x000000000000000D
158 Binding: STB_GLOBAL
159 - Name: _Z12undemangableEvx42
160 Type: STT_FUNC
161 Section: .text
162 Size: 0x000000000000000D
163 Binding: STB_GLOBAL
164 ...
165 )");
166 ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded());
167
168 auto M = std::make_shared<Module>(ExpectedFile->moduleSpec());
169
170 auto Count = [M](const char *Name, FunctionNameType Type) -> int {
171 SymbolContextList SymList;
172 M->FindFunctionSymbols(ConstString(Name), Type, SymList);
173 return SymList.GetSize();
174 };
175
176 // Unmangled
177 EXPECT_EQ(1, Count("main", eFunctionNameTypeFull));
178 EXPECT_EQ(1, Count("main", eFunctionNameTypeBase));
179 EXPECT_EQ(0, Count("main", eFunctionNameTypeMethod));
180
181 // Itanium mangled
182 EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeFull));
183 EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeBase));
184 EXPECT_EQ(1, Count("foo", eFunctionNameTypeBase));
185 EXPECT_EQ(0, Count("foo", eFunctionNameTypeMethod));
186
187 // Unmangled with linker annotation
188 EXPECT_EQ(1, Count("puts@GLIBC_2.5", eFunctionNameTypeFull));
189 EXPECT_EQ(1, Count("puts@GLIBC_2.6", eFunctionNameTypeFull));
190 EXPECT_EQ(2, Count("puts", eFunctionNameTypeFull));
191 EXPECT_EQ(2, Count("puts", eFunctionNameTypeBase));
192 EXPECT_EQ(0, Count("puts", eFunctionNameTypeMethod));
193
194 // Itanium mangled with linker annotation
195 EXPECT_EQ(1, Count("_Z5annotv@VERSION3", eFunctionNameTypeFull));
196 EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeFull));
197 EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeBase));
198 EXPECT_EQ(0, Count("annot", eFunctionNameTypeBase));
199 EXPECT_EQ(0, Count("annot", eFunctionNameTypeMethod));
200
201 // Itanium mangled ctor A::A()
202 EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeFull));
203 EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeBase));
204 EXPECT_EQ(1, Count("A", eFunctionNameTypeMethod));
205 EXPECT_EQ(0, Count("A", eFunctionNameTypeBase));
206
207 // Itanium mangled dtor A::~A()
208 EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeFull));
209 EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeBase));
210 EXPECT_EQ(1, Count("~A", eFunctionNameTypeMethod));
211 EXPECT_EQ(0, Count("~A", eFunctionNameTypeBase));
212
213 // Itanium mangled method A::bar()
214 EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeFull));
215 EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeBase));
216 EXPECT_EQ(1, Count("bar", eFunctionNameTypeMethod));
217 EXPECT_EQ(0, Count("bar", eFunctionNameTypeBase));
218
219 // Itanium mangled names that are explicitly excluded from parsing
220 EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull));
221 EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase));
222 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod));
223 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase));
224 EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull));
225 EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase));
226 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod));
227 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase));
228 EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeFull));
229 EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeBase));
230 EXPECT_EQ(0, Count("Decl", eFunctionNameTypeMethod));
231 EXPECT_EQ(0, Count("Decl", eFunctionNameTypeBase));
232
233 // ObjC mangled static
234 EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeFull));
235 EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeBase));
236 EXPECT_EQ(0, Count("ObjCfoo", eFunctionNameTypeMethod));
237
238 // ObjC mangled method with category
239 EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeFull));
240 EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeBase));
241 EXPECT_EQ(0, Count("ObjCbar", eFunctionNameTypeMethod));
242
243 // Invalid things: unable to decode but still possible to find by full name
244 EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeFull));
245 EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeBase));
246 EXPECT_EQ(0, Count("_Z12undemangableEvx42", eFunctionNameTypeMethod));
247 EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeBase));
248 EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeMethod));
249 }
250