[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Refactoring gfc_nullify_descriptor/gfc_init_descriptor_variable
Mikael Morin via Gcc-cvs <[email protected]>
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:81156d7584a418430eefb40d01b45860f7f1f5b6 commit 81156d7584a418430eefb40d01b45860f7f1f5b6 Author: Mikael Morin <[email protected]> Date: Fri Jul 24 13:01:02 2026 +0200 Refactoring gfc_nullify_descriptor/gfc_init_descriptor_variable Diff: --- gcc/fortran/trans-descriptor.cc | 14 +++++++++++--- gcc/fortran/trans-expr.cc | 11 +++++++++-- gcc/fortran/trans-types.cc | 11 +++++++++-- gcc/fortran/trans-types.h | 1 + gcc/fortran/trans.h | 1 + 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index a703efdeab3d..3b2ffd91b1d0 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -908,7 +908,8 @@ gfc_init_static_descriptor (tree descr) void -gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr, tree descr) +gfc_nullify_descriptor (stmtblock_t *block, gfc_symbol *sym, gfc_expr *expr, + tree descr, tree string_length) { symbol_attribute attr = gfc_symbol_attr (sym); @@ -940,8 +941,15 @@ gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, gfc_expr *exp rank = -1; tree etype = gfc_get_element_type (TREE_TYPE (descr)); - gfc_conv_descriptor_dtype_set (block, descr, - gfc_get_dtype_rank_type (rank, etype)); + tree dtype = gfc_get_dtype_rank_type_slen (rank, etype, string_length); + gfc_conv_descriptor_dtype_set (block, descr, dtype); +} + +void +gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, + gfc_expr *expr, tree descr) +{ + return gfc_nullify_descriptor (block, sym, expr, descr, NULL_TREE); } diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index c78887cfbf92..89f995843fc6 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -66,7 +66,7 @@ gfc_get_character_len (tree type) /* Calculate the number of bytes in a string. */ tree -gfc_get_character_len_in_bytes (tree type) +gfc_get_character_len_in_bytes (tree type, tree slen) { tree tmp, len; @@ -76,7 +76,7 @@ gfc_get_character_len_in_bytes (tree type) tmp = TYPE_SIZE_UNIT (TREE_TYPE (type)); tmp = (tmp && !integer_zerop (tmp)) ? (fold_convert (gfc_charlen_type_node, tmp)) : (NULL_TREE); - len = gfc_get_character_len (type); + len = slen ? slen : gfc_get_character_len (type); if (tmp && len && !integer_zerop (len)) len = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node, len, tmp); @@ -84,6 +84,13 @@ gfc_get_character_len_in_bytes (tree type) } +tree +gfc_get_character_len_in_bytes (tree type) +{ + return gfc_get_character_len_in_bytes (type, NULL_TREE); +} + + /* Convert a scalar to an array descriptor. To be used for assumed-rank arrays. */ diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index c9dddca3f718..aac36ea623a0 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -1704,7 +1704,7 @@ gfc_get_desc_dim_type (void) unknown cases abort. */ tree -gfc_get_dtype_rank_type (int rank, tree etype) +gfc_get_dtype_rank_type_slen (int rank, tree etype, tree length) { tree ptype; tree size; @@ -1769,7 +1769,7 @@ gfc_get_dtype_rank_type (int rank, tree etype) { case BT_CHARACTER: gcc_assert (TREE_CODE (ptype) == ARRAY_TYPE); - size = gfc_get_character_len_in_bytes (ptype); + size = gfc_get_character_len_in_bytes (ptype, length); break; case BT_VOID: gcc_assert (TREE_CODE (ptype) == POINTER_TYPE); @@ -1784,6 +1784,13 @@ gfc_get_dtype_rank_type (int rank, tree etype) } +tree +gfc_get_dtype_rank_type (int rank, tree etype) +{ + return gfc_get_dtype_rank_type_slen (rank, etype, NULL_TREE); +} + + tree gfc_get_dtype (tree type, int * rank) { diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h index a2169e436c8b..a8e03dc19cc1 100644 --- a/gcc/fortran/trans-types.h +++ b/gcc/fortran/trans-types.h @@ -119,6 +119,7 @@ bool gfc_return_by_reference (gfc_symbol *); bool gfc_is_nodesc_array (gfc_symbol *); /* Return the DTYPE for an array. */ +tree gfc_get_dtype_rank_type_slen (int, tree, tree); tree gfc_get_dtype_rank_type (int, tree); tree gfc_get_dtype (tree, int *rank = NULL); diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index ca766e0a3394..6788c5dc4b5c 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -519,6 +519,7 @@ void gfc_conv_expr_type (gfc_se * se, gfc_expr *, tree); /* trans-expr.cc */ tree gfc_get_character_len_in_bytes (tree); +tree gfc_get_character_len_in_bytes (tree, tree); tree gfc_conv_scalar_to_descriptor (gfc_se *, tree, symbol_attribute); tree gfc_get_ultimate_alloc_ptr_comps_caf_token (gfc_se *, gfc_expr *); tree gfc_string_to_single_character (tree len, tree str, int kind);