summaryrefslogtreecommitdiff
path: root/offload/liboffload/src/OffloadImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'offload/liboffload/src/OffloadImpl.cpp')
-rw-r--r--offload/liboffload/src/OffloadImpl.cpp33
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))