[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Extraction gfc_copy_assumed_rank_descriptor
Mikael Morin via Gcc-cvs <[email protected]>
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:af1af2456e8fff63e1b8b7bdf72b37c7a0b831c6 commit af1af2456e8fff63e1b8b7bdf72b37c7a0b831c6 Author: Mikael Morin <[email protected]> Date: Sun Jun 21 10:41:22 2026 +0200 Extraction gfc_copy_assumed_rank_descriptor Correction compil' Diff: --- gcc/fortran/trans-array.cc | 20 +------------------- gcc/fortran/trans-descriptor.cc | 24 ++++++++++++++++++++++++ gcc/fortran/trans-descriptor.h | 1 + gcc/fortran/trans-expr.cc | 26 ++------------------------ 4 files changed, 28 insertions(+), 43 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 9f19f93a2c52..6ec51b3ef9e7 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -8380,25 +8380,7 @@ is_pointer (gfc_expr *e) void gfc_resize_assumed_rank_dim_field (gfc_se *se, stmtblock_t *block, tree desc) { - tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr; - - gfc_conv_descriptor_data_set (block, desc, - gfc_conv_descriptor_data_get (se->expr)); - gfc_conv_descriptor_offset_set (block, desc, - gfc_conv_descriptor_offset_get (se->expr)); - gfc_conv_descriptor_dtype_set (block, desc, - gfc_conv_descriptor_dtype_get (se->expr)); - rank = fold_convert (size_type_node, gfc_conv_descriptor_rank_get (se->expr)); - dim_field = gfc_get_descriptor_dimension (se->expr); - dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field))); - copy_size = fold_build2_loc (input_location, MULT_EXPR, - size_type_node, rank, dim_size); - dst_ptr = gfc_build_addr_expr (pvoid_type_node, - gfc_get_descriptor_dimension (desc)); - src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field); - gfc_add_expr_to_block (block, build_call_expr_loc (input_location, - builtin_decl_explicit (BUILT_IN_MEMCPY), - 3, dst_ptr, src_ptr, copy_size)); + gfc_copy_assumed_rank_descriptor (block, desc, se->expr); } /* Convert an array for passing as an actual parameter. */ diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index e66637de70b8..562aa5c72d34 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -1620,6 +1620,30 @@ gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src, tree ptr, gfc_conv_descriptor_data_set (block, dest, ptr); } +void +gfc_copy_assumed_rank_descriptor (stmtblock_t *block, tree dest, tree src) +{ + tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr; + + gfc_conv_descriptor_data_set (block, dest, + gfc_conv_descriptor_data_get (src)); + gfc_conv_descriptor_offset_set (block, dest, + gfc_conv_descriptor_offset_get (src)); + gfc_conv_descriptor_dtype_set (block, dest, + gfc_conv_descriptor_dtype_get (src)); + rank = fold_convert (size_type_node, gfc_conv_descriptor_rank_get (src)); + dim_field = gfc_get_descriptor_dimension (src); + dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field))); + copy_size = fold_build2_loc (input_location, MULT_EXPR, + size_type_node, rank, dim_size); + dst_ptr = gfc_build_addr_expr (pvoid_type_node, + gfc_get_descriptor_dimension (dest)); + src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field); + gfc_add_expr_to_block (block, build_call_expr_loc (input_location, + builtin_decl_explicit (BUILT_IN_MEMCPY), + 3, dst_ptr, src_ptr, copy_size)); +} + void gfc_conv_remap_descriptor (stmtblock_t *block, tree dest, int dest_rank, diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 947902e83a84..ad385cc645e2 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -90,6 +90,7 @@ void gfc_copy_sequence_descriptor (stmtblock_t *, tree, tree, int); void gfc_copy_descriptor (stmtblock_t *, tree, tree, gfc_expr *, bool); void gfc_copy_descriptor (stmtblock_t *, tree, tree, tree, int); void gfc_copy_descriptor (stmtblock_t *, tree, tree, bool); +void gfc_copy_assumed_rank_descriptor (stmtblock_t *, tree, tree); void gfc_conv_remap_descriptor (stmtblock_t *, tree, int, tree, gfc_typespec *, bool, gfc_array_ref *, bool); diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index bdcf97a82d3c..624d7d5d286e 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -926,30 +926,8 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, gfc_symbol *fsym, dtype.rank dims; a full struct assign reads past the end. Copy field-by-field with a runtime-sized dim[] memcpy. PR fortran/60576. */ - tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr; - - gfc_conv_descriptor_data_set - (&block, *derived_array, - gfc_conv_descriptor_data_get (parmse->expr)); - gfc_conv_descriptor_offset_set - (&block, *derived_array, - gfc_conv_descriptor_offset_get (parmse->expr)); - tree dtype_val = gfc_conv_descriptor_dtype_get (parmse->expr); - gfc_conv_descriptor_dtype_set (&block, *derived_array, - dtype_val); - rank = gfc_conv_descriptor_rank_get (parmse->expr); - rank = fold_convert (size_type_node, rank); - dim_field = gfc_get_descriptor_dimension (parmse->expr); - dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field))); - copy_size = fold_build2_loc (input_location, MULT_EXPR, - size_type_node, rank, dim_size); - dst_ptr = gfc_build_addr_expr - (pvoid_type_node, gfc_get_descriptor_dimension (*derived_array)); - src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field); - gfc_add_expr_to_block (&block, - build_call_expr_loc (input_location, - builtin_decl_explicit (BUILT_IN_MEMCPY), - 3, dst_ptr, src_ptr, copy_size)); + gfc_copy_assumed_rank_descriptor (&block , *derived_array, + parmse->expr); } else gfc_add_modify (&block, *derived_array, parmse->expr);