mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
[OpenMP] Handle function calls from libomp
to libomptarget
correctly
D132005 introduced function calls from `libomp` to `libomptarget` if offloading is enabled. However, the external function declaration may not always work. For example, it causes a link error on macOS. Currently it is guarded properly by a macro, but in order to get OpenMP target offloading working on macOS, it has to be handled correctly. This patch applies the same idea of how we support target memory extension by using function pointer indirect call for that function. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D149557
This commit is contained in:
parent
c9d14b2329
commit
479e335fc3
@ -1100,6 +1100,12 @@ extern void __kmp_init_target_mem();
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
#if ENABLE_LIBOMPTARGET
|
||||
extern void __kmp_init_target_task();
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
#define KMP_UINT64_MAX \
|
||||
(~((kmp_uint64)1 << ((sizeof(kmp_uint64) * (1 << 3)) - 1)))
|
||||
|
||||
|
@ -553,6 +553,14 @@ static void __kmp_fini_allocator() { __kmp_fini_memkind(); }
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
#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 @@ static void __kmp_do_serial_initialize(void) {
|
||||
|
||||
__kmp_validate_locks();
|
||||
|
||||
#if ENABLE_LIBOMPTARGET
|
||||
/* Initialize functions from libomptarget */
|
||||
__kmp_init_omptarget();
|
||||
#endif
|
||||
|
||||
/* Initialize internal memory allocator */
|
||||
__kmp_init_allocator();
|
||||
|
||||
|
@ -22,8 +22,12 @@
|
||||
#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");
|
||||
KMP_ASSERT(tgt_target_nowait_query);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* forward declaration */
|
||||
@ -1805,7 +1809,7 @@ static void __kmp_invoke_task(kmp_int32 gtid, kmp_task_t *task,
|
||||
// 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);
|
||||
tgt_target_nowait_query(&taskdata->td_target_data.async_handle);
|
||||
} else
|
||||
#endif
|
||||
if (task->routine != NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user