summaryrefslogtreecommitdiff
path: root/offload/plugins-nextgen/common/src/JIT.cpp
diff options
context:
space:
mode:
authorRoss Brunton <ross@codeplay.com>2025-07-14 16:05:41 +0100
committerRoss Brunton <ross@codeplay.com>2025-07-14 16:13:03 +0100
commit8589fcc6d053cb2937cf970d1ce354abfb84da31 (patch)
tree16d0fe40bf88867c2c2591c6e7eac86a9d43cda5 /offload/plugins-nextgen/common/src/JIT.cpp
parentfa31376cc84b9039fc91bdccb1362f98074da255 (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/plugins-nextgen/common/src/JIT.cpp')
-rw-r--r--offload/plugins-nextgen/common/src/JIT.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/offload/plugins-nextgen/common/src/JIT.cpp b/offload/plugins-nextgen/common/src/JIT.cpp
index 835dcc0da2ec..2cf6ddbfdff0 100644
--- a/offload/plugins-nextgen/common/src/JIT.cpp
+++ b/offload/plugins-nextgen/common/src/JIT.cpp
@@ -327,3 +327,44 @@ JITEngine::process(const __tgt_device_image &Image,
return &Image;
}
+
+Expected<__tgt_device_image>
+JITEngine::link(std::vector<__tgt_device_image> &Images,
+ target::plugin::GenericDeviceTy &Device) {
+ const std::string &ComputeUnitKind = Device.getComputeUnitKind();
+ ComputeUnitInfo &CUI = ComputeUnitMap[ComputeUnitKind];
+
+ PostProcessingFn PostProcessing =
+ [&Device](llvm::SmallVector<std::unique_ptr<MemoryBuffer>> &&MB)
+ -> Expected<std::unique_ptr<MemoryBuffer>> {
+ return Device.doJITPostProcessing(std::move(MB));
+ };
+
+ std::lock_guard<std::mutex> Lock(ComputeUnitMapMutex);
+
+ llvm::SmallVector<std::unique_ptr<MemoryBuffer>> Buffers;
+ size_t Index = 0;
+ for (auto &I : Images) {
+ if (!isImageBitcode(I))
+ return error::createOffloadError(
+ error::ErrorCode::INVALID_BINARY,
+ "binary %i provided to link operation is not bitcode", Index);
+ Index++;
+
+ auto ObjMBOrErr = getOrCreateObjFile(I, CUI.Context, ComputeUnitKind);
+ if (!ObjMBOrErr)
+ return ObjMBOrErr.takeError();
+ Buffers.push_back(std::move(*ObjMBOrErr));
+ }
+
+ auto ImageMBOrErr = PostProcessing(std::move(Buffers));
+ if (!ImageMBOrErr)
+ return ImageMBOrErr.takeError();
+
+ auto &ImageMB = CUI.JITImages.emplace_back(std::move(*ImageMBOrErr));
+ __tgt_device_image JITedImage{};
+ JITedImage.ImageStart = const_cast<char *>(ImageMB->getBufferStart());
+ JITedImage.ImageEnd = const_cast<char *>(ImageMB->getBufferEnd());
+
+ return JITedImage;
+}