| 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); |
| } |