diff --git a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp --- a/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp +++ b/openmp/libomptarget/plugins/amdgpu/src/rtl.cpp @@ -1113,10 +1113,21 @@ pthread_mutex_t SignalPoolT::mutex = PTHREAD_MUTEX_INITIALIZER; -// Putting accesses to DeviceInfo global behind a function call prior -// to changing to use init_plugin/deinit_plugin calls -static RTLDeviceInfoTy DeviceInfoState; -static RTLDeviceInfoTy& DeviceInfo() { return DeviceInfoState; } +static RTLDeviceInfoTy *DeviceInfoState = nullptr; +static RTLDeviceInfoTy &DeviceInfo() { return *DeviceInfoState; } + +int32_t __tgt_rtl_init_plugin() { + DeviceInfoState = new RTLDeviceInfoTy; + return (DeviceInfoState && DeviceInfoState->ConstructionSucceeded) + ? OFFLOAD_SUCCESS + : OFFLOAD_FAIL; +} + +int32_t __tgt_rtl_deinit_plugin() { + if (DeviceInfoState) + delete DeviceInfoState; + return OFFLOAD_SUCCESS; +} namespace { @@ -2051,9 +2062,6 @@ return true; } -int32_t __tgt_rtl_init_plugin() { return OFFLOAD_SUCCESS; } -int32_t __tgt_rtl_deinit_plugin() { return OFFLOAD_SUCCESS; } - int __tgt_rtl_number_of_devices() { // If the construction failed, no methods are safe to call if (DeviceInfo().ConstructionSucceeded) { diff --git a/openmp/libomptarget/src/rtl.cpp b/openmp/libomptarget/src/rtl.cpp --- a/openmp/libomptarget/src/rtl.cpp +++ b/openmp/libomptarget/src/rtl.cpp @@ -67,6 +67,15 @@ __attribute__((destructor(101))) void deinit() { DP("Deinit target library!\n"); + + for (auto *R : PM->RTLs.UsedRTLs) { + if (R->deinit_plugin) { + if (R->deinit_plugin() != OFFLOAD_SUCCESS) { + DP("Failure deinitializing RTL %s!\n", R->RTLName.c_str()); + } + } + } + delete PM; #ifdef OMPTARGET_PROFILE_ENABLED @@ -567,13 +576,6 @@ PM->TblMapMtx.unlock(); // TODO: Write some RTL->unload_image(...) function? - for (auto *R : UsedRTLs) { - if (R->deinit_plugin) { - if (R->deinit_plugin() != OFFLOAD_SUCCESS) { - DP("Failure deinitializing RTL %s!\n", R->RTLName.c_str()); - } - } - } DP("Done unregistering library!\n"); }