From 2297a38e0c18eaec95bebf750855fb9a4026ffbf Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 6 Dec 2019 14:28:59 +0100 Subject: [PATCH] re PR fortran/92775 (Incorrect expression in DW_AT_byte_stride on an array) PR fortran/92775 * trans.h (struct lang_type, struct lang_decl): Remove span member. (GFC_DECL_SPAN, GFC_TYPE_ARRAY_SPAN): Remove macros. * trans-array.h (gfc_get_descriptor_offsets_for_info): Add another argument. * trans-array.c (gfc_get_descriptor_offsets_for_info): Add SPAN_OFF argument and initialize *SPAN_OFF to the offset of span field. * trans-types.c (gfc_get_array_descr_info): Adjust gfc_get_descriptor_offsets_for_info caller. Compute elem_size as base->span instead of TYPE_SIZE_UNIT (etype) constant. From-SVN: r279045 --- gcc/ChangeLog | 2 +- gcc/fortran/ChangeLog | 15 ++++++++++++++- gcc/fortran/trans-array.c | 9 ++++++--- gcc/fortran/trans-array.h | 2 +- gcc/fortran/trans-types.c | 11 ++++++----- gcc/fortran/trans.h | 4 ---- 6 files changed, 28 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed7878c8d23..a124cb091ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,5 @@ 2019-12-06 Tobias Burnus - Kwok Cheung Yeung + Kwok Cheung Yeung * omp-low.c (lower_omp_target): For optional arguments, deref once more to obtain the type. diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 682a10c8869..f9b795dd828 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,18 @@ +2019-12-06 Jakub Jelinek + + PR fortran/92775 + * trans.h (struct lang_type, struct lang_decl): Remove span member. + (GFC_DECL_SPAN, GFC_TYPE_ARRAY_SPAN): Remove macros. + * trans-array.h (gfc_get_descriptor_offsets_for_info): Add another + argument. + * trans-array.c (gfc_get_descriptor_offsets_for_info): Add SPAN_OFF + argument and initialize *SPAN_OFF to the offset of span field. + * trans-types.c (gfc_get_array_descr_info): Adjust + gfc_get_descriptor_offsets_for_info caller. Compute elem_size + as base->span instead of TYPE_SIZE_UNIT (etype) constant. + 2019-12-06 Tobias Burnus - Kwok Cheung Yeung + Kwok Cheung Yeung * trans-openmp.c (gfc_build_conditional_assign, gfc_build_conditional_assign_expr): New static functions. diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 685f8c5a874..452b494e93a 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -540,9 +540,10 @@ gfc_conv_shift_descriptor_lbound (stmtblock_t* block, tree desc, void gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, - tree *dtype_off, tree *dim_off, - tree *dim_size, tree *stride_suboff, - tree *lower_suboff, tree *upper_suboff) + tree *dtype_off, tree *span_off, + tree *dim_off, tree *dim_size, + tree *stride_suboff, tree *lower_suboff, + tree *upper_suboff) { tree field; tree type; @@ -552,6 +553,8 @@ gfc_get_descriptor_offsets_for_info (const_tree desc_type, tree *data_off, *data_off = byte_position (field); field = gfc_advance_chain (TYPE_FIELDS (type), DTYPE_FIELD); *dtype_off = byte_position (field); + field = gfc_advance_chain (TYPE_FIELDS (type), SPAN_FIELD); + *span_off = byte_position (field); field = gfc_advance_chain (TYPE_FIELDS (type), DIMENSION_FIELD); *dim_off = byte_position (field); type = TREE_TYPE (TREE_TYPE (field)); diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h index 5a7eee7e305..3d187630367 100644 --- a/gcc/fortran/trans-array.h +++ b/gcc/fortran/trans-array.h @@ -163,7 +163,7 @@ void gfc_trans_array_cobounds (tree, stmtblock_t *, const gfc_symbol *); /* Build expressions for accessing components of an array descriptor. */ void gfc_get_descriptor_offsets_for_info (const_tree, tree *, tree *, tree *, tree *, - tree *, tree *, tree *); + tree *, tree *, tree *, tree *); tree gfc_conv_descriptor_data_get (tree); tree gfc_conv_descriptor_data_addr (tree); diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 82666c48bec..9f4890dea61 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -3266,7 +3266,7 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) int rank, dim; bool indirect = false; tree etype, ptype, t, base_decl; - tree data_off, dim_off, dtype_off, dim_size, elem_size; + tree data_off, span_off, dim_off, dtype_off, dim_size, elem_size; tree lower_suboff, upper_suboff, stride_suboff; tree dtype, field, rank_off; @@ -3323,12 +3323,13 @@ gfc_get_array_descr_info (const_tree type, struct array_descr_info *info) if (indirect) base_decl = build1 (INDIRECT_REF, ptype, base_decl); - elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype)); - - gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &dim_off, - &dim_size, &stride_suboff, + gfc_get_descriptor_offsets_for_info (type, &data_off, &dtype_off, &span_off, + &dim_off, &dim_size, &stride_suboff, &lower_suboff, &upper_suboff); + t = fold_build_pointer_plus (base_decl, span_off); + elem_size = build1 (INDIRECT_REF, gfc_array_index_type, t); + t = base_decl; if (!integer_zerop (data_off)) t = fold_build_pointer_plus (t, data_off); diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 359c7a2561a..07c1e4ffb3f 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -981,7 +981,6 @@ struct GTY(()) lang_type { tree offset; tree dtype; tree dataptr_type; - tree span; tree base_decl[2]; tree nonrestricted_type; tree caf_token; @@ -997,7 +996,6 @@ struct GTY(()) lang_decl { address of target label. */ tree stringlen; tree addr; - tree span; /* For assumed-shape coarrays. */ tree token, caf_offset; unsigned int scalar_allocatable : 1; @@ -1008,7 +1006,6 @@ struct GTY(()) lang_decl { #define GFC_DECL_ASSIGN_ADDR(node) DECL_LANG_SPECIFIC(node)->addr #define GFC_DECL_STRING_LEN(node) DECL_LANG_SPECIFIC(node)->stringlen -#define GFC_DECL_SPAN(node) DECL_LANG_SPECIFIC(node)->span #define GFC_DECL_TOKEN(node) DECL_LANG_SPECIFIC(node)->token #define GFC_DECL_CAF_OFFSET(node) DECL_LANG_SPECIFIC(node)->caf_offset #define GFC_DECL_SAVED_DESCRIPTOR(node) \ @@ -1059,7 +1056,6 @@ struct GTY(()) lang_decl { #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype) #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \ (TYPE_LANG_SPECIFIC(node)->dataptr_type) -#define GFC_TYPE_ARRAY_SPAN(node) (TYPE_LANG_SPECIFIC(node)->span) #define GFC_TYPE_ARRAY_BASE_DECL(node, internal) \ (TYPE_LANG_SPECIFIC(node)->base_decl[(internal)]) -- 2.30.2