# Copyright (C) 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 . # Test GDB's value availability ranges. standard_testfile if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { return -1 } if ![runto_main] then { perror "couldn't run to breakpoint" continue } set target_char_mask [get_valueof "/u" "a.x\[0]" "255" "get target char mask"] set target_char_bit 0 for {set i $target_char_mask} {$i > 0} {set i [expr $i >> 1]} { incr target_char_bit } set target_char_rank -1 for {set i $target_char_bit} {$i > 0} {set i [expr $i >> 1]} { incr target_char_rank } # Verify accesses to original inferior data. gdb_test "print a.a" "\\\$2 = '\\\\000' " gdb_test "print a.a\[-1\]" "\\\$3 = 0 '\\\\000'" gdb_test "print a.a\[1024\]" "\\\$4 = 0 '\\\\000'" # Verify in-range value history accesses. gdb_test "print \$2" "\\\$5 = '\\\\000' " gdb_test "print \$2\[0\]" "\\\$6 = 0 '\\\\000'" gdb_test "print \$2\[1023\]" "\\\$7 = 0 '\\\\000'" # Values outside the array recorded will have not been retrieved. gdb_test "print \$2\[-1\]" "\\\$8 = " gdb_test "print \$2\[1024\]" "\\\$9 = " gdb_test "print \$2\[-1LL << 63 - $target_char_rank\]" \ "\\\$10 = " gdb_test "print \$2\[(1LL << 63 - $target_char_rank) - 1\]" \ "\\\$11 = " # Accesses through pointers in history go straight to the inferior though. gdb_test "print \$2\[0\]@1" "\\\$12 = \"\"" gdb_test "print \$2\[-1\]@1" "\\\$13 = \"\"" gdb_test "print \$2\[1024\]@1" "\\\$14 = \"\"" # Verify out-of-range value history accesses. gdb_test "print \$2\[(-1LL << 63 - $target_char_rank) - 1\]" \ "Integer overflow in data location calculation" gdb_test "print \$2\[(1LL << 63 - $target_char_rank)\]" \ "Integer overflow in data location calculation" gdb_test "print \$2\[-1LL << 63\]" \ "Integer overflow in data location calculation" gdb_test "print \$2\[(1ULL << 63) - 1\]" \ "Integer overflow in data location calculation" # Sanity-check a copy of an unavailable value. gdb_test "print \$11" "\\\$15 = "