1*67d82d6eSErik Pilkington //===----------------------- PartialDemangleTest.cpp ----------------------===// 2*67d82d6eSErik Pilkington // 3*67d82d6eSErik Pilkington // The LLVM Compiler Infrastructure 4*67d82d6eSErik Pilkington // 5*67d82d6eSErik Pilkington // This file is dual licensed under the MIT and the University of Illinois Open 6*67d82d6eSErik Pilkington // Source Licenses. See LICENSE.TXT for details. 7*67d82d6eSErik Pilkington // 8*67d82d6eSErik Pilkington //===----------------------------------------------------------------------===// 9*67d82d6eSErik Pilkington 10*67d82d6eSErik Pilkington #include <cstdlib> 11*67d82d6eSErik Pilkington #include "llvm/Demangle/Demangle.h" 12*67d82d6eSErik Pilkington #include "gtest/gtest.h" 13*67d82d6eSErik Pilkington 14*67d82d6eSErik Pilkington struct ChoppedName { 15*67d82d6eSErik Pilkington const char *Mangled; 16*67d82d6eSErik Pilkington const char *ContextName, *BaseName, *ReturnType, *Params; 17*67d82d6eSErik Pilkington }; 18*67d82d6eSErik Pilkington 19*67d82d6eSErik Pilkington static ChoppedName NamesToTest[] = { 20*67d82d6eSErik Pilkington {"_Z1fv", "", "f", "", "()"}, 21*67d82d6eSErik Pilkington {"_ZN1a1b1cIiiiEEvm", "a::b", "c", "void", "(unsigned long)"}, 22*67d82d6eSErik Pilkington {"_ZZ5OuterIiEivEN5Inner12inner_memberEv", 23*67d82d6eSErik Pilkington "int Outer<int>()::Inner", "inner_member", "", "()"}, 24*67d82d6eSErik Pilkington {"_Z1fIiEPFvvEv", "", "f", "void (*)()", "()"}, 25*67d82d6eSErik Pilkington {"_ZN1S1fIiEEvv", "S", "f", "void", "()"}, 26*67d82d6eSErik Pilkington 27*67d82d6eSErik Pilkington // Call operator for a lambda in f(). 28*67d82d6eSErik Pilkington {"_ZZ1fvENK3$_0clEi", "f()::$_0", "operator()", "", "(int)"}, 29*67d82d6eSErik Pilkington 30*67d82d6eSErik Pilkington // A call operator for a lambda in a lambda in f(). 31*67d82d6eSErik Pilkington {"_ZZZ1fvENK3$_0clEvENKUlvE_clEv", 32*67d82d6eSErik Pilkington "f()::$_0::operator()() const::'lambda'()", "operator()", "", "()"}, 33*67d82d6eSErik Pilkington 34*67d82d6eSErik Pilkington {"_ZZN1S1fEiiEd0_NKUlvE_clEv", 35*67d82d6eSErik Pilkington "S::f(int, int)::'lambda'()", "operator()", "", "()"}, 36*67d82d6eSErik Pilkington 37*67d82d6eSErik Pilkington {"_ZN1Scv7MuncherIJDpPT_EEIJFivEA_iEEEv", 38*67d82d6eSErik Pilkington "S", "operator Muncher<int (*)(), int (*) []>", "", "()"}, 39*67d82d6eSErik Pilkington 40*67d82d6eSErik Pilkington // Attributes. 41*67d82d6eSErik Pilkington {"_ZN5test4IdE1fEUa9enable_ifIXeqfL0p_Li1EEXeqfL0p0_Li2EEEi", 42*67d82d6eSErik Pilkington "test4<double>", "f", "", "(int)"}, 43*67d82d6eSErik Pilkington {"_ZN1SC2B8ctor_tagEv", "S", "S", "", "()"}, 44*67d82d6eSErik Pilkington {"_ZN1S1fB4MERPIiEEvv", "S", "f", "void", "()"}, 45*67d82d6eSErik Pilkington 46*67d82d6eSErik Pilkington {"_ZNSsC1EmcRKSaIcE", 47*67d82d6eSErik Pilkington "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", 48*67d82d6eSErik Pilkington "basic_string", "", "(unsigned long, char, std::allocator<char> const&)"}, 49*67d82d6eSErik Pilkington {"_ZNSsixEm", "std::string", "operator[]", "", "(unsigned long)"}, 50*67d82d6eSErik Pilkington {"_ZSt17__throw_bad_allocv", "std", "__throw_bad_alloc", "", "()"}, 51*67d82d6eSErik Pilkington 52*67d82d6eSErik Pilkington {"_ZN1AI1BEC2Ev", "A<B>", "A", "", "()"}, 53*67d82d6eSErik Pilkington {"_ZN1AI1BED2Ev", "A<B>", "~A", "", "()"}, 54*67d82d6eSErik Pilkington {"_ZN1AI1BECI24BaseEi", "A<B>", "A", "", "(int)"}, 55*67d82d6eSErik Pilkington {"_ZNKR1AI1BE1fIiEEiv", "A<B>", "f", "int", "()"}, 56*67d82d6eSErik Pilkington 57*67d82d6eSErik Pilkington {"_ZN1SIJicfEE3mfnIJjcdEEEvicfDpT_", "S<int, char, float>", 58*67d82d6eSErik Pilkington "mfn", "void", "(int, char, float, unsigned int, char, double)"}, 59*67d82d6eSErik Pilkington }; 60*67d82d6eSErik Pilkington 61*67d82d6eSErik Pilkington TEST(PartialDemangleTest, TestNameChopping) { 62*67d82d6eSErik Pilkington size_t Size = 1; 63*67d82d6eSErik Pilkington char *Buf = static_cast<char *>(std::malloc(Size)); 64*67d82d6eSErik Pilkington 65*67d82d6eSErik Pilkington llvm::ItaniumPartialDemangler D; 66*67d82d6eSErik Pilkington 67*67d82d6eSErik Pilkington for (ChoppedName &N : NamesToTest) { 68*67d82d6eSErik Pilkington EXPECT_FALSE(D.partialDemangle(N.Mangled)); 69*67d82d6eSErik Pilkington EXPECT_TRUE(D.isFunction()); 70*67d82d6eSErik Pilkington EXPECT_FALSE(D.isData()); 71*67d82d6eSErik Pilkington EXPECT_FALSE(D.isSpecialName()); 72*67d82d6eSErik Pilkington 73*67d82d6eSErik Pilkington Buf = D.getFunctionDeclContextName(Buf, &Size); 74*67d82d6eSErik Pilkington EXPECT_STREQ(Buf, N.ContextName); 75*67d82d6eSErik Pilkington 76*67d82d6eSErik Pilkington Buf = D.getFunctionBaseName(Buf, &Size); 77*67d82d6eSErik Pilkington EXPECT_STREQ(Buf, N.BaseName); 78*67d82d6eSErik Pilkington 79*67d82d6eSErik Pilkington Buf = D.getFunctionReturnType(Buf, &Size); 80*67d82d6eSErik Pilkington EXPECT_STREQ(Buf, N.ReturnType); 81*67d82d6eSErik Pilkington 82*67d82d6eSErik Pilkington Buf = D.getFunctionParameters(Buf, &Size); 83*67d82d6eSErik Pilkington EXPECT_STREQ(Buf, N.Params); 84*67d82d6eSErik Pilkington } 85*67d82d6eSErik Pilkington } 86*67d82d6eSErik Pilkington 87*67d82d6eSErik Pilkington TEST(PartialDemangleTest, TestNameMeta) { 88*67d82d6eSErik Pilkington llvm::ItaniumPartialDemangler Demangler; 89*67d82d6eSErik Pilkington 90*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.partialDemangle("_ZNK1f1gEv")); 91*67d82d6eSErik Pilkington EXPECT_TRUE(Demangler.isFunction()); 92*67d82d6eSErik Pilkington EXPECT_TRUE(Demangler.hasFunctionQualifiers()); 93*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isSpecialName()); 94*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isData()); 95*67d82d6eSErik Pilkington 96*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.partialDemangle("_Z1fv")); 97*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.hasFunctionQualifiers()); 98*67d82d6eSErik Pilkington 99*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.partialDemangle("_ZTV1S")); 100*67d82d6eSErik Pilkington EXPECT_TRUE(Demangler.isSpecialName()); 101*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isData()); 102*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isFunction()); 103*67d82d6eSErik Pilkington 104*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.partialDemangle("_ZN1aDC1a1b1cEE")); 105*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isFunction()); 106*67d82d6eSErik Pilkington EXPECT_FALSE(Demangler.isSpecialName()); 107*67d82d6eSErik Pilkington EXPECT_TRUE(Demangler.isData()); 108*67d82d6eSErik Pilkington } 109*67d82d6eSErik Pilkington 110*67d82d6eSErik Pilkington TEST(PartialDemanglerTest, TestMisc) { 111*67d82d6eSErik Pilkington llvm::ItaniumPartialDemangler D1, D2; 112*67d82d6eSErik Pilkington 113*67d82d6eSErik Pilkington EXPECT_FALSE(D1.partialDemangle("_Z1fv")); 114*67d82d6eSErik Pilkington EXPECT_FALSE(D2.partialDemangle("_Z1g")); 115*67d82d6eSErik Pilkington std::swap(D1, D2); 116*67d82d6eSErik Pilkington EXPECT_FALSE(D1.isFunction()); 117*67d82d6eSErik Pilkington EXPECT_TRUE(D2.isFunction()); 118*67d82d6eSErik Pilkington 119*67d82d6eSErik Pilkington EXPECT_TRUE(D1.partialDemangle("Not a mangled name!")); 120*67d82d6eSErik Pilkington 121*67d82d6eSErik Pilkington } 122