aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c-c++-common/target-link-3.c
blob: c707b38b7d46a8ef22499342e08cb7d9e251f7fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/* { dg-do run }  */

#include <stdint.h>
#include <omp.h>

#pragma omp requires unified_shared_memory

int A[3] = {-3,-4,-5};
static int q = -401;
#pragma omp declare target link(A, q)

#pragma omp begin declare target
void
f (uintptr_t *pA, uintptr_t *pq)
{
  if (A[0] != 1 || A[1] != 2 || A[2] != 3 || q != 42)
    __builtin_abort ();
  A[0] = 13;
  A[1] = 14;
  A[2] = 15;
  q = 23;
  *pA = (uintptr_t) &A[0];
  *pq = (uintptr_t) &q;
}
#pragma omp end declare target

int
main ()
{
  uintptr_t hpA = (uintptr_t) &A[0];
  uintptr_t hpq = (uintptr_t) &q;
  uintptr_t dpA, dpq;

  A[0] = 1;
  A[1] = 2;
  A[2] = 3;
  q = 42;

  for (int i = 0; i <= omp_get_num_devices (); ++i)
    {
      #pragma omp target device(device_num: i) map(dpA, dpq)
	f (&dpA, &dpq);
      if (hpA != dpA || hpq != dpq)
	__builtin_abort ();
      if (A[0] != 13 || A[1] != 14 || A[2] != 15 || q != 23)
	__builtin_abort ();
      A[0] = 1;
      A[1] = 2;
      A[2] = 3;
      q = 42;
    }
}