+2020-03-31 Tobias Burnus <tobias@codesourcery.com>
+
+ * target.c (GOMP_target_enter_exit_data): Handle PSET/MAP_POINTER.
+ * testsuite/libgomp.fortran/target-enter-data-1.f90: New.
+
2020-03-24 Tobias Burnus <tobias@codesourcery.com>
PR libgomp/81689
}
}
- size_t i;
+ /* The variables are mapped separately such that they can be released
+ independently. */
+ size_t i, j;
if ((flags & GOMP_TARGET_FLAG_EXIT_DATA) == 0)
for (i = 0; i < mapnum; i++)
if ((kinds[i] & 0xff) == GOMP_MAP_STRUCT)
&kinds[i], true, GOMP_MAP_VARS_ENTER_DATA);
i += sizes[i];
}
+ else if ((kinds[i] & 0xff) == GOMP_MAP_TO_PSET)
+ {
+ for (j = i + 1; j < mapnum; j++)
+ if (!GOMP_MAP_POINTER_P (get_kind (true, kinds, j) & 0xff))
+ break;
+ gomp_map_vars (devicep, j-i, &hostaddrs[i], NULL, &sizes[i],
+ &kinds[i], true, GOMP_MAP_VARS_ENTER_DATA);
+ i += j - i - 1;
+ }
else
gomp_map_vars (devicep, 1, &hostaddrs[i], NULL, &sizes[i], &kinds[i],
true, GOMP_MAP_VARS_ENTER_DATA);
--- /dev/null
+program main
+ implicit none
+ integer, allocatable, dimension(:) :: AA, BB, CC, DD
+ integer :: i, N = 20
+
+ allocate(BB(N))
+ AA = [(i, i=1,N)]
+
+ !$omp target enter data map(alloc: BB)
+ !$omp target enter data map(to: AA)
+
+ !$omp target
+ BB = 3 * AA
+ !$omp end target
+
+ !$omp target exit data map(delete: AA)
+ !$omp target exit data map(from: BB)
+
+ if (any (BB /= [(3*i, i=1,N)])) stop 1
+ if (any (AA /= [(i, i=1,N)])) stop 2
+
+
+ CC = 31 * BB
+ DD = [(-i, i=1,N)]
+
+ !$omp target enter data map(to: CC) map(alloc: DD)
+
+ !$omp target
+ DD = 5 * CC
+ !$omp end target
+
+ !$omp target exit data map(delete: CC) map(from: DD)
+
+ if (any (CC /= [(31*3*i, i=1,N)])) stop 3
+ if (any (DD /= [(31*3*5*i, i=1,N)])) stop 4
+end