https://gcc.gnu.org/g:8fab63e1ce20ea15bd99f805b7af003fab63f7fb

commit 8fab63e1ce20ea15bd99f805b7af003fab63f7fb
Author: Kwok Cheung Yeung <kcye...@baylibre.com>
Date:   Tue Mar 11 22:41:54 2025 +0000

    openmp, Fortran: Add support using iterators with custom mappers in Fortran
    
    gcc/fortran/
    
            * 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.
    
    libgomp/
    
            * 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.
    
    Co-authored-by: Andrew Stubbs <a...@baylibre.com>

Diff:
---
 gcc/fortran/ChangeLog.omp                          |  8 ++++
 gcc/fortran/openmp.cc                              |  9 ++--
 libgomp/ChangeLog.omp                              |  7 +++
 .../libgomp.fortran/mapper-iterators-1.f90         | 38 ++++++++++++++++
 .../libgomp.fortran/mapper-iterators-2.f90         | 49 ++++++++++++++++++++
 .../libgomp.fortran/mapper-iterators-3.f90         | 33 ++++++++++++++
 .../libgomp.fortran/mapper-iterators-4.f90         | 52 ++++++++++++++++++++++
 7 files changed, 193 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index d10c2f883cb6..1d05abede709 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,11 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@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  <kcye...@baylibre.com>
 
        * trans-openmp.cc (gfc_trans_omp_array_section): Use macros for
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 99029d63059d..348c1b820ffc 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -14026,6 +14026,7 @@ static gfc_omp_namelist **
 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
@@ -14141,14 +14142,15 @@ gfc_omp_instantiate_mapper (gfc_omp_namelist 
**outlistp,
        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
        {
@@ -14191,7 +14193,8 @@ gfc_omp_instantiate_mappers (gfc_code *code, 
gfc_omp_clauses *clauses,
              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;
        }
diff --git a/libgomp/ChangeLog.omp b/libgomp/ChangeLog.omp
index 3612f1a419be..e441b06073db 100644
--- a/libgomp/ChangeLog.omp
+++ b/libgomp/ChangeLog.omp
@@ -1,3 +1,10 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@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  <kcye...@baylibre.com>
 
        * testsuite/libgomp.c-c++-common/mapper-iterators-1.c: New test.
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90 
b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
new file mode 100644
index 000000000000..d0f2bc3217d2
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-1.f90
@@ -0,0 +1,38 @@
+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
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90 
b/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90
new file mode 100644
index 000000000000..a28f7cbac2ac
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-2.f90
@@ -0,0 +1,49 @@
+! { 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
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90 
b/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90
new file mode 100644
index 000000000000..c550e73d7b38
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-3.f90
@@ -0,0 +1,33 @@
+! { 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
diff --git a/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90 
b/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90
new file mode 100644
index 000000000000..21db835fc174
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/mapper-iterators-4.f90
@@ -0,0 +1,52 @@
+! { 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

Reply via email to