1*134401deSJoseph Huber // RUN: %libomptarget-compile-run-and-check-generic 2*134401deSJoseph Huber 3*134401deSJoseph Huber // REQUIRES: libc 4*134401deSJoseph Huber 5*134401deSJoseph Huber #include <assert.h> 6*134401deSJoseph Huber #include <omp.h> 7*134401deSJoseph Huber #include <stdio.h> 8*134401deSJoseph Huber 9*134401deSJoseph Huber #pragma omp begin declare variant match(device = {kind(gpu)}) 10*134401deSJoseph Huber // Extension provided by the 'libc' project. 11*134401deSJoseph Huber unsigned long long __llvm_omp_host_call(void *fn, void *args, size_t size); 12*134401deSJoseph Huber #pragma omp declare target to(__llvm_omp_host_call) device_type(nohost) 13*134401deSJoseph Huber #pragma omp end declare variant 14*134401deSJoseph Huber 15*134401deSJoseph Huber #pragma omp begin declare variant match(device = {kind(cpu)}) 16*134401deSJoseph Huber // Dummy host implementation to make this work for all targets. 17*134401deSJoseph Huber unsigned long long __llvm_omp_host_call(void *fn, void *args, size_t size) { 18*134401deSJoseph Huber return ((unsigned long long (*)(void *))fn)(args); 19*134401deSJoseph Huber } 20*134401deSJoseph Huber #pragma omp end declare variant 21*134401deSJoseph Huber 22*134401deSJoseph Huber long long foo(void *data) { return -1; } 23*134401deSJoseph Huber 24*134401deSJoseph Huber void *fn_ptr = NULL; 25*134401deSJoseph Huber #pragma omp declare target to(fn_ptr) 26*134401deSJoseph Huber 27*134401deSJoseph Huber int main() { 28*134401deSJoseph Huber fn_ptr = (void *)&foo; 29*134401deSJoseph Huber #pragma omp target update to(fn_ptr) 30*134401deSJoseph Huber 31*134401deSJoseph Huber for (int i = 0; i < 4; ++i) { 32*134401deSJoseph Huber #pragma omp target 33*134401deSJoseph Huber { 34*134401deSJoseph Huber long long res = __llvm_omp_host_call(fn_ptr, NULL, 0); 35*134401deSJoseph Huber assert(res == -1 && "RPC call failed\n"); 36*134401deSJoseph Huber } 37*134401deSJoseph Huber 38*134401deSJoseph Huber for (int j = 0; j < 128; ++j) { 39*134401deSJoseph Huber #pragma omp target nowait 40*134401deSJoseph Huber { 41*134401deSJoseph Huber long long res = __llvm_omp_host_call(fn_ptr, NULL, 0); 42*134401deSJoseph Huber assert(res == -1 && "RPC call failed\n"); 43*134401deSJoseph Huber } 44*134401deSJoseph Huber } 45*134401deSJoseph Huber #pragma omp taskwait 46*134401deSJoseph Huber 47*134401deSJoseph Huber #pragma omp target 48*134401deSJoseph Huber { 49*134401deSJoseph Huber long long res = __llvm_omp_host_call(fn_ptr, NULL, 0); 50*134401deSJoseph Huber assert(res == -1 && "RPC call failed\n"); 51*134401deSJoseph Huber } 52*134401deSJoseph Huber } 53*134401deSJoseph Huber 54*134401deSJoseph Huber // CHECK: PASS 55*134401deSJoseph Huber puts("PASS"); 56*134401deSJoseph Huber } 57