132 lines · cpp
1//===- StableFunctionMapRecordTest.cpp ------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/CGData/StableFunctionMapRecord.h"10#include "llvm/CGData/CodeGenDataWriter.h"11#include "gmock/gmock.h"12#include "gtest/gtest.h"13 14using namespace llvm;15 16namespace {17 18TEST(StableFunctionMapRecordTest, Print) {19 StableFunctionMapRecord MapRecord;20 StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};21 MapRecord.FunctionMap->insert(Func1);22 23 const char *ExpectedMapStr = R"(---24- Hash: 125 FunctionName: Func126 ModuleName: Mod127 InstCount: 228 IndexOperandHashes:29 - InstIndex: 030 OpndIndex: 131 OpndHash: 332...33)";34 std::string MapDump;35 raw_string_ostream OS(MapDump);36 MapRecord.print(OS);37 EXPECT_EQ(ExpectedMapStr, MapDump);38}39 40TEST(StableFunctionMapRecordTest, Stable) {41 StableFunction Func1{1, "Func2", "Mod1", 1, {}};42 StableFunction Func2{1, "Func3", "Mod1", 1, {}};43 StableFunction Func3{1, "Func1", "Mod2", 1, {}};44 StableFunction Func4{2, "Func4", "Mod3", 1, {}};45 46 StableFunctionMapRecord MapRecord1;47 MapRecord1.FunctionMap->insert(Func1);48 MapRecord1.FunctionMap->insert(Func2);49 MapRecord1.FunctionMap->insert(Func3);50 MapRecord1.FunctionMap->insert(Func4);51 52 StableFunctionMapRecord MapRecord2;53 MapRecord2.FunctionMap->insert(Func4);54 MapRecord2.FunctionMap->insert(Func3);55 MapRecord2.FunctionMap->insert(Func2);56 MapRecord2.FunctionMap->insert(Func1);57 58 // Output is sorted by hash (1 < 2), module name (Mod1 < Mod2), and function59 // name (Func2 < Func3).60 std::string MapDump1;61 raw_string_ostream OS1(MapDump1);62 MapRecord1.print(OS1);63 std::string MapDump2;64 raw_string_ostream OS2(MapDump2);65 MapRecord2.print(OS2);66 EXPECT_EQ(MapDump1, MapDump2);67}68 69TEST(StableFunctionMapRecordTest, Serialize) {70 StableFunctionMapRecord MapRecord1;71 StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}, {{1, 2}, 4}}};72 StableFunction Func2{2, "Func2", "Mod1", 3, {{{0, 1}, 2}}};73 StableFunction Func3{2, "Func3", "Mod1", 3, {{{0, 1}, 3}}};74 MapRecord1.FunctionMap->insert(Func1);75 MapRecord1.FunctionMap->insert(Func2);76 MapRecord1.FunctionMap->insert(Func3);77 78 // Serialize and deserialize the map.79 SmallVector<char> Out;80 raw_svector_ostream OS(Out);81 std::vector<CGDataPatchItem> PatchItems;82 MapRecord1.serialize(OS, PatchItems);83 CGDataOStream COS(OS);84 COS.patch(PatchItems);85 86 StableFunctionMapRecord MapRecord2;87 const uint8_t *Data = reinterpret_cast<const uint8_t *>(Out.data());88 MapRecord2.deserialize(Data);89 90 // Two maps should be identical.91 std::string MapDump1;92 raw_string_ostream OS1(MapDump1);93 MapRecord1.print(OS1);94 std::string MapDump2;95 raw_string_ostream OS2(MapDump2);96 MapRecord2.print(OS2);97 98 EXPECT_EQ(MapDump1, MapDump2);99}100 101TEST(StableFunctionMapRecordTest, SerializeYAML) {102 StableFunctionMapRecord MapRecord1;103 StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}, {{1, 2}, 4}}};104 StableFunction Func2{2, "Func2", "Mod1", 3, {{{0, 1}, 2}}};105 StableFunction Func3{2, "Func3", "Mod1", 3, {{{0, 1}, 3}}};106 MapRecord1.FunctionMap->insert(Func1);107 MapRecord1.FunctionMap->insert(Func2);108 MapRecord1.FunctionMap->insert(Func3);109 110 // Serialize and deserialize the map in a YAML format.111 std::string Out;112 raw_string_ostream OS(Out);113 yaml::Output YOS(OS);114 MapRecord1.serializeYAML(YOS);115 116 StableFunctionMapRecord MapRecord2;117 yaml::Input YIS(StringRef(Out.data(), Out.size()));118 MapRecord2.deserializeYAML(YIS);119 120 // Two maps should be identical.121 std::string MapDump1;122 raw_string_ostream OS1(MapDump1);123 MapRecord1.print(OS1);124 std::string MapDump2;125 raw_string_ostream OS2(MapDump2);126 MapRecord2.print(OS2);127 128 EXPECT_EQ(MapDump1, MapDump2);129}130 131} // end namespace132