https://gcc.gnu.org/g:fd57e006d644647fe470b814f86236e70b627e60
commit fd57e006d644647fe470b814f86236e70b627e60 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Tue Jul 1 22:10:35 2025 +0200 Refactoring getters & setters Diff: --- gcc/fortran/trans-descriptor.cc | 132 ++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 85 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index d247c73fc725..4aacf1d0ce6f 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -174,33 +174,39 @@ gfc_get_cfi_dim_sm (tree desc, tree idx) static tree -get_type_field (tree type, unsigned field_idx) +get_type_field (tree type, unsigned field_idx, tree field_type = NULL_TREE) { tree field = gfc_advance_chain (TYPE_FIELDS (type), field_idx); - gcc_assert (field != NULL_TREE); + gcc_assert (field != NULL_TREE + && (field_type == NULL_TREE + || TREE_TYPE (field) == field_type)); return field; } - static tree -gfc_get_descriptor_field (tree desc, unsigned field_idx) +get_ref_comp (tree ref, unsigned field_idx, tree type = NULL_TREE) { - tree type = TREE_TYPE (desc); - gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); - - tree field = get_type_field (type, field_idx); - gcc_assert (field != NULL_TREE); + tree field = get_type_field (TREE_TYPE (ref), field_idx, type); return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field), - desc, field, NULL_TREE); + ref, field, NULL_TREE); +} + + +static tree +get_descr_comp (tree desc, unsigned field_idx, tree type = NULL_TREE) +{ + gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc))); + + return get_ref_comp (desc, field_idx, type); } static tree get_descriptor_data (tree desc) { - return gfc_get_descriptor_field (desc, DATA_FIELD); + return get_descr_comp (desc, DATA_FIELD); } /* This provides READ-ONLY access to the data field. The field itself @@ -229,7 +235,7 @@ gfc_conv_descriptor_data_get (tree desc) void gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value) { - tree field = gfc_get_descriptor_field (desc, DATA_FIELD); + tree field = get_descriptor_data (desc); gfc_add_modify (block, field, fold_convert (TREE_TYPE (field), value)); } @@ -237,8 +243,7 @@ gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value) static tree get_descriptor_offset (tree desc) { - tree field = gfc_get_descriptor_field (desc, OFFSET_FIELD); - gcc_assert (TREE_TYPE (field) == gfc_array_index_type); + tree field = get_descr_comp (desc, OFFSET_FIELD, gfc_array_index_type); return field; } @@ -249,8 +254,7 @@ gfc_conv_descriptor_offset_get (tree desc) } void -gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, - tree value) +gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, tree value) { tree t = get_descriptor_offset (desc); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); @@ -260,9 +264,8 @@ gfc_conv_descriptor_offset_set (stmtblock_t *block, tree desc, static tree get_descriptor_dtype (tree desc) { - tree field = gfc_get_descriptor_field (desc, DTYPE_FIELD); - gcc_assert (TREE_TYPE (field) == get_dtype_type_node ()); - return field; + tree comp = get_descr_comp (desc, DTYPE_FIELD, get_dtype_type_node ()); + return comp; } tree @@ -272,8 +275,7 @@ gfc_conv_descriptor_dtype_get (tree desc) } void -gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, - tree value) +gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, tree value) { tree t = get_descriptor_dtype (desc); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); @@ -283,9 +285,8 @@ gfc_conv_descriptor_dtype_set (stmtblock_t *block, tree desc, static tree gfc_conv_descriptor_span (tree desc) { - tree field = gfc_get_descriptor_field (desc, SPAN_FIELD); - gcc_assert (TREE_TYPE (field) == gfc_array_index_type); - return field; + tree comp = get_descr_comp (desc, SPAN_FIELD, gfc_array_index_type); + return comp; } tree @@ -295,26 +296,24 @@ gfc_conv_descriptor_span_get (tree desc) } void -gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, - tree value) +gfc_conv_descriptor_span_set (stmtblock_t *block, tree desc, tree value) { tree t = gfc_conv_descriptor_span (desc); gfc_add_modify (block, t, fold_convert (TREE_TYPE (t), value)); } +static tree +get_dtype_comp (tree desc, unsigned field_idx, tree type = NULL_TREE) +{ + tree dtype_ref = get_descriptor_dtype (desc); + return get_ref_comp (dtype_ref, field_idx, type); +} + static tree get_descriptor_rank (tree desc) { - tree tmp; - tree dtype; - - dtype = get_descriptor_dtype (desc); - tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_RANK); - gcc_assert (tmp != NULL_TREE - && TREE_TYPE (tmp) == signed_char_type_node); - return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), - dtype, tmp, NULL_TREE); + return get_dtype_comp (desc, GFC_DTYPE_RANK, signed_char_type_node); } tree @@ -339,15 +338,7 @@ gfc_conv_descriptor_rank_set (stmtblock_t *block, tree desc, int value) static tree get_descriptor_version (tree desc) { - tree tmp; - tree dtype; - - dtype = get_descriptor_dtype (desc); - tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_VERSION); - gcc_assert (tmp != NULL_TREE - && TREE_TYPE (tmp) == integer_type_node); - return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), - dtype, tmp, NULL_TREE); + return get_dtype_comp (desc, GFC_DTYPE_RANK, integer_type_node); } tree @@ -370,16 +361,7 @@ gfc_conv_descriptor_version_set (stmtblock_t *block, tree desc, static tree get_descriptor_elem_len (tree desc) { - tree tmp; - tree dtype; - - dtype = get_descriptor_dtype (desc); - tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), - GFC_DTYPE_ELEM_LEN); - gcc_assert (tmp != NULL_TREE - && TREE_TYPE (tmp) == size_type_node); - return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), - dtype, tmp, NULL_TREE); + return get_dtype_comp (desc, GFC_DTYPE_RANK, size_type_node); } tree @@ -400,15 +382,7 @@ gfc_conv_descriptor_elem_len_set (stmtblock_t *block, tree desc, static tree get_descriptor_type (tree desc) { - tree tmp; - tree dtype; - - dtype = get_descriptor_dtype (desc); - tmp = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (dtype)), GFC_DTYPE_TYPE); - gcc_assert (tmp!= NULL_TREE - && TREE_TYPE (tmp) == signed_char_type_node); - return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (tmp), - dtype, tmp, NULL_TREE); + return get_dtype_comp (desc, GFC_DTYPE_RANK, signed_char_type_node); } tree @@ -430,11 +404,8 @@ gfc_conv_descriptor_type_set (stmtblock_t *block, tree desc, int value) tree type = TREE_TYPE (desc); gcc_assert (GFC_DESCRIPTOR_TYPE_P (type)); - tree dtype = get_type_field (type, DTYPE_FIELD); - gcc_assert (dtype != NULL_TREE); - - tree field = get_type_field (TREE_TYPE (dtype), GFC_DTYPE_TYPE); - gcc_assert (field != NULL_TREE); + tree dtype_field = get_type_field (type, DTYPE_FIELD, get_dtype_type_node ()); + tree field = get_type_field (TREE_TYPE (dtype_field), GFC_DTYPE_TYPE); tree type_value = build_int_cst (TREE_TYPE (field), value); gfc_conv_descriptor_type_set (block, desc, type_value); @@ -464,7 +435,7 @@ gfc_conv_descriptor_type_set (tree desc, int value) tree gfc_get_descriptor_dimension (tree desc) { - tree field = gfc_get_descriptor_field (desc, DIMENSION_FIELD); + tree field = get_descr_comp (desc, DIMENSION_FIELD); gcc_assert (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == RECORD_TYPE); return field; @@ -513,7 +484,7 @@ tree gfc_conv_descriptor_token (tree desc) { gcc_assert (flag_coarray == GFC_FCOARRAY_LIB); - tree field = gfc_get_descriptor_field (desc, CAF_TOKEN_FIELD); + tree field = get_descr_comp (desc, CAF_TOKEN_FIELD); /* Should be a restricted pointer - except in the finalization wrapper. */ gcc_assert (TREE_TYPE (field) == prvoid_type_node || TREE_TYPE (field) == pvoid_type_node); @@ -521,22 +492,17 @@ gfc_conv_descriptor_token (tree desc) } static tree -gfc_conv_descriptor_subfield (tree desc, tree dim, unsigned field_idx) +get_descr_dim_comp (tree desc, tree dim, unsigned field_idx, + tree type = NULL_TREE) { tree tmp = get_descriptor_dimension (desc, dim); - tree field = gfc_advance_chain (TYPE_FIELDS (TREE_TYPE (tmp)), field_idx); - gcc_assert (field != NULL_TREE); - - return fold_build3_loc (input_location, COMPONENT_REF, TREE_TYPE (field), - tmp, field, NULL_TREE); + return get_ref_comp (tmp, field_idx, type); } static tree get_descriptor_stride (tree desc, tree dim) { - tree field = gfc_conv_descriptor_subfield (desc, dim, STRIDE_SUBFIELD); - gcc_assert (TREE_TYPE (field) == gfc_array_index_type); - return field; + return get_descr_dim_comp (desc, dim, STRIDE_SUBFIELD, gfc_array_index_type); } tree @@ -567,9 +533,7 @@ gfc_conv_descriptor_stride_set (stmtblock_t *block, tree desc, static tree get_descriptor_lbound (tree desc, tree dim) { - tree field = gfc_conv_descriptor_subfield (desc, dim, LBOUND_SUBFIELD); - gcc_assert (TREE_TYPE (field) == gfc_array_index_type); - return field; + return get_descr_dim_comp (desc, dim, LBOUND_SUBFIELD, gfc_array_index_type); } tree @@ -589,9 +553,7 @@ gfc_conv_descriptor_lbound_set (stmtblock_t *block, tree desc, static tree get_descriptor_ubound (tree desc, tree dim) { - tree field = gfc_conv_descriptor_subfield (desc, dim, UBOUND_SUBFIELD); - gcc_assert (TREE_TYPE (field) == gfc_array_index_type); - return field; + return get_descr_dim_comp (desc, dim, UBOUND_SUBFIELD, gfc_array_index_type); } tree