Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Andrew Burgess <andrew.burgess@embecosm.com>, gdb-patches@sourceware.org
Subject: Re: [PUSHED] gdb/fortran: Support negative array stride in one limited case
Date: Sat, 12 Dec 2020 01:33:21 -0500	[thread overview]
Message-ID: <62551675-7b8d-a6af-113e-d59ad6c2334f@polymtl.ca> (raw)
In-Reply-To: <20200225163500.13749-1-andrew.burgess@embecosm.com>

Hi Andrew,

Sorry to revive this thread.

I build my GDB with ASan, and I see the gdb.fortran/vla-type.exp test crashing GDB with:

ptype fivedynarr(2)
/home/smarchi/src/binutils-gdb/gdb/valarith.c:1171:10: runtime error: signed integer overflow: 16777216 * 140737351048816 cannot be represented in type 'long int'

Commit 5bbd8269fa8d ("gdb/fortran: array stride support") is the first one where it does
this.

Simon

On 2020-02-25 11:35 a.m., Andrew Burgess wrote:
> I've pushed this fix now.  The exact patch I pushed is included below.
> 
> 
> Thanks,
> Andrew
> 
> 
> 
> 
> ---
> 
> This commit adds support for negative Fortran array strides in one
> limited case, that is the case of a single element array with a
> negative array stride.
> 
> The changes in this commit will be required in order for more general
> negative array stride support to work correctly, however, right now
> other problems in GDB prevent negative array strides from working in
> the general case.
> 
> The reason negative array strides don't currently work in the general
> case is that when dealing with such arrays, the base address for the
> objects data is actually the highest addressed element, subsequent
> elements are then accessed with a negative offset from that address,
> and GDB is not currently happy with this configuration.
> 
> The changes here can be summarised as, stop treating signed values as
> unsigned, specifically, the array stride, and offsets calculated using
> the array stride.
> 
> This issue was identified on the mailing list by Sergio:
> 
>   https://sourceware.org/ml/gdb-patches/2020-01/msg00360.html
> 
> The test for this issue is a new one written by me as the copyright
> status of the original test is currently unknown.
> 
> gdb/ChangeLog:
> 
> 	* gdbtypes.c (create_array_type_with_stride): Handle negative
> 	array strides.
> 	* valarith.c (value_subscripted_rvalue): Likewise.
> 
> gdb/testsuite/ChangeLog:
> 
> 	* gdb.fortran/derived-type-striding.exp: Add a new test.
> 	* gdb.fortran/derived-type-striding.f90: Add pointer variable for
> 	new test.
> ---
>  gdb/ChangeLog                                       |  6 ++++++
>  gdb/gdbtypes.c                                      | 17 +++++++++++++----
>  gdb/testsuite/ChangeLog                             |  6 ++++++
>  gdb/testsuite/gdb.fortran/derived-type-striding.exp |  2 ++
>  gdb/testsuite/gdb.fortran/derived-type-striding.f90 |  2 ++
>  gdb/valarith.c                                      |  4 ++--
>  6 files changed, 31 insertions(+), 6 deletions(-)
> 
> diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
> index 85758930491..ef110b30445 100644
> --- a/gdb/gdbtypes.c
> +++ b/gdb/gdbtypes.c
> @@ -1223,7 +1223,7 @@ create_array_type_with_stride (struct type *result_type,
>  	  && !type_not_allocated (result_type)))
>      {
>        LONGEST low_bound, high_bound;
> -      unsigned int stride;
> +      int stride;
>  
>        /* If the array itself doesn't provide a stride value then take
>  	 whatever stride the range provides.  Don't update BIT_STRIDE as
> @@ -1241,9 +1241,18 @@ create_array_type_with_stride (struct type *result_type,
>  	 In such cases, the array length should be zero.  */
>        if (high_bound < low_bound)
>  	TYPE_LENGTH (result_type) = 0;
> -      else if (stride > 0)
> -	TYPE_LENGTH (result_type) =
> -	  (stride * (high_bound - low_bound + 1) + 7) / 8;
> +      else if (stride != 0)
> +	{
> +	  /* Ensure that the type length is always positive, even in the
> +	     case where (for example in Fortran) we have a negative
> +	     stride.  It is possible to have a single element array with a
> +	     negative stride in Fortran (this doesn't mean anything
> +	     special, it's still just a single element array) so do
> +	     consider that case when touching this code.  */
> +	  LONGEST element_count = abs (high_bound - low_bound + 1);
> +	  TYPE_LENGTH (result_type)
> +	    = ((abs (stride) * element_count) + 7) / 8;
> +	}
>        else
>  	TYPE_LENGTH (result_type) =
>  	  TYPE_LENGTH (element_type) * (high_bound - low_bound + 1);
> diff --git a/gdb/testsuite/gdb.fortran/derived-type-striding.exp b/gdb/testsuite/gdb.fortran/derived-type-striding.exp
> index 094843ca8b1..639dc4c9528 100644
> --- a/gdb/testsuite/gdb.fortran/derived-type-striding.exp
> +++ b/gdb/testsuite/gdb.fortran/derived-type-striding.exp
> @@ -41,3 +41,5 @@ gdb_test "p point_dimension" "= \\\(2, 2, 2, 2, 2, 2, 2, 2, 2\\\)"
>  # Test mixed type derived type.
>  if { $gcc_with_broken_stride } { setup_kfail *-*-* gcc/92775 }
>  gdb_test "p point_mixed_dimension" "= \\\(3, 3, 3, 3\\\)"
> +
> +gdb_test "p cloud_slice" " = \\\(\\\( x = 1, y = 2, z = 3 \\\)\\\)"
> diff --git a/gdb/testsuite/gdb.fortran/derived-type-striding.f90 b/gdb/testsuite/gdb.fortran/derived-type-striding.f90
> index 26829f51dc0..fb537579faa 100644
> --- a/gdb/testsuite/gdb.fortran/derived-type-striding.f90
> +++ b/gdb/testsuite/gdb.fortran/derived-type-striding.f90
> @@ -28,9 +28,11 @@ program derived_type_member_stride
>      type(mixed_cartesian), dimension(10), target :: mixed_cloud
>      integer(kind=8), dimension(:), pointer :: point_dimension => null()
>      integer(kind=8), dimension(:), pointer :: point_mixed_dimension => null()
> +    type(cartesian), dimension(:), pointer :: cloud_slice => null()
>      cloud(:)%x = 1
>      cloud(:)%y = 2
>      cloud(:)%z = 3
> +    cloud_slice => cloud(3:2:-2)
>      point_dimension => cloud(1:9)%y
>      mixed_cloud(:)%x = 1
>      mixed_cloud(:)%y = 2
> diff --git a/gdb/valarith.c b/gdb/valarith.c
> index 79b148602bb..be0e0731bee 100644
> --- a/gdb/valarith.c
> +++ b/gdb/valarith.c
> @@ -187,7 +187,7 @@ value_subscripted_rvalue (struct value *array, LONGEST index, LONGEST lowerbound
>  {
>    struct type *array_type = check_typedef (value_type (array));
>    struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type));
> -  ULONGEST elt_size = type_length_units (elt_type);
> +  LONGEST elt_size = type_length_units (elt_type);
>  
>    /* Fetch the bit stride and convert it to a byte stride, assuming 8 bits
>       in a byte.  */
> @@ -199,7 +199,7 @@ value_subscripted_rvalue (struct value *array, LONGEST index, LONGEST lowerbound
>        elt_size = stride / (unit_size * 8);
>      }
>  
> -  ULONGEST elt_offs = elt_size * (index - lowerbound);
> +  LONGEST elt_offs = elt_size * (index - lowerbound);
>  
>    if (index < lowerbound
>        || (!TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (array_type)
> 

  parent reply	other threads:[~2020-12-12  6:33 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-14 14:56 [review] gdb/fortran: array stride support Andrew Burgess (Code Review)
2019-11-15 22:36 ` Tom Tromey (Code Review)
2019-11-15 23:54 ` Andrew Burgess (Code Review)
2019-11-18 18:58 ` Tom Tromey (Code Review)
2019-11-18 21:47 ` [review v2] " Andrew Burgess (Code Review)
2019-11-18 21:50 ` Andrew Burgess (Code Review)
2019-11-18 21:55 ` [review v3] " Andrew Burgess (Code Review)
2019-11-22 10:10 ` [review v4] " Andrew Burgess (Code Review)
2019-11-22 10:12 ` Andrew Burgess (Code Review)
2019-11-22 13:06 ` Simon Marchi (Code Review)
2019-11-22 17:30 ` [review v5] " Andrew Burgess (Code Review)
2019-11-22 17:31 ` Andrew Burgess (Code Review)
2019-11-22 17:46 ` Simon Marchi (Code Review)
2019-11-28  0:45 ` [review v6] " Andrew Burgess (Code Review)
2019-11-29 23:32 ` [review v7] " Andrew Burgess (Code Review)
2019-11-29 23:35 ` Andrew Burgess (Code Review)
2019-11-30 21:47 ` [review v8] " Andrew Burgess (Code Review)
2019-11-30 22:10 ` [review v9] " Andrew Burgess (Code Review)
2019-11-30 22:11 ` Andrew Burgess (Code Review)
2019-12-01  0:09 ` Simon Marchi (Code Review)
2019-12-01  0:09 ` Simon Marchi (Code Review)
2019-12-01 22:33 ` [pushed] " Sourceware to Gerrit sync (Code Review)
2019-12-01 22:33 ` Sourceware to Gerrit sync (Code Review)
2020-01-14  4:11 ` [PATCH] Add gdb.fortran/vla-stride.exp and report a bug (was: Re: [review] gdb/fortran: array stride support) Sergio Durigan Junior
2020-01-19  1:59   ` Andrew Burgess
2020-02-05 16:38     ` [PATCH] Add gdb.fortran/vla-stride.exp and report a bug Sergio Durigan Junior
2020-02-25 16:35       ` [PUSHED] gdb/fortran: Support negative array stride in one limited case Andrew Burgess
2020-08-06 10:41         ` Copyright status gdb.fortran/vla-stride.exp test-case Tom de Vries
2020-08-06 13:35           ` Andrew Burgess
2020-08-18  9:50             ` Tom de Vries
2020-08-18 10:12               ` Andrew Burgess
2020-12-12  6:33         ` Simon Marchi via Gdb-patches [this message]
2020-12-12 22:18           ` [PUSHED] gdb/fortran: Support negative array stride in one limited case Andrew Burgess
2020-12-13  0:51             ` Simon Marchi via Gdb-patches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=62551675-7b8d-a6af-113e-d59ad6c2334f@polymtl.ca \
    --to=gdb-patches@sourceware.org \
    --cc=andrew.burgess@embecosm.com \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox