[llvm-branch-commits] [llvm] [libsycl] Add liboffload kernel creation (PR #188794)

Yury Plyakhin via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Apr 3 13:43:38 PDT 2026


================
@@ -140,6 +161,81 @@ DeviceImageWrapper *ProgramManager::getDeviceImage(std::string_view KernelName,
                   "No kernel named " + std::string(KernelName) + " was found");
 }
 
+ol_symbol_handle_t ProgramManager::getOrCreateKernel(const char *KernelName,
+                                                     DeviceImpl &Device) {
+  std::unique_lock<std::mutex> ImageGuard(MImageCollectionMutex);
+
+  auto KernelIDIt = MKernelNameToID.find(KernelName);
+  if (KernelIDIt == MKernelNameToID.end())
+    throw exception(make_error_code(errc::runtime),
+                    "No kernel named " + std::string(KernelName) +
+                        " was found");
+
+  std::lock_guard<std::mutex> KernelGuard(MKernelCollectionsMutex);
+
+  auto Kernel = getKernel(KernelIDIt->second, Device);
+  if (Kernel)
+    return Kernel;
+
+  DeviceImageWrapper *DevImage =
+      getDeviceImage(KernelName, KernelIDIt->second, Device);
+
+  ImageGuard.unlock();
+
+  ol_program_handle_t Program = getOrCreateProgram(Device, DevImage);
+  assert(Program);
+  Kernel = createKernel(Program, KernelIDIt->second, KernelName, Device);
----------------
YuriPlyakhin wrote:

`KernelIDIt` may be invalidated by `addImages`, since MKernelNameToID maybe updated.

Copy kernel id:
`kernel_id KernelID = KernelIDIt->second;`
before the unlock: `ImageGuard.unlock();`

https://github.com/llvm/llvm-project/pull/188794


More information about the llvm-branch-commits mailing list