[llvm-branch-commits] [llvm] [offload][omp] Load plugins through liboffload (PR #221733)
Alex Duran via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Sep 16 13:10:41 PDT 2026
https://github.com/adurang updated https://github.com/llvm/llvm-project/pull/221733
>From dcfed7c84ea76da6ab696cbfc459ec5ad6016e50 Mon Sep 17 00:00:00 2001
From: "Duran, Alex" <alejandro.duran at intel.com>
Date: Mon, 7 Sep 2026 02:42:34 -0700
Subject: [PATCH] [offload][omp] Load plugins through liboffload
---
offload/include/PluginManager.h | 3 ++-
offload/liboffload/src/OffloadImpl.cpp | 11 +++++++++
offload/libompaccsupport/PluginManager.cpp | 28 ++++++++++++----------
3 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/offload/include/PluginManager.h b/offload/include/PluginManager.h
index 6c6fdebe76dff..eea8b62a8c39d 100644
--- a/offload/include/PluginManager.h
+++ b/offload/include/PluginManager.h
@@ -13,6 +13,7 @@
#ifndef OMPTARGET_PLUGIN_MANAGER_H
#define OMPTARGET_PLUGIN_MANAGER_H
+#include "OffloadAPI.h"
#include "PluginInterface.h"
#include "DeviceImage.h"
@@ -155,7 +156,7 @@ struct PluginManager {
llvm::SmallVector<__tgt_bin_desc *> DelayedBinDesc;
// List of all plugins, in use or not.
- llvm::SmallVector<std::unique_ptr<GenericPluginTy>> Plugins;
+ llvm::SmallVector<GenericPluginTy *> Plugins;
// Mapping of plugins to the OpenMP device identifier.
llvm::DenseMap<std::pair<const GenericPluginTy *, int32_t>, int32_t>
diff --git a/offload/liboffload/src/OffloadImpl.cpp b/offload/liboffload/src/OffloadImpl.cpp
index 48f63ac32bc7b..cdc586b975bc4 100644
--- a/offload/liboffload/src/OffloadImpl.cpp
+++ b/offload/liboffload/src/OffloadImpl.cpp
@@ -1642,5 +1642,16 @@ Error olQueryQueue_impl(ol_queue_handle_t Queue, bool *IsQueueWorkCompleted) {
return Error::success();
}
+// Temporary helpers to help transition of libomptarget to liboffload
+extern "C" void __ol_tgt_setInfoFlag(uint32_t NewInfoLevel) {
+ std::atomic<uint32_t> &InfoLevel = getInfoLevelInternal();
+ InfoLevel.store(NewInfoLevel);
+}
+
+extern "C" GenericPluginTy *
+__ol_tgt_GetPluginFromPlatform(ol_platform_handle_t Platform) {
+ return Platform->Plugin.get();
+}
+
} // namespace offload
} // namespace llvm
diff --git a/offload/libompaccsupport/PluginManager.cpp b/offload/libompaccsupport/PluginManager.cpp
index 41b653a60adfd..4f0fe2ad36e7f 100644
--- a/offload/libompaccsupport/PluginManager.cpp
+++ b/offload/libompaccsupport/PluginManager.cpp
@@ -26,9 +26,8 @@ using namespace llvm::omp::target::debug;
PluginManager *PM = nullptr;
-// Every plugin exports this method to create an instance of the plugin type.
-#define PLUGIN_TARGET(Name) extern "C" GenericPluginTy *createPlugin_##Name();
-#include "Shared/Targets.def"
+extern "C" GenericPluginTy *
+__ol_tgt_GetPluginFromPlatform(ol_platform_handle_t Platform);
void PluginManager::init() {
TIMESCOPE();
@@ -38,14 +37,20 @@ void PluginManager::init() {
}
ODBG(ODT_Init) << "Loading RTLs";
-
- // Attempt to create an instance of each supported plugin.
-#define PLUGIN_TARGET(Name) \
- do { \
- Plugins.emplace_back( \
- std::unique_ptr<GenericPluginTy>(createPlugin_##Name())); \
- } while (false);
-#include "Shared/Targets.def"
+ if (ol_result_t Res = olInit(nullptr))
+ REPORT() << "Failed to initialize liboffload: " << Res->Details;
+
+ if (ol_result_t Res = olIteratePlatforms(
+ [](ol_platform_handle_t Platform, void *Data) {
+ auto *PM = static_cast<PluginManager *>(Data);
+ auto *Plugin = __ol_tgt_GetPluginFromPlatform(Platform);
+ ODBG(ODT_Init) << "Adding plugin " << Plugin->getName()
+ << " from liboffload";
+ PM->Plugins.push_back(Plugin);
+ return true;
+ },
+ this))
+ REPORT() << "Failed to iterate platforms: " << Res->Details;
ODBG(ODT_Init) << "RTLs loaded!";
}
@@ -62,7 +67,6 @@ void PluginManager::deinit() {
std::string InfoMsg = toString(std::move(Err));
ODBG(ODT_Deinit) << "Failed to deinit plugin: " << InfoMsg;
}
- Plugin.release();
}
ODBG(ODT_Deinit) << "RTLs unloaded!";
More information about the llvm-branch-commits
mailing list