/// adds a target shared library to the target execution image
EXTERN void __tgt_register_lib(__tgt_bin_desc *desc) {
TIMESCOPE();
+ std::call_once(PM->RTLs.initFlag, &RTLsTy::LoadRTLs, PM->RTLs);
+ for (auto &RTL : PM->RTLs.AllRTLs) {
+ if (RTL.register_lib) {
+ if ((*RTL.register_lib)(desc) != OFFLOAD_SUCCESS) {
+ DP("Could not register library with %s", RTL.RTLName.c_str());
+ }
+ }
+ }
PM->RTLs.RegisterLib(desc);
}
EXTERN void __tgt_unregister_lib(__tgt_bin_desc *desc) {
TIMESCOPE();
PM->RTLs.UnregisterLib(desc);
+ for (auto &RTL : PM->RTLs.UsedRTLs) {
+ if (RTL->unregister_lib) {
+ if ((*RTL->unregister_lib)(desc) != OFFLOAD_SUCCESS) {
+ DP("Could not register library with %s", RTL->RTLName.c_str());
+ }
+ }
+ }
}
/// creates host-to-target data mapping, stores it in the
/* AArch64 target */ "libomptarget.rtl.aarch64.so",
/* SX-Aurora VE target */ "libomptarget.rtl.ve.so",
/* AMDGPU target */ "libomptarget.rtl.amdgpu.so",
+ /* Remote target */ "libomptarget.rtl.rpc.so",
};
PluginManager *PM;
dlsym(dynlib_handle, "__tgt_rtl_data_exchange_async");
*((void **)&R.is_data_exchangable) =
dlsym(dynlib_handle, "__tgt_rtl_is_data_exchangable");
+ *((void **)&R.register_lib) =
+ dlsym(dynlib_handle, "__tgt_rtl_register_lib");
+ *((void **)&R.unregister_lib) =
+ dlsym(dynlib_handle, "__tgt_rtl_unregister_lib");
}
DP("RTLs loaded!\n");
}
void RTLsTy::RegisterLib(__tgt_bin_desc *desc) {
- // Attempt to load all plugins available in the system.
- std::call_once(initFlag, &RTLsTy::LoadRTLs, this);
-
PM->RTLsMtx.lock();
// Register the images with the RTLs that understand them, if any.
for (int32_t i = 0; i < desc->NumDeviceImages; ++i) {
__tgt_async_info *);
typedef int64_t(init_requires_ty)(int64_t);
typedef int64_t(synchronize_ty)(int32_t, __tgt_async_info *);
+ typedef int32_t (*register_lib_ty)(__tgt_bin_desc *);
int32_t Idx = -1; // RTL index, index is the number of devices
// of other RTLs that were registered before,
run_team_region_async_ty *run_team_region_async = nullptr;
init_requires_ty *init_requires = nullptr;
synchronize_ty *synchronize = nullptr;
+ register_lib_ty register_lib = nullptr;
+ register_lib_ty unregister_lib = nullptr;
// Are there images associated with this RTL.
bool isUsed = false;
};
/// RTLs identified in the system.
-class RTLsTy {
-private:
- // Mutex-like object to guarantee thread-safety and unique initialization
- // (i.e. the library attempts to load the RTLs (plugins) only once).
- std::once_flag initFlag;
- void LoadRTLs(); // not thread-safe
-
-public:
+struct RTLsTy {
// List of the detected runtime libraries.
std::list<RTLInfoTy> AllRTLs;
// Unregister a shared library from all RTLs.
void UnregisterLib(__tgt_bin_desc *desc);
-};
+ // Mutex-like object to guarantee thread-safety and unique initialization
+ // (i.e. the library attempts to load the RTLs (plugins) only once).
+ std::once_flag initFlag;
+ void LoadRTLs(); // not thread-safe
+};
/// Map between the host entry begin and the translation table. Each
/// registered library gets one TranslationTable. Use the map from