xref: /llvm-project/offload/test/libc/server.c (revision 134401deea5e86d646bb99fab39c182cfa8e5292)
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