llvm-project/llvm/unittests/Object/OffloadingTest.cpp
Joseph Huber f06731e3c3 [Binary] Make the OffloadingImage type own the memory
Summary:
The OffloadingBinary uses a convenience struct to help manage the memory
that will be serialized using the binary format. This currently uses a
reference to an existing buffer, but this should own the memory instead
so it is easier to work with seeing as its only current use requires
saving the buffer anyway.
2022-06-07 15:56:09 -04:00

68 lines
2.5 KiB
C++

#include "llvm/Object/OffloadBinary.h"
#include "llvm/Testing/Support/Error.h"
#include "gtest/gtest.h"
#include <random>
using namespace llvm;
using namespace llvm::object;
TEST(OffloadingTest, checkOffloadingBinary) {
// Create random data to fill the image.
std::mt19937 Rng(std::random_device{}());
std::uniform_int_distribution<uint64_t> SizeDist(0, 256);
std::uniform_int_distribution<uint16_t> KindDist(0);
std::uniform_int_distribution<uint16_t> BinaryDist(
std::numeric_limits<uint8_t>::min(), std::numeric_limits<uint8_t>::max());
std::uniform_int_distribution<int16_t> StringDist('!', '~');
std::vector<uint8_t> Image(SizeDist(Rng));
std::generate(Image.begin(), Image.end(), [&]() { return BinaryDist(Rng); });
std::vector<std::pair<std::string, std::string>> Strings(SizeDist(Rng));
for (auto &KeyAndValue : Strings) {
std::string Key(SizeDist(Rng), '\0');
std::string Value(SizeDist(Rng), '\0');
std::generate(Key.begin(), Key.end(), [&]() { return StringDist(Rng); });
std::generate(Value.begin(), Value.end(),
[&]() { return StringDist(Rng); });
KeyAndValue = std::make_pair(Key, Value);
}
// Create the image.
StringMap<StringRef> StringData;
for (auto &KeyAndValue : Strings)
StringData[KeyAndValue.first] = KeyAndValue.second;
std::unique_ptr<MemoryBuffer> ImageData = MemoryBuffer::getMemBuffer(
{reinterpret_cast<char *>(Image.data()), Image.size()}, "", false);
OffloadBinary::OffloadingImage Data;
Data.TheImageKind = static_cast<ImageKind>(KindDist(Rng));
Data.TheOffloadKind = static_cast<OffloadKind>(KindDist(Rng));
Data.Flags = KindDist(Rng);
Data.StringData = StringData;
Data.Image = std::move(ImageData);
auto BinaryBuffer = OffloadBinary::write(Data);
auto BinaryOrErr = OffloadBinary::create(*BinaryBuffer);
if (!BinaryOrErr)
FAIL();
// Make sure we get the same data out.
auto &Binary = **BinaryOrErr;
ASSERT_EQ(Data.TheImageKind, Binary.getImageKind());
ASSERT_EQ(Data.TheOffloadKind, Binary.getOffloadKind());
ASSERT_EQ(Data.Flags, Binary.getFlags());
for (auto &KeyAndValue : Strings)
ASSERT_TRUE(StringData[KeyAndValue.first] ==
Binary.getString(KeyAndValue.first));
EXPECT_TRUE(Data.Image->getBuffer() == Binary.getImage());
// Ensure the size and alignment of the data is correct.
EXPECT_TRUE(Binary.getSize() % OffloadBinary::getAlignment() == 0);
EXPECT_TRUE(Binary.getSize() == BinaryBuffer->getBuffer().size());
}