1 #include "llvm/Object/OffloadBinary.h" 2 3 #include "llvm/Testing/Support/Error.h" 4 #include "gtest/gtest.h" 5 #include <random> 6 7 TEST(OffloadingTest, checkOffloadingBinary) { 8 // Create random data to fill the image. 9 std::mt19937 Rng(std::random_device{}()); 10 std::uniform_int_distribution<uint64_t> SizeDist(0, 256); 11 std::uniform_int_distribution<uint16_t> KindDist(0); 12 std::uniform_int_distribution<uint16_t> BinaryDist( 13 std::numeric_limits<uint8_t>::min(), std::numeric_limits<uint8_t>::max()); 14 std::uniform_int_distribution<int16_t> StringDist('!', '~'); 15 std::vector<uint8_t> Image(SizeDist(Rng)); 16 std::generate(Image.begin(), Image.end(), [&]() { return BinaryDist(Rng); }); 17 std::vector<std::pair<std::string, std::string>> Strings(SizeDist(Rng)); 18 for (auto &KeyAndValue : Strings) { 19 std::string Key(SizeDist(Rng), '\0'); 20 std::string Value(SizeDist(Rng), '\0'); 21 22 std::generate(Key.begin(), Key.end(), [&]() { return StringDist(Rng); }); 23 std::generate(Value.begin(), Value.end(), 24 [&]() { return StringDist(Rng); }); 25 26 KeyAndValue = std::make_pair(Key, Value); 27 } 28 29 // Create the image. 30 llvm::StringMap<llvm::StringRef> StringData; 31 for (auto &KeyAndValue : Strings) 32 StringData[KeyAndValue.first] = KeyAndValue.second; 33 std::unique_ptr<llvm::MemoryBuffer> ImageData = 34 llvm::MemoryBuffer::getMemBuffer( 35 {reinterpret_cast<char *>(Image.data()), Image.size()}, "", false); 36 37 llvm::OffloadBinary::OffloadingImage Data; 38 Data.TheImageKind = static_cast<llvm::ImageKind>(KindDist(Rng)); 39 Data.TheOffloadKind = static_cast<llvm::OffloadKind>(KindDist(Rng)); 40 Data.Flags = KindDist(Rng); 41 Data.StringData = StringData; 42 Data.Image = *ImageData; 43 44 auto BinaryBuffer = llvm::OffloadBinary::write(Data); 45 46 auto BinaryOrErr = llvm::OffloadBinary::create(*BinaryBuffer); 47 if (!BinaryOrErr) 48 FAIL(); 49 50 // Make sure we get the same data out. 51 auto &Binary = **BinaryOrErr; 52 ASSERT_EQ(Data.TheImageKind, Binary.getImageKind()); 53 ASSERT_EQ(Data.TheOffloadKind, Binary.getOffloadKind()); 54 ASSERT_EQ(Data.Flags, Binary.getFlags()); 55 56 for (auto &KeyAndValue : Strings) 57 ASSERT_TRUE(StringData[KeyAndValue.first] == 58 Binary.getString(KeyAndValue.first)); 59 60 EXPECT_TRUE(Data.Image.getBuffer() == Binary.getImage()); 61 62 // Ensure the size and alignment of the data is correct. 63 EXPECT_TRUE(Binary.getSize() % llvm::OffloadBinary::getAlignment() == 0); 64 EXPECT_TRUE(Binary.getSize() == BinaryBuffer->getBuffer().size()); 65 } 66