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/SymbolVendor/ELF/SymbolVendorELF.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 bool IsMangled = true; 33 34 Mangled TheMangled(MangledName, IsMangled); 35 ConstString TheDemangled = 36 TheMangled.GetDemangledName(eLanguageTypeC_plus_plus); 37 38 ConstString ExpectedResult("void a::b::c<int, int, int>(unsigned long)"); 39 EXPECT_STREQ(ExpectedResult.GetCString(), TheDemangled.GetCString()); 40 } 41 42 TEST(MangledTest, EmptyForInvalidName) { 43 ConstString MangledName("_ZN1a1b1cmxktpEEvm"); 44 bool IsMangled = true; 45 46 Mangled TheMangled(MangledName, IsMangled); 47 ConstString TheDemangled = 48 TheMangled.GetDemangledName(eLanguageTypeC_plus_plus); 49 50 EXPECT_STREQ("", TheDemangled.GetCString()); 51 } 52 53 TEST(MangledTest, NameIndexes_FindFunctionSymbols) { 54 FileSystem::Initialize(); 55 HostInfo::Initialize(); 56 ObjectFileELF::Initialize(); 57 SymbolVendorELF::Initialize(); 58 59 llvm::SmallString<128> Obj; 60 ASSERT_NO_ERROR(llvm::sys::fs::createTemporaryFile( 61 "mangled-function-names-%%%%%%", "obj", Obj)); 62 llvm::FileRemover Deleter(Obj); 63 ASSERT_THAT_ERROR(ReadYAMLObjectFile("mangled-function-names.yaml", Obj), 64 llvm::Succeeded()); 65 66 ModuleSpec Spec{FileSpec(Obj)}; 67 Spec.GetSymbolFileSpec().SetFile(Obj, FileSpec::Style::native); 68 auto M = std::make_shared<Module>(Spec); 69 70 auto Count = [M](const char *Name, FunctionNameType Type) -> int { 71 SymbolContextList SymList; 72 return M->FindFunctionSymbols(ConstString(Name), Type, SymList); 73 }; 74 75 // Unmangled 76 EXPECT_EQ(1, Count("main", eFunctionNameTypeFull)); 77 EXPECT_EQ(1, Count("main", eFunctionNameTypeBase)); 78 EXPECT_EQ(0, Count("main", eFunctionNameTypeMethod)); 79 80 // Itanium mangled 81 EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeFull)); 82 EXPECT_EQ(1, Count("_Z3foov", eFunctionNameTypeBase)); 83 EXPECT_EQ(1, Count("foo", eFunctionNameTypeBase)); 84 EXPECT_EQ(0, Count("foo", eFunctionNameTypeMethod)); 85 86 // Unmangled with linker annotation 87 EXPECT_EQ(1, Count("puts@GLIBC_2.5", eFunctionNameTypeFull)); 88 EXPECT_EQ(1, Count("puts@GLIBC_2.6", eFunctionNameTypeFull)); 89 EXPECT_EQ(2, Count("puts", eFunctionNameTypeFull)); 90 EXPECT_EQ(2, Count("puts", eFunctionNameTypeBase)); 91 EXPECT_EQ(0, Count("puts", eFunctionNameTypeMethod)); 92 93 // Itanium mangled with linker annotation 94 EXPECT_EQ(1, Count("_Z5annotv@VERSION3", eFunctionNameTypeFull)); 95 EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeFull)); 96 EXPECT_EQ(1, Count("_Z5annotv", eFunctionNameTypeBase)); 97 EXPECT_EQ(0, Count("annot", eFunctionNameTypeBase)); 98 EXPECT_EQ(0, Count("annot", eFunctionNameTypeMethod)); 99 100 // Itanium mangled ctor A::A() 101 EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeFull)); 102 EXPECT_EQ(1, Count("_ZN1AC2Ev", eFunctionNameTypeBase)); 103 EXPECT_EQ(1, Count("A", eFunctionNameTypeMethod)); 104 EXPECT_EQ(0, Count("A", eFunctionNameTypeBase)); 105 106 // Itanium mangled dtor A::~A() 107 EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeFull)); 108 EXPECT_EQ(1, Count("_ZN1AD2Ev", eFunctionNameTypeBase)); 109 EXPECT_EQ(1, Count("~A", eFunctionNameTypeMethod)); 110 EXPECT_EQ(0, Count("~A", eFunctionNameTypeBase)); 111 112 // Itanium mangled method A::bar() 113 EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeFull)); 114 EXPECT_EQ(1, Count("_ZN1A3barEv", eFunctionNameTypeBase)); 115 EXPECT_EQ(1, Count("bar", eFunctionNameTypeMethod)); 116 EXPECT_EQ(0, Count("bar", eFunctionNameTypeBase)); 117 118 // Itanium mangled names that are explicitly excluded from parsing 119 EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull)); 120 EXPECT_EQ(1, Count("_ZGVZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase)); 121 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod)); 122 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase)); 123 EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeFull)); 124 EXPECT_EQ(1, Count("_ZZN4llvm4dbgsEvE7thestrm", eFunctionNameTypeBase)); 125 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeMethod)); 126 EXPECT_EQ(0, Count("dbgs", eFunctionNameTypeBase)); 127 EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeFull)); 128 EXPECT_EQ(1, Count("_ZTVN5clang4DeclE", eFunctionNameTypeBase)); 129 EXPECT_EQ(0, Count("Decl", eFunctionNameTypeMethod)); 130 EXPECT_EQ(0, Count("Decl", eFunctionNameTypeBase)); 131 132 // ObjC mangled static 133 EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeFull)); 134 EXPECT_EQ(1, Count("-[ObjCfoo]", eFunctionNameTypeBase)); 135 EXPECT_EQ(0, Count("ObjCfoo", eFunctionNameTypeMethod)); 136 137 // ObjC mangled method with category 138 EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeFull)); 139 EXPECT_EQ(1, Count("+[B ObjCbar(WithCategory)]", eFunctionNameTypeBase)); 140 EXPECT_EQ(0, Count("ObjCbar", eFunctionNameTypeMethod)); 141 142 // Invalid things: unable to decode but still possible to find by full name 143 EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeFull)); 144 EXPECT_EQ(1, Count("_Z12undemangableEvx42", eFunctionNameTypeBase)); 145 EXPECT_EQ(0, Count("_Z12undemangableEvx42", eFunctionNameTypeMethod)); 146 EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeBase)); 147 EXPECT_EQ(0, Count("undemangable", eFunctionNameTypeMethod)); 148 149 SymbolVendorELF::Terminate(); 150 ObjectFileELF::Terminate(); 151 HostInfo::Terminate(); 152 FileSystem::Terminate(); 153 } 154