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/liboffload/src/OffloadImpl.cpp | |
| parent | fa31376cc84b9039fc91bdccb1362f98074da255 (diff) | |
[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/liboffload/src/OffloadImpl.cpp')
| -rw-r--r-- | offload/liboffload/src/OffloadImpl.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp index 17a2b00cb714..14af015460c8 100644 --- a/offload/liboffload/src/OffloadImpl.cpp +++ b/offload/liboffload/src/OffloadImpl.cpp @@ -650,6 +650,39 @@ Error olCreateProgram_impl(ol_device_handle_t Device, const void *ProgData, return Error::success(); } +Error olLinkProgram_impl(ol_device_impl_t *Device, + ol_program_link_buffer_t *Images, size_t ImagesSize, + ol_program_handle_t *Program) { + std::vector<__tgt_device_image> DevImages; + for (size_t I = 0; I < ImagesSize; I++) { + auto &ProgData = Images[I]; + DevImages.push_back({ProgData.Address, + utils::advancePtr(ProgData.Address, ProgData.Size), + nullptr, nullptr}); + } + + auto LinkResult = + Device->Device->jitLinkBinary(Device->Device->Plugin, DevImages); + if (!LinkResult) + return LinkResult.takeError(); + + ol_program_handle_t Prog = + new ol_program_impl_t(nullptr, nullptr, *LinkResult); + + auto Res = + Device->Device->loadBinary(Device->Device->Plugin, &Prog->DeviceImage); + if (!Res) { + delete Prog; + return Res.takeError(); + } + assert(*Res != nullptr && "loadBinary returned nullptr"); + + Prog->Image = *Res; + *Program = Prog; + + return Error::success(); +} + Error olDestroyProgram_impl(ol_program_handle_t Program) { auto &Device = Program->Image->getDevice(); if (auto Err = Device.unloadBinary(Program->Image)) |
