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