[clang] [llvm] [Offload] Provide a kernel library useable by the offload runtime (PR #104168)
Jan Patrick Lehr via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 9 03:09:09 PDT 2024
================
@@ -1533,6 +1565,67 @@ Error GenericDeviceTy::printInfo() {
return Plugin::success();
}
+Expected<GenericKernelTy *> GenericDeviceTy::getKernel(llvm::StringRef Name,
+ DeviceImageTy *ImagePtr,
+ bool Optional) {
+ bool KernelFound = false;
+ GenericKernelTy *&KernelPtr = KernelMap[Name];
+ if (!KernelPtr) {
+ GenericGlobalHandlerTy &GHandler = Plugin.getGlobalHandler();
+
+ auto CheckImage = [&](DeviceImageTy &Image) -> GenericKernelTy * {
+ if (!GHandler.isSymbolInImage(*this, Image, Name))
+ return nullptr;
+ KernelFound = true;
+
+ auto KernelOrErr = constructKernelImpl(Name);
+ if (Error Err = KernelOrErr.takeError()) {
+ [[maybe_unused]] std::string ErrStr = toString(std::move(Err));
+ DP("Failed to construct kernel ('%s'): %s", Name.data(),
+ ErrStr.c_str());
+ return nullptr;
+ }
+
+ GenericKernelTy &Kernel = *KernelOrErr;
+ if (auto Err = Kernel.init(*this, Image)) {
+ [[maybe_unused]] std::string ErrStr = toString(std::move(Err));
+ DP("Failed to initialize kernel ('%s'): %s", Name.data(),
+ ErrStr.c_str());
+ return nullptr;
+ }
+
+ return &Kernel;
+ };
+
+ if (ImagePtr) {
+ KernelPtr = CheckImage(*ImagePtr);
+ } else {
+ for (DeviceImageTy *Image : LoadedImages) {
+ KernelPtr = CheckImage(*Image);
+ if (KernelPtr)
+ break;
+ }
+ }
+ }
+
+ // If we didn't find the kernel and it was optional, we do not emit an error.
+ if (!KernelPtr && !KernelFound && Optional)
+ return nullptr;
+ // If we didn't find the kernel and it was not optional, we will emit an
+ // error.
+ if (!KernelPtr && !KernelFound)
+ return Plugin::error(
+ "Kernel '%s' not found%s", Name.data(),
+ ImagePtr
+ ? ""
+ : ", searched " + std::to_string(LoadedImages.size()) + " images");
----------------
jplehr wrote:
I believe this misses a `.data()` or something.
https://github.com/llvm/llvm-project/pull/104168
More information about the cfe-commits
mailing list