mirror of git://gcc.gnu.org/git/gcc.git
75 lines
1.9 KiB
C
75 lines
1.9 KiB
C
int
|
|
main ()
|
|
{
|
|
int i, n;
|
|
int data[] = {1,2};
|
|
struct S { int **ptrset; };
|
|
|
|
// -----------------------------------
|
|
|
|
/* The produced mapping for sptr1->ptrset[i][:n]
|
|
|
|
GOMP_MAP_STRUCT (size = 1)
|
|
GOMP_MAP_ZERO_LEN_ARRAY_SECTION
|
|
GOMP_MAP_ZERO_LEN_ARRAY_SECTION
|
|
GOMP_MAP_ATTACH
|
|
GOMP_MAP_ATTACH -> attaching to 2nd GOMP_MAP_ZERO_LEN_ARRAY_SECTION
|
|
|
|
which get split into 3 separate map_vars call; in particular,
|
|
the latter is separate and points to an unmpapped variable.
|
|
|
|
Thus, it failed with:
|
|
libgomp: pointer target not mapped for attach */
|
|
|
|
struct S s1, *sptr1;
|
|
s1.ptrset = (int **) __builtin_malloc (sizeof(void*) * 3);
|
|
s1.ptrset[0] = data;
|
|
s1.ptrset[1] = data;
|
|
s1.ptrset[2] = data;
|
|
sptr1 = &s1;
|
|
|
|
i = 1;
|
|
n = 0;
|
|
#pragma omp target enter data map(sptr1[:1], sptr1->ptrset[:3])
|
|
#pragma omp target enter data map(sptr1->ptrset[i][:n])
|
|
|
|
#pragma omp target exit data map(sptr1->ptrset[i][:n])
|
|
#pragma omp target exit data map(sptr1[:1], sptr1->ptrset[:3])
|
|
|
|
__builtin_free (s1.ptrset);
|
|
|
|
// -----------------------------------
|
|
|
|
/* The produced mapping for sptr2->ptrset[i][:n] is similar:
|
|
|
|
GOMP_MAP_STRUCT (size = 1)
|
|
GOMP_MAP_ZERO_LEN_ARRAY_SECTION
|
|
GOMP_MAP_TO ! this one has now a finite size
|
|
GOMP_MAP_ATTACH
|
|
GOMP_MAP_ATTACH -> attach to the GOMP_MAP_TO
|
|
|
|
As the latter GOMP_MAP_ATTACH has now a pointer target,
|
|
the attachment worked. */
|
|
|
|
struct S s2, *sptr2;
|
|
s2.ptrset = (int **) __builtin_malloc (sizeof(void*) * 3);
|
|
s2.ptrset[0] = data;
|
|
s2.ptrset[1] = data;
|
|
s2.ptrset[2] = data;
|
|
sptr2 = &s2;
|
|
|
|
i = 1;
|
|
n = 2;
|
|
#pragma omp target enter data map(sptr2[:1], sptr2->ptrset[:3])
|
|
#pragma omp target enter data map(sptr2->ptrset[i][:n])
|
|
|
|
#pragma omp target
|
|
if (sptr2->ptrset[1][0] != 1 || sptr2->ptrset[1][1] != 2)
|
|
__builtin_abort ();
|
|
|
|
#pragma omp target exit data map(sptr2->ptrset[i][:n])
|
|
#pragma omp target exit data map(sptr2[:1], sptr2->ptrset[:3])
|
|
|
|
__builtin_free (s2.ptrset);
|
|
}
|