[PATCH 1/3] fortran: array descriptor: Move dtype constructor generation [PR122521]
Mikael Morin <[email protected]> Tue, 28 Jul 2026 17:20:10 +0200
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
From: Mikael Morin <[email protected]> Fortran-tested on aarch64-unknown-linux-gnu. OK for mainline? -- >8 -- The final sequence of trans-types.cc's `gfc_get_dtype_rank_type' generates a constructor for an array descriptor dtype. Move that sequence to a dedicated function in trans-descriptor.cc to avoid leaking the content and layout of the dtypes out of that file. PR fortran/122521 gcc/fortran/ChangeLog: * trans-types.cc (gfc_get_dtype_rank_type): Move constructor generation ... * trans-descriptor.cc (gfc_build_dtype_constructor): ... here as a new function. * trans-descriptor.h (gfc_build_dtype_constructor): New declaration. --- gcc/fortran/trans-descriptor.cc | 38 +++++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 2 ++ gcc/fortran/trans-types.cc | 33 +--------------------------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 6156f4e2db1..e4ff96fff67 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -624,6 +624,44 @@ gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, /* Array descriptor higher level routines. ******************************************************************************/ +/* Return a constructor for a descriptor dtype with the caracteristics given by + the arguments. */ + +tree +gfc_build_dtype_constructor (tree size, int type, int rank) +{ + tree field; + vec<constructor_elt, va_gc> *v = NULL; + + gcc_assert (size); + + STRIP_NOPS (size); + size = fold_convert (size_type_node, size); + tree dtype_type_node = get_dtype_type_node (); + field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), + GFC_DTYPE_ELEM_LEN); + CONSTRUCTOR_APPEND_ELT (v, field, + fold_convert (TREE_TYPE (field), size)); + field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), + GFC_DTYPE_VERSION); + CONSTRUCTOR_APPEND_ELT (v, field, + build_zero_cst (TREE_TYPE (field))); + + field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), + GFC_DTYPE_RANK); + if (rank >= 0) + CONSTRUCTOR_APPEND_ELT (v, field, + build_int_cst (TREE_TYPE (field), rank)); + + field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), + GFC_DTYPE_TYPE); + CONSTRUCTOR_APPEND_ELT (v, field, + build_int_cst (TREE_TYPE (field), type)); + + return build_constructor (dtype_type_node, v); +} + + /* Build a null array descriptor constructor. */ tree diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 081bb45ef07..7a206e2a4b2 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -53,6 +53,8 @@ void gfc_conv_descriptor_lbound_set (stmtblock_t *, tree, tree, tree); void gfc_conv_descriptor_ubound_set (stmtblock_t *, tree, tree, tree); void gfc_conv_descriptor_token_set (stmtblock_t *block, tree desc, tree value); +tree gfc_build_dtype_constructor (tree, int, int); + /* Build expressions for accessing components of an array descriptor. */ void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *, tree *, tree *, tree *, diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index ea4395c67dd..4cc63c4f64d 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -1709,10 +1709,6 @@ gfc_get_dtype_rank_type (int rank, tree etype) tree ptype; tree size; int n; - tree tmp; - tree dtype; - tree field; - vec<constructor_elt, va_gc> *v = NULL; ptype = etype; while (TREE_CODE (etype) == POINTER_TYPE @@ -1784,34 +1780,7 @@ gfc_get_dtype_rank_type (int rank, tree etype) break; } - gcc_assert (size); - - STRIP_NOPS (size); - size = fold_convert (size_type_node, size); - tmp = get_dtype_type_node (); - field = gfc_advance_chain (TYPE_FIELDS (tmp), - GFC_DTYPE_ELEM_LEN); - CONSTRUCTOR_APPEND_ELT (v, field, - fold_convert (TREE_TYPE (field), size)); - field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), - GFC_DTYPE_VERSION); - CONSTRUCTOR_APPEND_ELT (v, field, - build_zero_cst (TREE_TYPE (field))); - - field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), - GFC_DTYPE_RANK); - if (rank >= 0) - CONSTRUCTOR_APPEND_ELT (v, field, - build_int_cst (TREE_TYPE (field), rank)); - - field = gfc_advance_chain (TYPE_FIELDS (dtype_type_node), - GFC_DTYPE_TYPE); - CONSTRUCTOR_APPEND_ELT (v, field, - build_int_cst (TREE_TYPE (field), n)); - - dtype = build_constructor (tmp, v); - - return dtype; + return gfc_build_dtype_constructor (size, n, rank); } -- 2.53.0