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