[gcc(refs/users/mikael/heads/refactor_descriptor_v08)] Extraction gfc_copy_descriptor
Mikael Morin
mikael@gcc.gnu.org
Mon Sep 8 20:31:17 GMT 2025
https://gcc.gnu.org/g:a79b1e796eb8b63b2d41f58d3032697cd7a7ee86
commit a79b1e796eb8b63b2d41f58d3032697cd7a7ee86
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Thu Jul 31 20:42:28 2025 +0200
Extraction gfc_copy_descriptor
Diff:
---
gcc/fortran/trans-descriptor.cc | 24 ++++++++++++++++++++++++
gcc/fortran/trans-descriptor.h | 1 +
gcc/fortran/trans-expr.cc | 23 +++--------------------
3 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 7fcd8a8bb207..66fa9d57b725 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1305,6 +1305,30 @@ gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src,
}
+void
+gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src, bool lhs_type)
+{
+ 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));
+
+ /* Assign the dimension as range-ref. */
+ tree tmp = gfc_get_descriptor_dimension (dest);
+ tree tmp2 = gfc_get_descriptor_dimension (src);
+
+ tree type = lhs_type ? TREE_TYPE (tmp) : TREE_TYPE (tmp2);
+ tmp = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp,
+ gfc_index_zero_node, NULL_TREE, NULL_TREE);
+ tmp2 = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp2,
+ gfc_index_zero_node, NULL_TREE, NULL_TREE);
+ gfc_add_modify (block, tmp, tmp2);
+}
+
+
void
gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src, tree ptr,
int rank, gfc_ss *ss)
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index ab4d1755132a..44f6d51dc6cd 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -110,6 +110,7 @@ void gfc_shift_descriptor (stmtblock_t *, tree, int, tree [GFC_MAX_DIMENSIONS],
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, gfc_ss *);
+void gfc_copy_descriptor (stmtblock_t *, tree, tree, bool);
void gfc_set_descriptor_from_scalar_class (stmtblock_t *, tree, tree, gfc_expr *);
void gfc_set_descriptor_from_scalar (stmtblock_t *, tree, tree, symbol_attribute,
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 9b8d10dc968f..72341a8b9ae9 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -760,32 +760,15 @@ gfc_get_vptr_from_expr (tree expr)
return NULL_TREE;
}
+
void
gfc_class_array_data_assign (stmtblock_t *block, tree lhs_desc, tree rhs_desc,
bool lhs_type)
{
- tree tmp, tmp2, type;
-
- gfc_conv_descriptor_data_set (block, lhs_desc,
- gfc_conv_descriptor_data_get (rhs_desc));
- gfc_conv_descriptor_offset_set (block, lhs_desc,
- gfc_conv_descriptor_offset_get (rhs_desc));
-
- gfc_conv_descriptor_dtype_set (block, lhs_desc,
- gfc_conv_descriptor_dtype_get (rhs_desc));
-
- /* Assign the dimension as range-ref. */
- tmp = gfc_get_descriptor_dimension (lhs_desc);
- tmp2 = gfc_get_descriptor_dimension (rhs_desc);
-
- type = lhs_type ? TREE_TYPE (tmp) : TREE_TYPE (tmp2);
- tmp = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp,
- gfc_index_zero_node, NULL_TREE, NULL_TREE);
- tmp2 = build4_loc (input_location, ARRAY_RANGE_REF, type, tmp2,
- gfc_index_zero_node, NULL_TREE, NULL_TREE);
- gfc_add_modify (block, tmp, tmp2);
+ gfc_copy_descriptor (block, lhs_desc, rhs_desc, lhs_type);
}
+
/* Takes a derived type expression and returns the address of a temporary
class object of the 'declared' type. If opt_vptr_src is not NULL, this is
used for the temporary class object.
More information about the Gcc-cvs
mailing list