+2025-04-17 Kwok Cheung Yeung <kcyeung@baylibre.com>
+
+ * openmp.cc (gfc_omp_instantiate_mapper): Add argument for namespace.
+ Apply namespace to new clauses. Propagate namespace to nested
+ mappers.
+ (gfc_omp_instantiate_mappers): Pass namespace of clause to clauses
+ generated by mappers.
+
2025-04-17 Kwok Cheung Yeung <kcyeung@baylibre.com>
* trans-openmp.cc (gfc_trans_omp_array_section): Use macros for
gfc_omp_instantiate_mapper (gfc_omp_namelist **outlistp,
gfc_omp_namelist *clause,
gfc_omp_map_op outer_map_op, gfc_omp_udm *udm,
+ gfc_namespace *ns,
toc_directive cd, int list)
{
/* Here "sym" and "expr" describe the clause as written, to be substituted
new_clause->u.map.op = new_kind;
new_clause->where = clause->where;
+ new_clause->u2.ns = ns;
if (mapper_clause->u3.udm
&& mapper_clause->u3.udm->udm != udm)
{
gfc_omp_udm *inner_udm = mapper_clause->u3.udm->udm;
outlistp = gfc_omp_instantiate_mapper (outlistp, new_clause,
- outer_map_op, inner_udm, cd,
- list);
+ outer_map_op, inner_udm, ns,
+ cd, list);
}
else
{
gcc_unreachable ();
}
clausep = gfc_omp_instantiate_mapper (clausep, clause, outer_map_op,
- clause->u3.udm->udm, cd, list);
+ clause->u3.udm->udm,
+ clause->u2.ns, cd, list);
*clausep = clause->next;
invoked_mappers = true;
}
+2025-04-17 Kwok Cheung Yeung <kcyeung@baylibre.com>
+
+ * testsuite/libgomp.fortran/mapper-iterators-1.f90: New test.
+ * testsuite/libgomp.fortran/mapper-iterators-2.f90: New test.
+ * testsuite/libgomp.fortran/mapper-iterators-3.f90: New test.
+ * testsuite/libgomp.fortran/mapper-iterators-4.f90: New test.
+
2025-04-17 Kwok Cheung Yeung <kcyeung@baylibre.com>
* testsuite/libgomp.c-c++-common/mapper-iterators-1.c: New test.
--- /dev/null
+program myprog
+ type t
+ integer :: size
+ integer :: arr(99)
+ end type t
+
+ type u
+ type(t) :: myt
+ end type u
+
+ integer :: i, j
+ integer, parameter :: N = 10
+ type(u) :: x(N)
+
+ !$omp declare mapper (t :: x) map(tofrom: x%size, x%arr(1:x%size))
+ !$omp declare mapper (u :: x) map(tofrom: x%myt)
+
+ do i = 1, N
+ x(i)%myt%size = 99
+ do j = 1, 99
+ x(i)%myt%arr(j) = i*j
+ end do
+ end do
+
+ !$omp target map(iterator(i=1:N), tofrom: x(i))
+ do i = 1, N
+ do j = 1, 99
+ x(i)%myt%arr(j) = x(i)%myt%arr(j) + 1
+ end do
+ end do
+ !$omp end target
+
+ do i = 1, N
+ do j = 1, 99
+ if (x(i)%myt%arr(j) /= i*j + 1) stop 1
+ end do
+ end do
+end program myprog
--- /dev/null
+! { dg-do run }
+
+program myprog
+type t
+ integer, dimension (8) :: arr1
+end type t
+type u
+ type(t) :: t_elem
+end type u
+
+integer :: i
+integer, parameter :: N = 10
+type(u) :: myu(N)
+
+!$omp declare mapper (t :: x) map(x%arr1(5:8))
+!$omp declare mapper (tmapper: t :: x) map(x%arr1(1:4))
+!$omp declare mapper (u :: x) map(mapper(tmapper), tofrom: x%t_elem)
+
+do i = 1, N
+ myu(i)%t_elem%arr1(1) = 1
+ myu(i)%t_elem%arr1(5) = 1
+end do
+
+! Different ways of invoking nested mappers, named vs. unnamed
+
+!$omp target map(iterator (n=1:N) tofrom:myu(n)%t_elem)
+do i = 1, N
+ myu(i)%t_elem%arr1(5) = myu(i)%t_elem%arr1(5) + 1
+end do
+!$omp end target
+
+!$omp target map(iterator (n=1:N) tofrom:myu(n))
+do i = 1, N
+ myu(i)%t_elem%arr1(1) = myu(i)%t_elem%arr1(1) + 1
+end do
+!$omp end target
+
+!$omp target
+do i = 1, N
+ myu(i)%t_elem%arr1(1) = myu(i)%t_elem%arr1(1) + 1
+end do
+!$omp end target
+
+do i = 1, N
+ if (myu(i)%t_elem%arr1(1).ne.3) stop 1
+ if (myu(i)%t_elem%arr1(5).ne.2) stop 2
+end do
+
+end program myprog
--- /dev/null
+! { dg-do run }
+
+program myprog
+
+type A
+character(len=20) :: string1
+character(len=:), pointer :: string2
+end type A
+
+integer, parameter :: N = 8
+integer :: i
+
+!$omp declare mapper (A :: x) map(to:x%string1) map(from:x%string2)
+
+type(A) :: var(N)
+
+do i = 1, N
+ allocate(character(len=20) :: var(i)%string2)
+
+ var(i)%string1 = "hello world"
+end do
+
+!$omp target map(iterator (n=1:N) to:var(n)%string1) map(iterator (n=1:N) from:var(n)%string2)
+do i = 1, N
+ var(i)%string2 = var(i)%string1
+end do
+!$omp end target
+
+do i = 1, N
+ if (var(i)%string2.ne."hello world") stop 1
+end do
+
+end program myprog
--- /dev/null
+! { dg-do run }
+
+module mymod
+type F
+integer :: a, b, c
+integer, dimension(10) :: d
+end type F
+
+type G
+integer :: x, y
+type(F), pointer :: myf
+integer :: z
+end type G
+
+! Check that nested mappers work inside modules.
+
+!$omp declare mapper (F :: f) map(to: f%b) map(f%d)
+!$omp declare mapper (G :: g) map(tofrom: g%myf)
+
+end module mymod
+
+program myprog
+use mymod
+
+integer, parameter :: N = 8
+integer :: i
+
+type(F), target :: ftmp(N)
+type(G) :: gvar(N)
+
+do i = 1, N
+ gvar(i)%myf => ftmp(i)
+ gvar(i)%myf%d = 0
+end do
+
+!$omp target map(iterator (n=1:N) tofrom: gvar(n)%myf)
+do i = 1, N
+ gvar(i)%myf%d(1) = gvar(i)%myf%d(1) + 1
+end do
+!$omp end target
+
+!$omp target map(iterator (n=1:N) tofrom: gvar(n))
+do i = 1, N
+ gvar(i)%myf%d(1) = gvar(i)%myf%d(1) + 1
+end do
+!$omp end target
+
+do i = 1, N
+ if (gvar(i)%myf%d(1).ne.2) stop 1
+end do
+
+end program myprog