diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -1100,6 +1100,12 @@ /* ------------------------------------------------------------------------ */ +#if ENABLE_LIBOMPTARGET +extern void __kmp_init_target_task(); +#endif + +/* ------------------------------------------------------------------------ */ + #define KMP_UINT64_MAX \ (~((kmp_uint64)1 << ((sizeof(kmp_uint64) * (1 << 3)) - 1))) diff --git a/openmp/runtime/src/kmp_runtime.cpp b/openmp/runtime/src/kmp_runtime.cpp --- a/openmp/runtime/src/kmp_runtime.cpp +++ b/openmp/runtime/src/kmp_runtime.cpp @@ -553,6 +553,14 @@ /* ------------------------------------------------------------------------ */ +#if ENABLE_LIBOMPTARGET +static void __kmp_init_omptarget() { + __kmp_init_target_task(); +} +#endif + +/* ------------------------------------------------------------------------ */ + #if KMP_DYNAMIC_LIB #if KMP_OS_WINDOWS @@ -7041,6 +7049,11 @@ __kmp_validate_locks(); +#if ENABLE_LIBOMPTARGET + /* Initialize functions from libomptarget */ + __kmp_init_omptarget(); +#endif + /* Initialize internal memory allocator */ __kmp_init_allocator(); diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp --- a/openmp/runtime/src/kmp_tasking.cpp +++ b/openmp/runtime/src/kmp_tasking.cpp @@ -22,8 +22,11 @@ #endif #if ENABLE_LIBOMPTARGET -// Declaration of synchronization function from libomptarget. -extern "C" void __tgt_target_nowait_query(void **) KMP_WEAK_ATTRIBUTE_INTERNAL; +static void (*tgt_target_nowait_query)(void **); + +void __kmp_init_target_task() { + *(void **)(&tgt_target_nowait_query) = KMP_DLSYM("__tgt_target_nowait_query"); +} #endif /* forward declaration */ @@ -1805,7 +1808,8 @@ // If we have a valid target async handle, that means that we have already // executed the task routine once. We must query for the handle completion // instead of re-executing the routine. - __tgt_target_nowait_query(&taskdata->td_target_data.async_handle); + KMP_ASSERT(tgt_target_nowait_query); + tgt_target_nowait_query(&taskdata->td_target_data.async_handle); } else #endif if (task->routine != NULL) {