aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlok Kumar Sharma <AlokKumar.Sharma@amd.com>2020-02-03 20:24:34 -0500
committerSimon Marchi <simon.marchi@polymtl.ca>2020-02-03 20:24:34 -0500
commite409c542cc3cedebf78c7827e976d36955d477bb (patch)
treea8231b01637b95ed9efb80cb7155e8241f4c86c1
parent6ec6b3c8abd0378ad6e750570c038b05b6e87703 (diff)
downloadbinutils-e409c542cc3cedebf78c7827e976d36955d477bb.zip
binutils-e409c542cc3cedebf78c7827e976d36955d477bb.tar.gz
binutils-e409c542cc3cedebf78c7827e976d36955d477bb.tar.bz2
Fixed gdb to print arrays with very high indexes
In the function f77_print_array_1, the variable 'i' which holds the index is of datatype 'int', while bounds are of datatype LONGEST. Due to size of int being smaller than LONGEST, the variable 'i' stores incorrect values for high indexes (higher than max limit of int). Due to this issue in sources, two abnormal behaviors are seen while printing arrays with high indexes (please check array-bounds-high.f90) For high indexes with negative sign, gdb prints empty array even if the array has elements. (gdb) p arr $1 = () For high indexes with positive sign, gdb crashes. We have now changed the datatype of 'i' to LONGEST which is same as datatype of bounds. gdb/ChangeLog: * f-valprint.c (f77_print_array_1): Changed datatype of index variable to LONGEST from int to enable it to contain bound values correctly. gdb/testsuite/ChangeLog: * gdb.fortran/array-bounds-high.exp: New file. * gdb.fortran/array-bounds-high.f90: New file. Change-Id: Ie2dce9380a249e634e2684b9c90f225e104369b7
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/f-valprint.c2
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.fortran/array-bounds-high.exp39
-rw-r--r--gdb/testsuite/gdb.fortran/array-bounds-high.f9023
5 files changed, 74 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5ac2596..f9ef0e1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-03 Alok Kumar Sharma <AlokKumar.Sharma@amd.com>
+
+ * f-valprint.c (f77_print_array_1): Changed datatype of index
+ variable to LONGEST from int to enable it to contain bound
+ values correctly.
+
2020-02-03 Maciej W. Rozycki <macro@wdc.com>
* riscv-linux-nat.c [!NFPREG] (NFPREG): New macro.
diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c
index 168957f..71247a7 100644
--- a/gdb/f-valprint.c
+++ b/gdb/f-valprint.c
@@ -115,7 +115,7 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type,
struct type *range_type = TYPE_INDEX_TYPE (check_typedef (type));
CORE_ADDR addr = address + embedded_offset;
LONGEST lowerbound, upperbound;
- int i;
+ LONGEST i;
get_discrete_bounds (range_type, &lowerbound, &upperbound);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 4999756..45eb887 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-03 Alok Kumar Sharma <AlokKumar.Sharma@amd.com>
+
+ * gdb.fortran/array-bounds-high.exp: New file.
+ * gdb.fortran/array-bounds-high.f90: New file.
+
2020-02-03 Lukas Durfina <ldurfina@tachyum.com> (tiny change)
* gdb.base/fileio.c: Remove #include of <sys/errno.h>.
diff --git a/gdb/testsuite/gdb.fortran/array-bounds-high.exp b/gdb/testsuite/gdb.fortran/array-bounds-high.exp
new file mode 100644
index 0000000..81e2f87
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/array-bounds-high.exp
@@ -0,0 +1,39 @@
+# Copyright 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/>.
+
+# This file is part of the gdb testsuite. It contains test to ensure that
+# array bounds accept LONGEST.
+
+if { [skip_fortran_tests] } { return -1 }
+
+set testfile "array-bounds-high"
+standard_testfile .f90
+
+if {[prepare_for_testing $testfile.exp $testfile $srcfile {f90 debug}]} {
+ return -1
+}
+
+if {![runto MAIN__]} {
+ perror "Could not run to breakpoint `MAIN__'."
+ continue
+}
+
+gdb_test "until 21" {21.*print.*}
+
+# Lets check whether too high (with - sign) indexed array are printed correctly
+gdb_test "print arr1" {.*\(11, 11\).*}
+
+# Lets check whether too high (with + sign) indexed array are printed correctly
+gdb_test "print arr2" {.*\(22, 22\).*}
diff --git a/gdb/testsuite/gdb.fortran/array-bounds-high.f90 b/gdb/testsuite/gdb.fortran/array-bounds-high.f90
new file mode 100644
index 0000000..b72cd1bb
--- /dev/null
+++ b/gdb/testsuite/gdb.fortran/array-bounds-high.f90
@@ -0,0 +1,23 @@
+! Copyright 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 main
+ integer(4) :: arr1(-4294967297_8:-4294967296_8)
+ integer(4) :: arr2(4294967296_8:4294967297_8)
+ arr1 = 11
+ arr2 = 22
+ print *, 'arr1 = ', arr1
+ print *, 'arr2 = ', arr2
+end