diff options
author | Ross Brunton <ross@codeplay.com> | 2025-07-14 16:05:41 +0100 |
---|---|---|
committer | Ross Brunton <ross@codeplay.com> | 2025-07-14 16:13:03 +0100 |
commit | 8589fcc6d053cb2937cf970d1ce354abfb84da31 (patch) | |
tree | 16d0fe40bf88867c2c2591c6e7eac86a9d43cda5 /offload/unittests/OffloadAPI/program/olLinkProgram.cpp | |
parent | fa31376cc84b9039fc91bdccb1362f98074da255 (diff) | |
download | llvm-users/RossBrunton/link2.zip llvm-users/RossBrunton/link2.tar.gz llvm-users/RossBrunton/link2.tar.bz2 |
[Offload] Add `olLinkProgram`users/RossBrunton/link2
A version of `olCreateProgram` that inputs many bitcode files and links
them together before loading them.
Diffstat (limited to 'offload/unittests/OffloadAPI/program/olLinkProgram.cpp')
-rw-r--r-- | offload/unittests/OffloadAPI/program/olLinkProgram.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/offload/unittests/OffloadAPI/program/olLinkProgram.cpp b/offload/unittests/OffloadAPI/program/olLinkProgram.cpp new file mode 100644 index 0000000..122d015 --- /dev/null +++ b/offload/unittests/OffloadAPI/program/olLinkProgram.cpp @@ -0,0 +1,99 @@ +//===------- Offload API tests - olCreateProgram --------------------------===// +// +// 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 "../common/Fixtures.hpp" +#include <OffloadAPI.h> +#include <gtest/gtest.h> + +using olLinkProgramTest = OffloadQueueTest; +OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLinkProgramTest); + +TEST_P(olLinkProgramTest, SuccessSingle) { + + std::unique_ptr<llvm::MemoryBuffer> DeviceBin; + ASSERT_TRUE(TestEnvironment::loadDeviceBinary("foo", Device, DeviceBin)); + ASSERT_GE(DeviceBin->getBufferSize(), 0lu); + + ol_program_link_buffer_t Buffers[1] = { + {const_cast<char *>(DeviceBin->getBufferStart()), + DeviceBin->getBufferSize()}, + }; + + ol_program_handle_t Program; + ASSERT_SUCCESS(olLinkProgram(Device, Buffers, 1, &Program)); + ASSERT_NE(Program, nullptr); + + ASSERT_SUCCESS(olDestroyProgram(Program)); +} + +TEST_P(olLinkProgramTest, SuccessBuild) { + std::unique_ptr<llvm::MemoryBuffer> ABin; + ASSERT_TRUE(TestEnvironment::loadDeviceBinary("link_a", Device, ABin)); + std::unique_ptr<llvm::MemoryBuffer> BBin; + ASSERT_TRUE(TestEnvironment::loadDeviceBinary("link_b", Device, BBin)); + + ol_program_link_buffer_t Buffers[2] = { + {const_cast<char *>(ABin->getBufferStart()), ABin->getBufferSize()}, + {const_cast<char *>(BBin->getBufferStart()), BBin->getBufferSize()}, + }; + + ol_program_handle_t Program; + auto LinkResult = olLinkProgram(Device, Buffers, 2, &Program); + if (LinkResult && LinkResult->Code == OL_ERRC_UNSUPPORTED) + GTEST_SKIP() << "Linking unsupported: " << LinkResult->Details; + ASSERT_SUCCESS(LinkResult); + ASSERT_NE(Program, nullptr); + + ol_symbol_handle_t Kernel; + ASSERT_SUCCESS( + olGetSymbol(Program, "link_a", OL_SYMBOL_KIND_KERNEL, &Kernel)); + + void *Mem; + ASSERT_SUCCESS( + olMemAlloc(Device, OL_ALLOC_TYPE_MANAGED, 2 * sizeof(uint32_t), &Mem)); + struct { + void *Mem; + } Args{Mem}; + ol_kernel_launch_size_args_t LaunchArgs{}; + LaunchArgs.GroupSize = {1, 1, 1}; + LaunchArgs.NumGroups = {1, 1, 1}; + LaunchArgs.Dimensions = 1; + + ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &Args, sizeof(Args), + &LaunchArgs, nullptr)); + ASSERT_SUCCESS(olWaitQueue(Queue)); + + uint32_t *Data = (uint32_t *)Mem; + ASSERT_EQ(Data[0], 200); + ASSERT_EQ(Data[1], 100); + + ASSERT_SUCCESS(olMemFree(Mem)); + ASSERT_SUCCESS(olDestroyProgram(Program)); +} + +TEST_P(olLinkProgramTest, InvalidNotBitcode) { + char FakeElf[] = + "\177ELF0000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000"; + + ol_program_link_buffer_t Buffers[1] = { + {FakeElf, sizeof(FakeElf)}, + }; + + ol_program_handle_t Program; + ASSERT_ERROR(OL_ERRC_INVALID_BINARY, + olLinkProgram(Device, Buffers, 1, &Program)); +} + +TEST_P(olLinkProgramTest, InvalidSize) { + ol_program_link_buffer_t Buffers[0] = {}; + + ol_program_handle_t Program; + ASSERT_ERROR(OL_ERRC_INVALID_SIZE, + olLinkProgram(Device, Buffers, 0, &Program)); +} |