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
This commit is contained in:
Alok Kumar Sharma 2020-02-03 20:24:34 -05:00 committed by Simon Marchi
parent 6ec6b3c8ab
commit e409c542cc
5 changed files with 74 additions and 1 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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>.

View File

@ -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\).*}

View File

@ -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