| // clang-format off | |
| // RUN: %libomptarget-compile-generic -DSHARED -fPIC -shared -o %t.so && \ | |
| // RUN: %libomptarget-compile-generic %t.so -o %t && \ | |
| // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic | |
| // RUN: %libomptarget-compileopt-generic -DSHARED -fPIC -shared -o %t.so && \ | |
| // RUN: %libomptarget-compileopt-generic %t.so -o %t && \ | |
| // RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic | |
| // | |
| // REQUIRES: gpu | |
| // UNSUPPORTED: amdgcn-amd-amdhsa | |
| // UNSUPPORTED: nvptx64-nvidia-cuda | |
| // UNSUPPORTED: nvptx64-nvidia-cuda-LTO | |
| // clang-format on | |
| // Checks that a target region in the main program can access a declare target | |
| // variable that is defined in a shared library. | |
| #ifdef SHARED | |
| #pragma omp declare target | |
| int x = 42; | |
| #pragma omp end declare target | |
| #else | |
| #include <assert.h> | |
| #include <stdio.h> | |
| #pragma omp declare target | |
| extern int x; | |
| #pragma omp end declare target | |
| int main() { | |
| int value = 0; | |
| #pragma omp target map(from : value) | |
| value = x; | |
| assert(value == 42); | |
| x = 999; | |
| #pragma omp target update to(x) | |
| #pragma omp target map(from : value) | |
| value = x; | |
| assert(value == 999); | |
| #pragma omp target | |
| x++; | |
| #pragma omp target update from(x) | |
| assert(x == 1000); | |
| // CHECK: PASS | |
| printf("PASS\n"); | |
| return 0; | |
| } | |
| #endif |