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