re PR fortran/92775 (Incorrect expression in DW_AT_byte_stride on an array)
authorJakub Jelinek <jakub@gcc.gnu.org>
Fri, 6 Dec 2019 13:28:59 +0000 (14:28 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 6 Dec 2019 13:28:59 +0000 (14:28 +0100)
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
gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/fortran/trans-array.h
gcc/fortran/trans-types.c
gcc/fortran/trans.h

index ed7878c8d2338b9f4a79ce215e3d129721041bee..a124cb091ef4855c9727d4bc0e6438778bf025a9 100644 (file)
@@ -1,5 +1,5 @@
 2019-12-06  Tobias Burnus  <tobias@codesourcery.com>
-           Kwok Cheung Yeung <kcy@codesourcery.com>
+           Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * omp-low.c (lower_omp_target): For optional arguments, deref once
        more to obtain the type.
index 682a10c88690ee07dd5d6ef5a9b113dfca301357..f9b795dd828e426e3d732930dab66f001dc8c270 100644 (file)
@@ -1,5 +1,18 @@
+2019-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       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  <tobias@codesourcery.com>
-           Kwok Cheung Yeung <kcy@codesourcery.com>
+           Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * trans-openmp.c (gfc_build_conditional_assign, 
        gfc_build_conditional_assign_expr): New static functions.
index 685f8c5a874a180f87e168508016979e5ae2fb0b..452b494e93a71a3871c6adb7baef454388103f39 100644 (file)
@@ -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));
index 5a7eee7e305e1b3fbcb0cb3ada5dde92bac252e5..3d1876303671de2da2d50cf712489bbf641247e1 100644 (file)
@@ -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);
index 82666c48beccb15940a93452d1829bb205f7f77b..9f4890dea619a08abee2ca569e6abc039c811995 100644 (file)
@@ -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);
index 359c7a2561a0323ecd79306cbe6804eff7ba9442..07c1e4ffb3f90fd368e6b195fce4b1428bde3daa 100644 (file)
@@ -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)])