https://gcc.gnu.org/g:2afb6281a5a8711b82aa744e71c181bab6537e3c

commit 2afb6281a5a8711b82aa744e71c181bab6537e3c
Author: Kwok Cheung Yeung <kcye...@baylibre.com>
Date:   Thu Sep 12 21:30:34 2024 +0100

    openmp, fortran: Move udm field of gfc_omp_namelist into a new union
    
    This patch moves u2.udm into u3.udm.
    
    This is necessary to avoid clashes when mappers are used together with
    iterators, which uses u2.ns.
    
    gcc/fortran/
    
            * gfortran.h (struct gfc_omp_namelist): Move udm field into a new
            union u3.
            * match.cc (gfc_free_omp_namelist): Change references to u2.udm to
            u3.udm.
            * module.cc (load_omp_udms): Likewise.
            (write_omp_udm): Likewise.
            * openmp.cc (gfc_match_motion_var_list): Likewise.
            (gfc_match_omp_clauses): Likewise.
            (resolve_omp_clauses): Likewise.
            (gfc_omp_instantiate_mapper): Likewise.
            * trans-openmp.cc (gfc_trans_omp_clauses): Likewise.
            (gfc_find_nested_mappers): Likewise.

Diff:
---
 gcc/fortran/ChangeLog.omp   | 15 +++++++++++++++
 gcc/fortran/gfortran.h      |  5 ++++-
 gcc/fortran/match.cc        |  4 ++--
 gcc/fortran/module.cc       | 20 ++++++++++----------
 gcc/fortran/openmp.cc       | 32 ++++++++++++++++----------------
 gcc/fortran/trans-openmp.cc | 16 ++++++++--------
 6 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 969b2f306bc2..2b9d095cfa33 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,18 @@
+2025-04-17  Kwok Cheung Yeung  <kcye...@baylibre.com>
+
+       * gfortran.h (struct gfc_omp_namelist): Move udm field into a new
+       union u3.
+       * match.cc (gfc_free_omp_namelist): Change references to u2.udm to
+       u3.udm.
+       * module.cc (load_omp_udms): Likewise.
+       (write_omp_udm): Likewise.
+       * openmp.cc (gfc_match_motion_var_list): Likewise.
+       (gfc_match_omp_clauses): Likewise.
+       (resolve_omp_clauses): Likewise.
+       (gfc_omp_instantiate_mapper): Likewise.
+       * trans-openmp.cc (gfc_trans_omp_clauses): Likewise.
+       (gfc_find_nested_mappers): Likewise.
+
 2025-03-21  Paul-Antoine Arras  <par...@baylibre.com>
 
        Backported from master:
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 40711fcec52f..2cef5a1d913c 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -1410,13 +1410,16 @@ typedef struct gfc_omp_namelist
   union
     {
       struct gfc_omp_namelist_udr *udr;
-      struct gfc_omp_namelist_udm *udm;
       gfc_namespace *ns;
       gfc_expr *allocator;
       struct gfc_symbol *traits_sym;
       struct gfc_omp_namelist *duplicate_of;
       char *init_interop;
     } u2;
+  union
+    {
+      struct gfc_omp_namelist_udm *udm;
+    } u3;
   struct gfc_omp_namelist *next;
   locus where;
 }
diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc
index 0f01e28dc692..02f6468b6b7f 100644
--- a/gcc/fortran/match.cc
+++ b/gcc/fortran/match.cc
@@ -5578,8 +5578,8 @@ gfc_free_omp_namelist (gfc_omp_namelist *name, int list)
              free (name->u2.init_interop);
            }
        }
-      else if (free_mapper && name->u2.udm)
-       free (name->u2.udm);
+      else if (free_mapper && name->u3.udm)
+       free (name->u3.udm);
       else if (!free_mapper && name->u2.udr)
        {
          if (name->u2.udr->combiner)
diff --git a/gcc/fortran/module.cc b/gcc/fortran/module.cc
index e5c14d76f9c3..32e17c92a0ef 100644
--- a/gcc/fortran/module.cc
+++ b/gcc/fortran/module.cc
@@ -5548,14 +5548,14 @@ load_omp_udms (void)
 
          if (peek_atom () != ATOM_RPAREN)
            {
-             n->u2.udm = gfc_get_omp_namelist_udm ();
-             mio_pool_string (&n->u2.udm->mapper_id);
+             n->u3.udm = gfc_get_omp_namelist_udm ();
+             mio_pool_string (&n->u3.udm->mapper_id);
 
-             if (n->u2.udm->mapper_id == NULL)
-               n->u2.udm->mapper_id = gfc_get_string ("%s", "");
+             if (n->u3.udm->mapper_id == NULL)
+               n->u3.udm->mapper_id = gfc_get_string ("%s", "");
 
-             n->u2.udm->multiple_elems_p = mio_name (0, omp_map_cardinality);
-             mio_pointer_ref (&n->u2.udm->udm);
+             n->u3.udm->multiple_elems_p = mio_name (0, omp_map_cardinality);
+             mio_pointer_ref (&n->u3.udm->udm);
            }
 
          mio_rparen ();
@@ -6628,11 +6628,11 @@ write_omp_udm (gfc_omp_udm *udm)
 
       mio_lparen ();
 
-      if (n->u2.udm)
+      if (n->u3.udm)
        {
-         mio_pool_string (&n->u2.udm->mapper_id);
-         mio_name (n->u2.udm->multiple_elems_p, omp_map_cardinality);
-         mio_pointer_ref (&n->u2.udm->udm);
+         mio_pool_string (&n->u3.udm->mapper_id);
+         mio_name (n->u3.udm->multiple_elems_p, omp_map_cardinality);
+         mio_pointer_ref (&n->u3.udm->udm);
        }
 
       mio_rparen ();
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 7fe89b5da237..1e274ddf9f25 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -1474,8 +1474,8 @@ gfc_match_motion_var_list (const char *str, 
gfc_omp_namelist **list,
 
       if (mapper_id[0] != '\0')
        {
-         n->u2.udm = gfc_get_omp_namelist_udm ();
-         n->u2.udm->mapper_id = gfc_get_string ("%s", mapper_id);
+         n->u3.udm = gfc_get_omp_namelist_udm ();
+         n->u3.udm->mapper_id = gfc_get_string ("%s", mapper_id);
        }
     }
   return MATCH_YES;
@@ -3770,8 +3770,8 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
                      n->u.map.op = map_op;
                      if (mapper_id[0] != '\0')
                        {
-                         n->u2.udm = gfc_get_omp_namelist_udm ();
-                         n->u2.udm->mapper_id
+                         n->u3.udm = gfc_get_omp_namelist_udm ();
+                         n->u3.udm->mapper_id
                            = gfc_get_string ("%s", mapper_id);
                        }
                    }
@@ -10189,7 +10189,7 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses 
*omp_clauses,
                      ts = &n->sym->ts;
 
                    const char *mapper_id
-                     = n->u2.udm ? n->u2.udm->mapper_id : "";
+                     = n->u3.udm ? n->u3.udm->mapper_id : "";
 
                    gfc_omp_udm *udm = gfc_find_omp_udm (gfc_current_ns,
                                                         mapper_id, ts);
@@ -10198,13 +10198,13 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses 
*omp_clauses,
                                 mapper_id, &n->where);
                    else if (udm)
                      {
-                       if (!n->u2.udm)
+                       if (!n->u3.udm)
                          {
-                           n->u2.udm = gfc_get_omp_namelist_udm ();
+                           n->u3.udm = gfc_get_omp_namelist_udm ();
                            gcc_assert (mapper_id[0] == '\0');
-                           n->u2.udm->mapper_id = mapper_id;
+                           n->u3.udm->mapper_id = mapper_id;
                          }
-                       n->u2.udm->udm = udm;
+                       n->u3.udm->udm = udm;
                      }
                  }
              }
@@ -14013,9 +14013,9 @@ gfc_omp_instantiate_mapper (gfc_omp_namelist **outlistp,
          else
            multiple_elems_p = true;
 
-         if (multiple_elems_p && clause->u2.udm)
+         if (multiple_elems_p && clause->u3.udm)
            {
-             clause->u2.udm->multiple_elems_p = true;
+             clause->u3.udm->multiple_elems_p = true;
              *outlistp = clause;
              return &(*outlistp)->next;
            }
@@ -14095,10 +14095,10 @@ gfc_omp_instantiate_mapper (gfc_omp_namelist 
**outlistp,
 
       new_clause->where = clause->where;
 
-      if (mapper_clause->u2.udm
-         && mapper_clause->u2.udm->udm != udm)
+      if (mapper_clause->u3.udm
+         && mapper_clause->u3.udm->udm != udm)
        {
-         gfc_omp_udm *inner_udm = mapper_clause->u2.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);
@@ -14123,7 +14123,7 @@ gfc_omp_instantiate_mappers (gfc_code *code, 
gfc_omp_clauses *clauses,
 
   for (; clause; clause = *clausep)
     {
-      if (clause->u2.udm)
+      if (clause->u3.udm)
        {
          gfc_omp_map_op outer_map_op;
 
@@ -14144,7 +14144,7 @@ gfc_omp_instantiate_mappers (gfc_code *code, 
gfc_omp_clauses *clauses,
              gcc_unreachable ();
            }
          clausep = gfc_omp_instantiate_mapper (clausep, clause, outer_map_op,
-                                               clause->u2.udm->udm, cd, list);
+                                               clause->u3.udm->udm, cd, list);
          *clausep = clause->next;
          invoked_mappers = true;
        }
diff --git a/gcc/fortran/trans-openmp.cc b/gcc/fortran/trans-openmp.cc
index 534e5b769eae..7c76360a56e4 100644
--- a/gcc/fortran/trans-openmp.cc
+++ b/gcc/fortran/trans-openmp.cc
@@ -6211,7 +6211,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, 
gfc_omp_clauses *clauses,
                              if (drop_mapping)
                                continue;
 
-                             if (n->u2.udm && n->u2.udm->multiple_elems_p)
+                             if (n->u3.udm && n->u3.udm->multiple_elems_p)
                                {
                                  gfc_error ("cannot map non-unit size array "
                                             "with mapper at %C");
@@ -6219,7 +6219,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, 
gfc_omp_clauses *clauses,
                                  goto finalize_map_clause;
                                }
 
-                             if (n->u2.udm && n->u2.udm->multiple_elems_p)
+                             if (n->u3.udm && n->u3.udm->multiple_elems_p)
                                {
                                  gfc_error ("cannot map non-unit size array "
                                             "with mapper at %C");
@@ -6303,15 +6303,15 @@ gfc_trans_omp_clauses (stmtblock_t *block, 
gfc_omp_clauses *clauses,
                  else
                    container = cl;
 
-                 if (n->u2.udm
-                     && n->u2.udm->udm->mapper_id
-                     && n->u2.udm->udm->mapper_id[0] != '\0')
+                 if (n->u3.udm
+                     && n->u3.udm->udm->mapper_id
+                     && n->u3.udm->udm->mapper_id[0] != '\0')
                    {
                      tree push = build_omp_clause (input_location,
                                                    OMP_CLAUSE_MAP);
                      OMP_CLAUSE_SET_MAP_KIND (push, GOMP_MAP_PUSH_MAPPER_NAME);
                      OMP_CLAUSE_DECL (push)
-                       = get_identifier (n->u2.udm->udm->mapper_id);
+                       = get_identifier (n->u3.udm->udm->mapper_id);
                      tree pop = build_omp_clause (input_location,
                                                   OMP_CLAUSE_MAP);
                      OMP_CLAUSE_SET_MAP_KIND (pop, GOMP_MAP_POP_MAPPER_NAME);
@@ -10411,9 +10411,9 @@ gfc_find_nested_mappers (omp_mapper_list<gfc_typespec 
*> *mlist,
 
   for (; ns; ns = ns->next)
     {
-      if (ns->u2.udm && ns->u2.udm->udm != udm)
+      if (ns->u3.udm && ns->u3.udm->udm != udm)
        {
-         gfc_omp_udm *nested_udm = ns->u2.udm->udm;
+         gfc_omp_udm *nested_udm = ns->u3.udm->udm;
          tree mapper_id
            = (nested_udm->mapper_id ? get_identifier (nested_udm->mapper_id)
                                     : NULL_TREE);

Reply via email to