1 //===-- RichManglingContextTest.cpp -----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Core/RichManglingContext.h" 11 12 #include "lldb/Utility/ConstString.h" 13 14 #include "gtest/gtest.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 TEST(RichManglingContextTest, Basic) { 20 RichManglingContext RMC; 21 ConstString mangled("_ZN3foo3barEv"); 22 EXPECT_TRUE(RMC.FromItaniumName(mangled)); 23 24 EXPECT_TRUE(RMC.IsFunction()); 25 EXPECT_FALSE(RMC.IsCtorOrDtor()); 26 27 RMC.ParseFunctionDeclContextName(); 28 EXPECT_EQ("foo", RMC.GetBufferRef()); 29 30 RMC.ParseFunctionBaseName(); 31 EXPECT_EQ("bar", RMC.GetBufferRef()); 32 33 RMC.ParseFullName(); 34 EXPECT_EQ("foo::bar()", RMC.GetBufferRef()); 35 } 36 37 TEST(RichManglingContextTest, FromCxxMethodName) { 38 RichManglingContext ItaniumRMC; 39 ConstString mangled("_ZN3foo3barEv"); 40 EXPECT_TRUE(ItaniumRMC.FromItaniumName(mangled)); 41 42 RichManglingContext CxxMethodRMC; 43 ConstString demangled("foo::bar()"); 44 EXPECT_TRUE(CxxMethodRMC.FromCxxMethodName(demangled)); 45 46 EXPECT_TRUE(ItaniumRMC.IsFunction() == CxxMethodRMC.IsFunction()); 47 EXPECT_TRUE(ItaniumRMC.IsCtorOrDtor() == CxxMethodRMC.IsCtorOrDtor()); 48 49 ItaniumRMC.ParseFunctionDeclContextName(); 50 CxxMethodRMC.ParseFunctionDeclContextName(); 51 EXPECT_TRUE(ItaniumRMC.GetBufferRef() == CxxMethodRMC.GetBufferRef()); 52 53 ItaniumRMC.ParseFunctionBaseName(); 54 CxxMethodRMC.ParseFunctionBaseName(); 55 EXPECT_TRUE(ItaniumRMC.GetBufferRef() == CxxMethodRMC.GetBufferRef()); 56 57 ItaniumRMC.ParseFullName(); 58 CxxMethodRMC.ParseFullName(); 59 EXPECT_TRUE(ItaniumRMC.GetBufferRef() == CxxMethodRMC.GetBufferRef()); 60 } 61 62 TEST(RichManglingContextTest, SwitchProvider) { 63 RichManglingContext RMC; 64 llvm::StringRef mangled = "_ZN3foo3barEv"; 65 llvm::StringRef demangled = "foo::bar()"; 66 67 EXPECT_TRUE(RMC.FromItaniumName(ConstString(mangled))); 68 RMC.ParseFullName(); 69 EXPECT_EQ("foo::bar()", RMC.GetBufferRef()); 70 71 EXPECT_TRUE(RMC.FromCxxMethodName(ConstString(demangled))); 72 RMC.ParseFullName(); 73 EXPECT_EQ("foo::bar()", RMC.GetBufferRef()); 74 75 EXPECT_TRUE(RMC.FromItaniumName(ConstString(mangled))); 76 RMC.ParseFullName(); 77 EXPECT_EQ("foo::bar()", RMC.GetBufferRef()); 78 } 79 80 TEST(RichManglingContextTest, IPDRealloc) { 81 // The demangled name should fit into the Itanium default buffer. 82 const char *short_mangled = "_ZN3foo3barEv"; 83 84 // The demangled name for this will certainly not fit into the default buffer. 85 const char *long_mangled = 86 "_ZNK3shk6detail17CallbackPublisherIZNS_5ThrowERKNSt15__exception_" 87 "ptr13exception_ptrEEUlOT_E_E9SubscribeINS0_9ConcatMapINS0_" 88 "18CallbackSubscriberIZNS_6GetAllIiNS1_IZZNS_9ConcatMapIZNS_6ConcatIJNS1_" 89 "IZZNS_3MapIZZNS_7IfEmptyIS9_EEDaS7_ENKUlS6_E_clINS1_IZZNS_4TakeIiEESI_" 90 "S7_ENKUlS6_E_clINS1_IZZNS_6FilterIZNS_9ElementAtEmEUlS7_E_EESI_S7_" 91 "ENKUlS6_E_clINS1_IZZNSL_ImEESI_S7_ENKUlS6_E_clINS1_IZNS_4FromINS0_" 92 "22InfiniteRangeContainerIiEEEESI_S7_EUlS7_E_EEEESI_S6_EUlS7_E_EEEESI_S6_" 93 "EUlS7_E_EEEESI_S6_EUlS7_E_EEEESI_S6_EUlS7_E_EESI_S7_ENKUlS6_E_clIS14_" 94 "EESI_S6_EUlS7_E_EERNS1_IZZNSH_IS9_EESI_S7_ENKSK_IS14_EESI_S6_EUlS7_E0_" 95 "EEEEESI_DpOT_EUlS7_E_EESI_S7_ENKUlS6_E_clINS1_IZNS_5StartIJZNS_" 96 "4JustIJS19_S1C_EEESI_S1F_EUlvE_ZNS1K_IJS19_S1C_EEESI_S1F_EUlvE0_EEESI_" 97 "S1F_EUlS7_E_EEEESI_S6_EUlS7_E_EEEESt6vectorIS6_SaIS6_EERKT0_NS_" 98 "12ElementCountEbEUlS7_E_ZNSD_IiS1Q_EES1T_S1W_S1X_bEUlOS3_E_ZNSD_IiS1Q_" 99 "EES1T_S1W_S1X_bEUlvE_EES1G_S1O_E25ConcatMapValuesSubscriberEEEDaS7_"; 100 101 RichManglingContext RMC; 102 103 // Demangle the short one and remember the buffer address. 104 EXPECT_TRUE(RMC.FromItaniumName(ConstString(short_mangled))); 105 RMC.ParseFullName(); 106 const char *short_demangled_ptr = RMC.GetBufferRef().data(); 107 108 // Demangle the long one and make sure the buffer address changed. 109 EXPECT_TRUE(RMC.FromItaniumName(ConstString(long_mangled))); 110 RMC.ParseFullName(); 111 const char *long_demangled_ptr = RMC.GetBufferRef().data(); 112 113 EXPECT_TRUE(short_demangled_ptr != long_demangled_ptr); 114 } 115