https://gcc.gnu.org/g:12341d4f4a89cf2ebe3f73037b83d33f75baff11
commit 12341d4f4a89cf2ebe3f73037b83d33f75baff11 Author: Kwok Cheung Yeung <kcye...@baylibre.com> Date: Sat May 3 20:30:16 2025 +0000 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/gfortran.h | 5 ++++- gcc/fortran/match.cc | 4 ++-- gcc/fortran/module.cc | 20 ++++++++++---------- gcc/fortran/openmp.cc | 32 ++++++++++++++++---------------- gcc/fortran/trans-openmp.cc | 14 +++++++------- 5 files changed, 39 insertions(+), 36 deletions(-) diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 67cf255fbd93..c9cf0726964e 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1437,13 +1437,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 d1648fdf913c..269e152daa45 100644 --- a/gcc/fortran/match.cc +++ b/gcc/fortran/match.cc @@ -5920,8 +5920,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 bf43ed59eb47..1389dee95a0f 100644 --- a/gcc/fortran/module.cc +++ b/gcc/fortran/module.cc @@ -5561,14 +5561,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 (); @@ -6641,11 +6641,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 563ba57636fe..a6581721096b 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -1484,8 +1484,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; @@ -3780,8 +3780,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); } } @@ -10234,7 +10234,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); @@ -10243,13 +10243,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; } } } @@ -14097,9 +14097,9 @@ gfc_omp_instantiate_mapper (gfc_code *code, 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; } @@ -14181,10 +14181,10 @@ gfc_omp_instantiate_mapper (gfc_code *code, 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 (code, outlistp, new_clause, outer_map_op, inner_udm, cd, list); @@ -14214,7 +14214,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; @@ -14236,7 +14236,7 @@ gfc_omp_instantiate_mappers (gfc_code *code, gfc_omp_clauses *clauses, } clausep = gfc_omp_instantiate_mapper (code, 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 cec014757dd9..3678f79612f3 100644 --- a/gcc/fortran/trans-openmp.cc +++ b/gcc/fortran/trans-openmp.cc @@ -5579,7 +5579,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 " @@ -5663,15 +5663,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); @@ -9772,9 +9772,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);