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