xref: /llvm-project/llvm/unittests/CGData/StableFunctionMapRecordTest.cpp (revision 7ec26b23f27f2adfe6847bc69debb84efa34ed08)
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