
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>
264 lines
10 KiB
Text
264 lines
10 KiB
Text
# 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/>.
|
|
|
|
load_lib "ada.exp"
|
|
|
|
require allow_ada_tests
|
|
|
|
standard_ada_testfile foo
|
|
|
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable \
|
|
[list debug ]] != "" } {
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${testfile}
|
|
|
|
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
|
|
if {![runto "foo.adb:$bp_location"]} {
|
|
perror "Couldn't run ${testfile}"
|
|
return
|
|
}
|
|
|
|
with_test_prefix "with standard max-value size" {
|
|
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\\)"
|
|
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\\)"
|
|
gdb_test "print Large_3d_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\\)\\)\\)"
|
|
gdb_test -nonl "output Large_3d_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\\)\\)\\)"
|
|
}
|
|
|
|
# Set the max-value-size so we can only print 33 elements.
|
|
set elements 33
|
|
set elem_size [get_valueof "/d" "(Large_1d_Array(1)'Size + 7) / 8" "*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_1d_Array" \
|
|
"value of type `.*' requires $decimal bytes,\
|
|
which is more than max-value-size"
|
|
gdb_test "output Large_1d_Array" \
|
|
"value of type `.*' requires $decimal bytes,\
|
|
which is more than max-value-size"
|
|
gdb_test "print Large_3d_Array" \
|
|
"value of type `.*' requires $decimal bytes,\
|
|
which is more than max-value-size"
|
|
gdb_test "output Large_3d_Array" \
|
|
"value of type `.*' requires $decimal bytes,\
|
|
which is more than max-value-size"
|
|
}
|
|
|
|
with_test_prefix "with reduced print -elements flag" {
|
|
gdb_test "print -elements 2 -- Large_1d_Array" \
|
|
" = \\(1, 2\\.\\.\\.\\)"
|
|
gdb_test "print -elements 2 -- Large_3d_Array" \
|
|
" = \\(\\(\\(1, 2\\.\\.\\.\\), \\(5, 6\\.\\.\\.\\)\\.\\.\\.\\),\
|
|
\\(\\(17, 18\\.\\.\\.\\),\
|
|
\\(21, 22\\.\\.\\.\\)\\.\\.\\.\\)\\.\\.\\.\\)"
|
|
}
|
|
|
|
gdb_test_no_output "set print elements 2"
|
|
|
|
with_test_prefix "with reduced print elements" {
|
|
gdb_test "print Large_1d_Array" \
|
|
" = \\(1, 2\\.\\.\\.\\)"
|
|
gdb_test -nonl "output Large_1d_Array" \
|
|
"\\(1, 2\\.\\.\\.\\)"
|
|
|
|
gdb_test "print \$" \
|
|
" = \\(1, 2\\.\\.\\.\\)" \
|
|
"print Large_1d_Array from history"
|
|
gdb_test -nonl "output \$\$" \
|
|
"\\(1, 2\\.\\.\\.\\)" \
|
|
"output Large_1d_Array from history"
|
|
|
|
gdb_test "print Large_3d_Array" \
|
|
" = \\(\\(\\(1, 2\\.\\.\\.\\), \\(5, 6\\.\\.\\.\\)\\.\\.\\.\\),\
|
|
\\(\\(17, 18\\.\\.\\.\\),\
|
|
\\(21, 22\\.\\.\\.\\)\\.\\.\\.\\)\\.\\.\\.\\)"
|
|
gdb_test -nonl "output Large_3d_Array" \
|
|
"\\(\\(\\(1, 2\\.\\.\\.\\), \\(5, 6\\.\\.\\.\\)\\.\\.\\.\\),\
|
|
\\(\\(17, 18\\.\\.\\.\\),\
|
|
\\(21, 22\\.\\.\\.\\)\\.\\.\\.\\)\\.\\.\\.\\)"
|
|
|
|
gdb_test "print \$" \
|
|
" = \\(\\(\\(1, 2\\.\\.\\.\\), \\(5, 6\\.\\.\\.\\)\\.\\.\\.\\),\
|
|
\\(\\(17, 18\\.\\.\\.\\),\
|
|
\\(21, 22\\.\\.\\.\\)\\.\\.\\.\\)\\.\\.\\.\\)" \
|
|
"print Large_3d_Array from history"
|
|
gdb_test -nonl "output \$\$" \
|
|
"\\(\\(\\(1, 2\\.\\.\\.\\), \\(5, 6\\.\\.\\.\\)\\.\\.\\.\\),\
|
|
\\(\\(17, 18\\.\\.\\.\\),\
|
|
\\(21, 22\\.\\.\\.\\)\\.\\.\\.\\)\\.\\.\\.\\)" \
|
|
"output Large_3d_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\\.\\.\\.\\)" \
|
|
"print Large_1d_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\\.\\.\\.\\)" \
|
|
"output Large_1d_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(?:, <unavailable>)\{3\}\\)(?:,\
|
|
\\(<unavailable>(?:, <unavailable>)\{3\}\\))\{3\}\\),\
|
|
\\(\\(<unavailable>(?:, <unavailable>)\{3\}\\)(?:,\
|
|
\\(<unavailable>(?:, <unavailable>)\{3\}\\))\{3\}\\)\\)" \
|
|
"print Large_3d_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(?:, <unavailable>)\{3\}\\)(?:,\
|
|
\\(<unavailable>(?:, <unavailable>)\{3\}\\))\{3\}\\),\
|
|
\\(\\(<unavailable>(?:, <unavailable>)\{3\}\\)(?:,\
|
|
\\(<unavailable>(?:, <unavailable>)\{3\}\\))\{3\}\\)\\)" \
|
|
"output Large_3d_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,\
|
|
<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,\
|
|
<unavailable> <repeats 31 times>\\)" \
|
|
"output Large_1d_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, <unavailable> <repeats 3 times>\\),\
|
|
\\(<unavailable> <repeats 4 times>\\) <repeats 3 times>\\),\
|
|
\\(\\(<unavailable> <repeats 4 times>\\)\
|
|
<repeats 4 times>\\)\\)" \
|
|
"print Large_3d_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, <unavailable> <repeats 3 times>\\),\
|
|
\\(<unavailable> <repeats 4 times>\\) <repeats 3 times>\\),\
|
|
\\(\\(<unavailable> <repeats 4 times>\\) <repeats 4 times>\\)\\)" \
|
|
"output Large_3d_Array from history"
|
|
|
|
gdb_test "print \$\[2\]" \
|
|
" = \\(\\(17, 18, 19, 20\\), \\(21, 22, 23, 24\\),\
|
|
\\(25, 26, 27, 28\\), \\(29, 30, 31, 32\\)\\)" \
|
|
"print available Large_3d_Array row from history"
|
|
gdb_test -nonl "output \$\$\[2\]" \
|
|
"\\(\\(17, 18, 19, 20\\), \\(21, 22, 23, 24\\),\
|
|
\\(25, 26, 27, 28\\), \\(29, 30, 31, 32\\)\\)" \
|
|
"output available Large_3d_Array row from history"
|
|
|
|
gdb_test "print \$\$\[3\]" \
|
|
" = \\(\\(33, <unavailable> <repeats 3 times>\\),\
|
|
\\(<unavailable> <repeats 4 times>\\) <repeats 3 times>\\)" \
|
|
"print partially available Large_3d_Array row from history"
|
|
gdb_test -nonl "output \$\$2\[3\]" \
|
|
"\\(\\(33, <unavailable> <repeats 3 times>\\),\
|
|
\\(<unavailable> <repeats 4 times>\\) <repeats 3 times>\\)" \
|
|
"output partially available Large_3d_Array row from history"
|
|
|
|
# These go straigth to the inferior.
|
|
gdb_test "print \$\$2(3)" \
|
|
" = \\(\\(33, 34, 35, 36\\), \\(37, 38, 39, 40\\),\
|
|
\\(41, 42, 43, 44\\), \\(45, 46, 47, 48\\)\\)" \
|
|
"print partially available Large_3d_Array row bypassing history"
|
|
gdb_test -nonl "output \$\$3(3)" \
|
|
"\\(\\(33, 34, 35, 36\\), \\(37, 38, 39, 40\\),\
|
|
\\(41, 42, 43, 44\\), \\(45, 46, 47, 48\\)\\)" \
|
|
"output partially available Large_3d_Array row bypassing history"
|
|
|
|
gdb_test "print \$\$3\[4\]" \
|
|
" = <unavailable>" \
|
|
"print unavailable Large_3d_Array row from history"
|
|
gdb_test -nonl "output \$\$4\[4\]" \
|
|
"<unavailable>" \
|
|
"output unavailable Large_3d_Array row from history"
|
|
|
|
gdb_test "print \$\$4\[3\]\[1\]\[1\]" \
|
|
" = 33" \
|
|
"print available Large_3d_Array element from history"
|
|
gdb_test -nonl "output \$\$5\[3\]\[1\]\[1\]" \
|
|
"33" \
|
|
"output available Large_3d_Array element from history"
|
|
|
|
gdb_test "print \$\$5\[3\]\[1\]\[2\]" \
|
|
" = <unavailable>" \
|
|
"print unavailable Large_3d_Array element from history"
|
|
gdb_test -nonl "output \$\$6\[3\]\[1\]\[2\]" \
|
|
"<unavailable>" \
|
|
"output unavailable Large_3d_Array element from history"
|
|
|
|
gdb_test "print \$\$6\[3\]\[1\]\[1\] + \$\$6\[3\]\[1\]\[2\]" \
|
|
"value is not available" \
|
|
"print expression referring unavailable element from history"
|
|
gdb_test "output \$\$6\[3\]\[1\]\[1\] + \$\$6\[3\]\[1\]\[2\]" \
|
|
"value is not available" \
|
|
"output expression referring unavailable element from history"
|
|
}
|