forked from Imagelibrary/binutils-gdb
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
117 lines
4.0 KiB
Plaintext
117 lines
4.0 KiB
Plaintext
# Copyright 2020-2022 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/> .
|
|
|
|
# Create a slice of an array, then take a slice of that slice.
|
|
|
|
if {[skip_fortran_tests]} { return -1 }
|
|
|
|
standard_testfile ".f90"
|
|
load_lib fortran.exp
|
|
|
|
if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
|
|
{debug f90}]} {
|
|
return -1
|
|
}
|
|
|
|
# Avoid shared lib symbols.
|
|
gdb_test_no_output "set auto-solib-add off"
|
|
|
|
if ![fortran_runto_main] {
|
|
return -1
|
|
}
|
|
|
|
# Avoid libc symbols, in particular the 'array' type.
|
|
gdb_test_no_output "nosharedlibrary"
|
|
|
|
# gdb_breakpoint [gdb_get_line_number "Display Message Breakpoint"]
|
|
gdb_breakpoint [gdb_get_line_number "Stop Here"]
|
|
gdb_breakpoint [gdb_get_line_number "Final Breakpoint"]
|
|
|
|
# We're going to print some reasonably large arrays.
|
|
gdb_test_no_output "set print elements unlimited"
|
|
|
|
gdb_continue_to_breakpoint "Stop Here"
|
|
|
|
# Print a slice, capture the convenience variable name created.
|
|
set cmd "print array (1:10:2, 1:10:2)"
|
|
gdb_test_multiple $cmd $cmd {
|
|
-re "\r\n\\\$(\\d+) = .*\r\n$gdb_prompt $" {
|
|
set varname "\$$expect_out(1,string)"
|
|
}
|
|
}
|
|
|
|
# Now check that we can correctly extract all the elements from this
|
|
# slice.
|
|
for { set j 1 } { $j < 6 } { incr j } {
|
|
for { set i 1 } { $i < 6 } { incr i } {
|
|
set val [expr ((($i - 1) * 2) + (($j - 1) * 20)) + 1]
|
|
gdb_test "print ${varname} ($i,$j)" " = $val"
|
|
}
|
|
}
|
|
|
|
# Now take a slice of the slice.
|
|
gdb_test "print ${varname} (3:5, 3:5)" \
|
|
" = \\(\\(45, 47, 49\\) \\(65, 67, 69\\) \\(85, 87, 89\\)\\)"
|
|
|
|
# Now take a different slice of a slice.
|
|
set cmd "print ${varname} (1:5:2, 1:5:2)"
|
|
gdb_test_multiple $cmd $cmd {
|
|
-re "\r\n\\\$(\\d+) = \\(\\(1, 5, 9\\) \\(41, 45, 49\\) \\(81, 85, 89\\)\\)\r\n$gdb_prompt $" {
|
|
set varname "\$$expect_out(1,string)"
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# Now take a slice from the slice, of a slice!
|
|
set cmd "print ${varname} (1:3:2, 1:3:2)"
|
|
gdb_test_multiple $cmd $cmd {
|
|
-re "\r\n\\\$(\\d+) = \\(\\(1, 9\\) \\(81, 89\\)\\)\r\n$gdb_prompt $" {
|
|
set varname "\$$expect_out(1,string)"
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# And again!
|
|
set cmd "print ${varname} (1:2:2, 1:2:2)"
|
|
gdb_test_multiple $cmd $cmd {
|
|
-re "\r\n\\\$(\\d+) = \\(\\(1\\)\\)\r\n$gdb_prompt $" {
|
|
set varname "\$$expect_out(1,string)"
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
|
|
# Test taking a slice with stride of a string. This isn't actually
|
|
# supported within gfortran (at least), but naturally drops out of how
|
|
# GDB models arrays and strings in a similar way, so we may as well
|
|
# test that this is still working.
|
|
gdb_test "print str (1:26:2)" " = 'acegikmoqsuwy'"
|
|
gdb_test "print str (26:1:-1)" " = 'zyxwvutsrqponmlkjihgfedcba'"
|
|
gdb_test "print str (26:1:-2)" " = 'zxvtrpnljhfdb'"
|
|
|
|
# Now test the memory requirements of taking a slice from an array.
|
|
# The idea is that we shouldn't require more memory to extract a slice
|
|
# than the size of the slice.
|
|
#
|
|
# This will only work if array repacking is turned on, otherwise GDB
|
|
# will create the slice by generating a new type that sits over the
|
|
# existing value in memory.
|
|
gdb_test_no_output "set fortran repack-array-slices on"
|
|
set element_size [get_integer_valueof "sizeof (array (1,1))" "unknown"]
|
|
set slice_size [expr $element_size * 4]
|
|
gdb_test_no_output "set max-value-size $slice_size"
|
|
gdb_test "print array (1:2, 1:2)" "= \\(\\(1, 2\\) \\(11, 12\\)\\)"
|
|
gdb_test "print array (2:3, 2:3)" "= \\(\\(12, 13\\) \\(22, 23\\)\\)"
|
|
gdb_test "print array (2:5:2, 2:5:2)" "= \\(\\(12, 14\\) \\(32, 34\\)\\)"
|