Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Sergio Durigan Junior <sergiodj@redhat.com>
To: gdb-patches@sourceware.org,  andrew.burgess@embecosm.com
Cc: Joel Brobecker <brobecker@adacore.com>
Subject: [PATCH] Add gdb.fortran/vla-stride.exp and report a bug (was: Re: [review] gdb/fortran: array stride support)
Date: Tue, 14 Jan 2020 04:11:00 -0000	[thread overview]
Message-ID: <87sgkivgx2.fsf_-_@redhat.com> (raw)
In-Reply-To: <gerrit.1573743387000.I9af2bcd1f2d4c56f76f5f3f9f89d8f06bef10d9a@gnutoolchain-gerrit.osci.io>	(Andrew Burgess's message of "Thu, 14 Nov 2019 09:56:27 -0500")

[-- Attachment #1: Type: text/plain, Size: 3368 bytes --]

On Thursday, November 14 2019, Andrew Burgess wrote:

> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/627
> ......................................................................
>
> gdb/fortran: array stride support
> [...]

Hey Andrew,

I found a problem with this patch, and I'd like to know if you've
noticed this as well.  I first encountered the problem while doing
downstream work on Fedora GDB for Fedora Rawhide; as you are probably
aware, we carry *a lot* of local Fortran VLA patches on Fedora GDB (if
you're not aware about this, feel free to get in touch with me and I'll
be more than happy to explain the situation to you).  However, I am able
to reproduce the problem on upstream GDB as well.

On Fedora GDB, we carry a testcase called gdb.fortran/vla-stride.exp.  I'm
attaching it to this message.  One of its tests fails with:

  (gdb) print pvla
  Cannot access memory at address 0x426000
  FAIL: gdb.fortran/vla-stride.exp: print single-element

See more below.

> diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
> index fd1c765..968aeb2 100644
> --- a/gdb/gdbtypes.c
> +++ b/gdb/gdbtypes.c
[...]
>  /* Create a range type using either a blank type supplied in
>     RESULT_TYPE, or creating a new type, inheriting the objfile from
>     INDEX_TYPE.
> @@ -982,7 +1011,8 @@
>  has_static_range (const struct range_bounds *bounds)
>  {
>    return (bounds->low.kind == PROP_CONST
> -	  && bounds->high.kind == PROP_CONST);
> +	  && bounds->high.kind == PROP_CONST
> +	  && bounds->stride.kind == PROP_CONST);
>  }
>  
>  
> @@ -1189,6 +1219,15 @@
>  	  && !type_not_allocated (result_type)))
>      {
>        LONGEST low_bound, high_bound;
> +      unsigned 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
> +	 we don't want to place the stride value from the range into this
> +	 arrays bit size field.  */
> +      stride = bit_stride;
> +      if (stride == 0)
> +	stride = TYPE_BIT_STRIDE (range_type);
>  
>        if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
>  	low_bound = high_bound = 0;
> @@ -1198,9 +1237,9 @@
>  	 In such cases, the array length should be zero.  */
>        if (high_bound < low_bound)
>  	TYPE_LENGTH (result_type) = 0;
> -      else if (bit_stride > 0)
> +      else if (stride > 0)
>  	TYPE_LENGTH (result_type) =
> -	  (bit_stride * (high_bound - low_bound + 1) + 7) / 8;
> +	  (stride * (high_bound - low_bound + 1) + 7) / 8;

After spending a lot of time investigating this, I found that the
problem because TYPE_LENGTH (result_type) will be set to a ridiculously
high value here, due to the fact that stride (and therefore bit_stride)
will also be ridiculously high.  bit_stride is obtained back in
gdbtypes.c:resolve_dynamic_array_or_string as:

  ...
  else
    bit_stride = TYPE_FIELD_BITSIZE (type, 0);

TBH, I haven't investigated further because this was taking too long,
and I decided to call on the experts.  The code above was added by Joel,
so I took the liberty to Cc him as well.

The test can be found below.

Thanks,

-- 
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF  31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible
http://sergiodj.net/


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-gdb.fortran-vla-stride.exp.patch --]
[-- Type: text/x-patch, Size: 4291 bytes --]

From a2192e20726e05463405297d16d0661841360f6a Mon Sep 17 00:00:00 2001
From: Sergio Durigan Junior <sergiodj@redhat.com>
Date: Mon, 13 Jan 2020 22:43:37 -0500
Subject: [PATCH] Add gdb.fortran/vla-stride.exp

This patch adds a new testcase, gdb.fortran/vla-stride.exp, in order
to extend the Fortran stride tests.

This test was part of Fedora GDB.

gdb/testsuite/ChangeLog:
2020-01-14  Sergio Durigan Junior  <sergiodj@redhat.com>

	* gdb.fortran/vla-stride.exp: New file.
	* gdb.fortran/vla-stride.f90: New file.

Change-Id: Ia9756868b550e75143d805f1ed2763a43017804d
---
 gdb/testsuite/gdb.fortran/vla-stride.exp | 44 ++++++++++++++++++++++++
 gdb/testsuite/gdb.fortran/vla-stride.f90 | 29 ++++++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 gdb/testsuite/gdb.fortran/vla-stride.exp
 create mode 100644 gdb/testsuite/gdb.fortran/vla-stride.f90

diff --git a/gdb/testsuite/gdb.fortran/vla-stride.exp b/gdb/testsuite/gdb.fortran/vla-stride.exp
new file mode 100644
index 0000000000..15573e22cb
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/vla-stride.exp
@@ -0,0 +1,44 @@
+# Copyright 2016-2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile ".f90"
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
+    {debug f90 quiet}] } {
+    return -1
+}
+
+if ![runto MAIN__] then {
+    perror "couldn't run to breakpoint MAIN__"
+    continue
+}
+
+gdb_breakpoint [gdb_get_line_number "re-reverse-elements"]
+gdb_continue_to_breakpoint "re-reverse-elements"
+gdb_test "print pvla" " = \\\(1, 2, 3, 4, 5, 6, 7, 8, 9, 10\\\)" \
+  "print re-reverse-elements"
+gdb_test "print pvla(1)" " = 1" "print first re-reverse-element"
+gdb_test "print pvla(10)" " = 10" "print last re-reverse-element"
+
+gdb_breakpoint [gdb_get_line_number "odd-elements"]
+gdb_continue_to_breakpoint "odd-elements"
+gdb_test "print pvla" " = \\\(1, 3, 5, 7, 9\\\)" "print odd-elements"
+gdb_test "print pvla(1)" " = 1" "print first odd-element"
+gdb_test "print pvla(5)" " = 9" "print last odd-element"
+
+gdb_breakpoint [gdb_get_line_number "single-element"]
+gdb_continue_to_breakpoint "single-element"
+gdb_test "print pvla" " = \\\(5\\\)" "print single-element"
+gdb_test "print pvla(1)" " = 5" "print one single-element"
diff --git a/gdb/testsuite/gdb.fortran/vla-stride.f90 b/gdb/testsuite/gdb.fortran/vla-stride.f90
new file mode 100644
index 0000000000..22b8a65278
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/vla-stride.f90
@@ -0,0 +1,29 @@
+! Copyright 2016-2020 Free Software Foundation, Inc.
+!
+! This program is free software; you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation; either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+program vla_stride
+  integer, target, allocatable :: vla (:)
+  integer, pointer :: pvla (:)
+
+  allocate(vla(10))
+  vla = (/ (I, I = 1,10) /)
+
+  pvla => vla(10:1:-1)
+  pvla => pvla(10:1:-1)
+  pvla => vla(1:10:2)   ! re-reverse-elements
+  pvla => vla(5:4:-2)   ! odd-elements
+
+  pvla => null()        ! single-element
+end program vla_stride
-- 
2.21.0


  parent reply	other threads:[~2020-01-14  3:46 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 ` Sergio Durigan Junior [this message]
2020-01-19  1:59   ` [PATCH] Add gdb.fortran/vla-stride.exp and report a bug (was: Re: [review] gdb/fortran: array stride support) 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         ` [PUSHED] gdb/fortran: Support negative array stride in one limited case Simon Marchi via Gdb-patches
2020-12-12 22:18           ` 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=87sgkivgx2.fsf_-_@redhat.com \
    --to=sergiodj@redhat.com \
    --cc=andrew.burgess@embecosm.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    /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