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