1*7ec26b23SKyungwoo Lee //===- StableFunctionMapRecordTest.cpp ------------------------------------===// 2*7ec26b23SKyungwoo Lee // 3*7ec26b23SKyungwoo Lee // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7ec26b23SKyungwoo Lee // See https://llvm.org/LICENSE.txt for license information. 5*7ec26b23SKyungwoo Lee // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7ec26b23SKyungwoo Lee // 7*7ec26b23SKyungwoo Lee //===----------------------------------------------------------------------===// 8*7ec26b23SKyungwoo Lee 9*7ec26b23SKyungwoo Lee #include "llvm/CGData/StableFunctionMapRecord.h" 10*7ec26b23SKyungwoo Lee #include "gmock/gmock.h" 11*7ec26b23SKyungwoo Lee #include "gtest/gtest.h" 12*7ec26b23SKyungwoo Lee 13*7ec26b23SKyungwoo Lee using namespace llvm; 14*7ec26b23SKyungwoo Lee 15*7ec26b23SKyungwoo Lee namespace { 16*7ec26b23SKyungwoo Lee 17*7ec26b23SKyungwoo Lee TEST(StableFunctionMapRecordTest, Print) { 18*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord; 19*7ec26b23SKyungwoo Lee StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}}; 20*7ec26b23SKyungwoo Lee MapRecord.FunctionMap->insert(Func1); 21*7ec26b23SKyungwoo Lee 22*7ec26b23SKyungwoo Lee const char *ExpectedMapStr = R"(--- 23*7ec26b23SKyungwoo Lee - Hash: 1 24*7ec26b23SKyungwoo Lee FunctionName: Func1 25*7ec26b23SKyungwoo Lee ModuleName: Mod1 26*7ec26b23SKyungwoo Lee InstCount: 2 27*7ec26b23SKyungwoo Lee IndexOperandHashes: 28*7ec26b23SKyungwoo Lee - InstIndex: 0 29*7ec26b23SKyungwoo Lee OpndIndex: 1 30*7ec26b23SKyungwoo Lee OpndHash: 3 31*7ec26b23SKyungwoo Lee ... 32*7ec26b23SKyungwoo Lee )"; 33*7ec26b23SKyungwoo Lee std::string MapDump; 34*7ec26b23SKyungwoo Lee raw_string_ostream OS(MapDump); 35*7ec26b23SKyungwoo Lee MapRecord.print(OS); 36*7ec26b23SKyungwoo Lee EXPECT_EQ(ExpectedMapStr, MapDump); 37*7ec26b23SKyungwoo Lee } 38*7ec26b23SKyungwoo Lee 39*7ec26b23SKyungwoo Lee TEST(StableFunctionMapRecordTest, Stable) { 40*7ec26b23SKyungwoo Lee StableFunction Func1{1, "Func2", "Mod1", 1, {}}; 41*7ec26b23SKyungwoo Lee StableFunction Func2{1, "Func3", "Mod1", 1, {}}; 42*7ec26b23SKyungwoo Lee StableFunction Func3{1, "Func1", "Mod2", 1, {}}; 43*7ec26b23SKyungwoo Lee StableFunction Func4{2, "Func4", "Mod3", 1, {}}; 44*7ec26b23SKyungwoo Lee 45*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord1; 46*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func1); 47*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func2); 48*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func3); 49*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func4); 50*7ec26b23SKyungwoo Lee 51*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord2; 52*7ec26b23SKyungwoo Lee MapRecord2.FunctionMap->insert(Func4); 53*7ec26b23SKyungwoo Lee MapRecord2.FunctionMap->insert(Func3); 54*7ec26b23SKyungwoo Lee MapRecord2.FunctionMap->insert(Func2); 55*7ec26b23SKyungwoo Lee MapRecord2.FunctionMap->insert(Func1); 56*7ec26b23SKyungwoo Lee 57*7ec26b23SKyungwoo Lee // Output is sorted by hash (1 < 2), module name (Mod1 < Mod2), and function 58*7ec26b23SKyungwoo Lee // name (Func2 < Func3). 59*7ec26b23SKyungwoo Lee std::string MapDump1; 60*7ec26b23SKyungwoo Lee raw_string_ostream OS1(MapDump1); 61*7ec26b23SKyungwoo Lee MapRecord1.print(OS1); 62*7ec26b23SKyungwoo Lee std::string MapDump2; 63*7ec26b23SKyungwoo Lee raw_string_ostream OS2(MapDump2); 64*7ec26b23SKyungwoo Lee MapRecord2.print(OS2); 65*7ec26b23SKyungwoo Lee EXPECT_EQ(MapDump1, MapDump2); 66*7ec26b23SKyungwoo Lee } 67*7ec26b23SKyungwoo Lee 68*7ec26b23SKyungwoo Lee TEST(StableFunctionMapRecordTest, Serialize) { 69*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord1; 70*7ec26b23SKyungwoo Lee StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}, {{1, 2}, 4}}}; 71*7ec26b23SKyungwoo Lee StableFunction Func2{2, "Func2", "Mod1", 3, {{{0, 1}, 2}}}; 72*7ec26b23SKyungwoo Lee StableFunction Func3{2, "Func3", "Mod1", 3, {{{0, 1}, 3}}}; 73*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func1); 74*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func2); 75*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func3); 76*7ec26b23SKyungwoo Lee 77*7ec26b23SKyungwoo Lee // Serialize and deserialize the map. 78*7ec26b23SKyungwoo Lee SmallVector<char> Out; 79*7ec26b23SKyungwoo Lee raw_svector_ostream OS(Out); 80*7ec26b23SKyungwoo Lee MapRecord1.serialize(OS); 81*7ec26b23SKyungwoo Lee 82*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord2; 83*7ec26b23SKyungwoo Lee const uint8_t *Data = reinterpret_cast<const uint8_t *>(Out.data()); 84*7ec26b23SKyungwoo Lee MapRecord2.deserialize(Data); 85*7ec26b23SKyungwoo Lee 86*7ec26b23SKyungwoo Lee // Two maps should be identical. 87*7ec26b23SKyungwoo Lee std::string MapDump1; 88*7ec26b23SKyungwoo Lee raw_string_ostream OS1(MapDump1); 89*7ec26b23SKyungwoo Lee MapRecord1.print(OS1); 90*7ec26b23SKyungwoo Lee std::string MapDump2; 91*7ec26b23SKyungwoo Lee raw_string_ostream OS2(MapDump2); 92*7ec26b23SKyungwoo Lee MapRecord2.print(OS2); 93*7ec26b23SKyungwoo Lee 94*7ec26b23SKyungwoo Lee EXPECT_EQ(MapDump1, MapDump2); 95*7ec26b23SKyungwoo Lee } 96*7ec26b23SKyungwoo Lee 97*7ec26b23SKyungwoo Lee TEST(StableFunctionMapRecordTest, SerializeYAML) { 98*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord1; 99*7ec26b23SKyungwoo Lee StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}, {{1, 2}, 4}}}; 100*7ec26b23SKyungwoo Lee StableFunction Func2{2, "Func2", "Mod1", 3, {{{0, 1}, 2}}}; 101*7ec26b23SKyungwoo Lee StableFunction Func3{2, "Func3", "Mod1", 3, {{{0, 1}, 3}}}; 102*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func1); 103*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func2); 104*7ec26b23SKyungwoo Lee MapRecord1.FunctionMap->insert(Func3); 105*7ec26b23SKyungwoo Lee 106*7ec26b23SKyungwoo Lee // Serialize and deserialize the map in a YAML format. 107*7ec26b23SKyungwoo Lee std::string Out; 108*7ec26b23SKyungwoo Lee raw_string_ostream OS(Out); 109*7ec26b23SKyungwoo Lee yaml::Output YOS(OS); 110*7ec26b23SKyungwoo Lee MapRecord1.serializeYAML(YOS); 111*7ec26b23SKyungwoo Lee 112*7ec26b23SKyungwoo Lee StableFunctionMapRecord MapRecord2; 113*7ec26b23SKyungwoo Lee yaml::Input YIS(StringRef(Out.data(), Out.size())); 114*7ec26b23SKyungwoo Lee MapRecord2.deserializeYAML(YIS); 115*7ec26b23SKyungwoo Lee 116*7ec26b23SKyungwoo Lee // Two maps should be identical. 117*7ec26b23SKyungwoo Lee std::string MapDump1; 118*7ec26b23SKyungwoo Lee raw_string_ostream OS1(MapDump1); 119*7ec26b23SKyungwoo Lee MapRecord1.print(OS1); 120*7ec26b23SKyungwoo Lee std::string MapDump2; 121*7ec26b23SKyungwoo Lee raw_string_ostream OS2(MapDump2); 122*7ec26b23SKyungwoo Lee MapRecord2.print(OS2); 123*7ec26b23SKyungwoo Lee 124*7ec26b23SKyungwoo Lee EXPECT_EQ(MapDump1, MapDump2); 125*7ec26b23SKyungwoo Lee } 126*7ec26b23SKyungwoo Lee 127*7ec26b23SKyungwoo Lee } // end namespace 128