https://gcc.gnu.org/g:977c4f276493f2b6e7b9615790399a285807ce38
commit 977c4f276493f2b6e7b9615790399a285807ce38 Author: Mikael Morin <[email protected]> Date: Wed Oct 29 19:34:43 2025 +0100 fortran: array descriptor: Move array growth function Regression tested on powerpc64le-unknown-linux-gnu. OK for master? -- >8 -- Move gfc_grow_array, a descriptor growth function used in array constructor descriptors initialisation, to trans-descriptor.cc. gcc/fortran/ChangeLog: * trans-array.cc (gfc_grow_array): Move function ... * trans-descriptor.cc (gfc_grow_array): ... to this file. * trans-descriptor.h (gfc_grow_array): Add declaration. Diff: --- gcc/fortran/trans-array.cc | 37 ------------------------------------- gcc/fortran/trans-descriptor.cc | 37 +++++++++++++++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 2 ++ 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 383a92df7d35..dbb95c9b7a05 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -1409,43 +1409,6 @@ gfc_get_iteration_count (tree start, tree end, tree step) } -/* Extend the data in array DESC by EXTRA elements. */ - -static void -gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra) -{ - tree arg0, arg1; - tree tmp; - tree size; - tree ubound; - - if (integer_zerop (extra)) - return; - - ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[0]); - - /* Add EXTRA to the upper bound. */ - tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, - ubound, extra); - gfc_conv_descriptor_ubound_set (pblock, desc, gfc_rank_cst[0], tmp); - - /* Get the value of the current data pointer. */ - arg0 = gfc_conv_descriptor_data_get (desc); - - /* Calculate the new array size. */ - size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc))); - tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, - ubound, gfc_index_one_node); - arg1 = fold_build2_loc (input_location, MULT_EXPR, size_type_node, - fold_convert (size_type_node, tmp), - fold_convert (size_type_node, size)); - - /* Call the realloc() function. */ - tmp = gfc_call_realloc (pblock, arg0, arg1); - gfc_conv_descriptor_data_set (pblock, desc, tmp); -} - - /* Return true if the bounds of iterator I can only be determined at run time. */ diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 299d56c728a3..386f62759824 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -541,3 +541,40 @@ gfc_copy_descriptor (stmtblock_t *block, tree dst, tree src, int rank) gfc_conv_descriptor_offset_set (block, dst, offset); } + + +/* Extend the data in array DESC by EXTRA elements. */ + +void +gfc_grow_array (stmtblock_t * pblock, tree desc, tree extra) +{ + tree arg0, arg1; + tree tmp; + tree size; + tree ubound; + + if (integer_zerop (extra)) + return; + + ubound = gfc_conv_descriptor_ubound_get (desc, gfc_rank_cst[0]); + + /* Add EXTRA to the upper bound. */ + tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, + ubound, extra); + gfc_conv_descriptor_ubound_set (pblock, desc, gfc_rank_cst[0], tmp); + + /* Get the value of the current data pointer. */ + arg0 = gfc_conv_descriptor_data_get (desc); + + /* Calculate the new array size. */ + size = TYPE_SIZE_UNIT (gfc_get_element_type (TREE_TYPE (desc))); + tmp = fold_build2_loc (input_location, PLUS_EXPR, gfc_array_index_type, + ubound, gfc_index_one_node); + arg1 = fold_build2_loc (input_location, MULT_EXPR, size_type_node, + fold_convert (size_type_node, tmp), + fold_convert (size_type_node, size)); + + /* Call the realloc() function. */ + tmp = gfc_call_realloc (pblock, arg0, arg1); + gfc_conv_descriptor_data_set (pblock, desc, tmp); +} diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index b1623a218033..816973825b65 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -62,4 +62,6 @@ void gfc_conv_shift_descriptor_lbound (stmtblock_t*, tree, int, tree); void gfc_copy_descriptor (stmtblock_t *, tree, tree, int); +void gfc_grow_array (stmtblock_t *, tree, tree); + #endif /* GFC_TRANS_DESCRIPTOR_H */
