================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits