forked from Imagelibrary/binutils-gdb
This commit introduces the idea of loading only part of an array in
order to print it, what I call "limited length" arrays.
The motivation behind this work is to make it possible to print slices
of very large arrays, where very large means bigger than
`max-value-size'.
Consider this GDB session with the current GDB:
(gdb) set max-value-size 100
(gdb) p large_1d_array
value requires 400 bytes, which is more than max-value-size
(gdb) p -elements 10 -- large_1d_array
value requires 400 bytes, which is more than max-value-size
notice that the request to print 10 elements still fails, even though 10
elements should be less than the max-value-size. With a patched version
of GDB:
(gdb) p -elements 10 -- large_1d_array
$1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9...}
So now the print has succeeded. It also has loaded `max-value-size'
worth of data into value history, so the recorded value can be accessed
consistently:
(gdb) p -elements 10 -- $1
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9...}
(gdb) p $1
$3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, <unavailable> <repeats 75 times>}
(gdb)
Accesses with other languages work similarly, although for Ada only
C-style [] array element/dimension accesses use history. For both Ada
and Fortran () array element/dimension accesses go straight to the
inferior, bypassing the value history just as with C pointers.
Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
221 lines
8.9 KiB
Plaintext
221 lines
8.9 KiB
Plaintext
# Copyright 2023 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 tests GDB's limited length array printing.
|
|
|
|
load_lib "fortran.exp"
|
|
|
|
require allow_fortran_tests
|
|
|
|
standard_testfile .f90
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
|
|
return -1
|
|
}
|
|
|
|
if {![fortran_runto_main]} {
|
|
perror "Could not run to main."
|
|
continue
|
|
}
|
|
|
|
gdb_breakpoint [gdb_get_line_number "Break Here"]
|
|
gdb_continue_to_breakpoint "stop-here" ".*Break Here.*"
|
|
|
|
with_test_prefix "with standard max-value size" {
|
|
gdb_test "print large_4d_array" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, 51\\) \\(52, 53, 54\\)\\)\\)\
|
|
\\(\\(\\(55, 56, 57\\) \\(58, 59, 60\\) \\(61, 62, 63\\)\\)\
|
|
\\(\\(64, 65, 66\\) \\(67, 68, 69\\) \\(70, 71, 72\\)\\)\
|
|
\\(\\(73, 74, 75\\) \\(76, 77, 78\\)\
|
|
\\(79, 80, 81\\)\\)\\)\\)"
|
|
gdb_test -nonl "output large_4d_array" \
|
|
"\\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, 51\\) \\(52, 53, 54\\)\\)\\)\
|
|
\\(\\(\\(55, 56, 57\\) \\(58, 59, 60\\) \\(61, 62, 63\\)\\)\
|
|
\\(\\(64, 65, 66\\) \\(67, 68, 69\\) \\(70, 71, 72\\)\\)\
|
|
\\(\\(73, 74, 75\\) \\(76, 77, 78\\) \\(79, 80, 81\\)\\)\\)\\)"
|
|
gdb_test "print large_1d_array" \
|
|
" = \\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, 51, 52, 53, 54,\
|
|
55, 56, 57, 58, 59, 60, 61, 62, 63,\
|
|
64, 65, 66, 67, 68, 69, 70, 71, 72,\
|
|
73, 74, 75, 76, 77, 78, 79, 80, 81\\)"
|
|
gdb_test -nonl "output large_1d_array" \
|
|
"\\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, 51, 52, 53, 54,\
|
|
55, 56, 57, 58, 59, 60, 61, 62, 63,\
|
|
64, 65, 66, 67, 68, 69, 70, 71, 72,\
|
|
73, 74, 75, 76, 77, 78, 79, 80, 81\\)"
|
|
}
|
|
|
|
# Set the max-value-size so we can only print 50 elements.
|
|
set elements 50
|
|
set elem_size [get_valueof "/d" "sizeof(large_1d_array(1))" "*unknown*"]
|
|
gdb_test_no_output "set max-value-size [expr $elem_size * $elements]"
|
|
|
|
with_test_prefix "with reduced max-value size" {
|
|
gdb_test "print large_4d_array" \
|
|
"value requires $decimal bytes, which is more than max-value-size"
|
|
gdb_test "output large_4d_array" \
|
|
"value requires $decimal bytes, which is more than max-value-size"
|
|
gdb_test "print large_1d_array" \
|
|
"value requires $decimal bytes, which is more than max-value-size"
|
|
gdb_test "output large_1d_array" \
|
|
"value requires $decimal bytes, which is more than max-value-size"
|
|
}
|
|
|
|
with_test_prefix "with reduced print -elements flag" {
|
|
gdb_test "print -elements 5 -- large_4d_array" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, \\.\\.\\.\\)\
|
|
\\.\\.\\.\\) \\.\\.\\.\\) \\.\\.\\.\\)"
|
|
gdb_test "print -elements 5 -- large_1d_array" \
|
|
" = \\(1, 2, 3, 4, 5, \\.\\.\\.\\)"
|
|
}
|
|
|
|
gdb_test_no_output "set print elements 5"
|
|
|
|
with_test_prefix "with reduced print elements" {
|
|
gdb_test "print large_4d_array" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, \\.\\.\\.\\)\
|
|
\\.\\.\\.\\) \\.\\.\\.\\) \\.\\.\\.\\)"
|
|
gdb_test -nonl "output large_4d_array" \
|
|
"\\(\\(\\(\\(1, 2, 3\\) \\(4, 5, \\.\\.\\.\\)\
|
|
\\.\\.\\.\\) \\.\\.\\.\\) \\.\\.\\.\\)"
|
|
|
|
gdb_test "print \$" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, \\.\\.\\.\\)\
|
|
\\.\\.\\.\\) \\.\\.\\.\\) \\.\\.\\.\\)" \
|
|
"print large_4d_array from history"
|
|
gdb_test -nonl "output \$\$" \
|
|
"\\(\\(\\(\\(1, 2, 3\\) \\(4, 5, \\.\\.\\.\\)\
|
|
\\.\\.\\.\\) \\.\\.\\.\\) \\.\\.\\.\\)" \
|
|
"output large_4d_array from history"
|
|
|
|
gdb_test "print large_1d_array" \
|
|
" = \\(1, 2, 3, 4, 5, \\.\\.\\.\\)"
|
|
gdb_test -nonl "output large_1d_array" \
|
|
"\\(1, 2, 3, 4, 5, \\.\\.\\.\\)"
|
|
|
|
gdb_test "print \$" \
|
|
" = \\(1, 2, 3, 4, 5, \\.\\.\\.\\)" \
|
|
"print large_1d_array from history"
|
|
gdb_test -nonl "output \$\$" \
|
|
"\\(1, 2, 3, 4, 5, \\.\\.\\.\\)" \
|
|
"output large_1d_array from history"
|
|
}
|
|
|
|
gdb_test_no_output "set print elements $elements"
|
|
|
|
with_test_prefix "with print elements matching max-value size" {
|
|
gdb_test "print \$\$2" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, \\.\\.\\.\\) \\.\\.\\.\\)\\)\
|
|
\\.\\.\\.\\)" \
|
|
"print large_4d_array from history"
|
|
gdb_test -nonl "output \$\$3" \
|
|
"\\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, \\.\\.\\.\\) \\.\\.\\.\\)\\)\
|
|
\\.\\.\\.\\)" \
|
|
"output large_4d_array from history"
|
|
|
|
gdb_test "print \$\$2" \
|
|
" = \\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, \\.\\.\\.\\)" \
|
|
"print large_1d_array from history"
|
|
gdb_test -nonl "output \$\$2" \
|
|
"\\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, \\.\\.\\.\\)" \
|
|
"output large_1d_array from history"
|
|
}
|
|
|
|
gdb_test_no_output "set max-value-size unlimited"
|
|
gdb_test_no_output "set print elements unlimited"
|
|
gdb_test_no_output "set print repeats 2"
|
|
|
|
with_test_prefix "with unlimited print elements" {
|
|
gdb_test "print \$\$" \
|
|
" = \\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, <unavailable>\\)\
|
|
\\(<unavailable>, <repeats 3 times>\\)\\)\\)\
|
|
\\(\\(\\(<unavailable>, <repeats 3 times>\\)\
|
|
<repeats 3 times>\\) <repeats 3 times>\\)\\)" \
|
|
"print large_4d_array from history"
|
|
gdb_test -nonl "output \$\$2" \
|
|
"\\(\\(\\(\\(1, 2, 3\\) \\(4, 5, 6\\) \\(7, 8, 9\\)\\)\
|
|
\\(\\(10, 11, 12\\) \\(13, 14, 15\\) \\(16, 17, 18\\)\\)\
|
|
\\(\\(19, 20, 21\\) \\(22, 23, 24\\) \\(25, 26, 27\\)\\)\\)\
|
|
\\(\\(\\(28, 29, 30\\) \\(31, 32, 33\\) \\(34, 35, 36\\)\\)\
|
|
\\(\\(37, 38, 39\\) \\(40, 41, 42\\) \\(43, 44, 45\\)\\)\
|
|
\\(\\(46, 47, 48\\) \\(49, 50, <unavailable>\\)\
|
|
\\(<unavailable>, <repeats 3 times>\\)\\)\\)\
|
|
\\(\\(\\(<unavailable>, <repeats 3 times>\\)\
|
|
<repeats 3 times>\\) <repeats 3 times>\\)\\)" \
|
|
"output large_4d_array from history"
|
|
|
|
gdb_test "print \$\$" \
|
|
" = \\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, <unavailable>, <repeats 31 times>\\)" \
|
|
"print large_1d_array from history"
|
|
gdb_test -nonl "output \$\$2" \
|
|
"\\(1, 2, 3, 4, 5, 6, 7, 8, 9,\
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18,\
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27,\
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36,\
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45,\
|
|
46, 47, 48, 49, 50, <unavailable>, <repeats 31 times>\\)" \
|
|
"output large_1d_array from history"
|
|
}
|