aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/value-history-unavailable.exp
blob: b17764e690bf8382f4d2aad53b1c3fda7f1fc37d (plain)
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
# Copyright (C) 2023-2025 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/>.

# Test GDB's value availability ranges.

standard_testfile

if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
    return -1
}

if {![runto_main]} {
    return
}

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' <repeats 1023 times>"
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' <repeats 1023 times>"
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 = <unavailable>"
gdb_test "print \$2\[1024\]" "\\\$9 = <unavailable>"
gdb_test "print \$2\[-1LL << 63 - $target_char_rank\]" \
	"\\\$10 = <unavailable>"
gdb_test "print \$2\[(1LL << 63 - $target_char_rank) - 1\]" \
	"\\\$11 = <unavailable>"

# 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 = <unavailable>"