1*b725ae77Skettenis# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000 2*b725ae77Skettenis# Free Software Foundation, Inc. 3e93f7393Sniklas 4e93f7393Sniklas# This program is free software; you can redistribute it and/or modify 5e93f7393Sniklas# it under the terms of the GNU General Public License as published by 6e93f7393Sniklas# the Free Software Foundation; either version 2 of the License, or 7e93f7393Sniklas# (at your option) any later version. 8e93f7393Sniklas# 9e93f7393Sniklas# This program is distributed in the hope that it will be useful, 10e93f7393Sniklas# but WITHOUT ANY WARRANTY; without even the implied warranty of 11e93f7393Sniklas# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12e93f7393Sniklas# GNU General Public License for more details. 13e93f7393Sniklas# 14e93f7393Sniklas# You should have received a copy of the GNU General Public License 15e93f7393Sniklas# along with this program; if not, write to the Free Software 16*b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17e93f7393Sniklas 18e93f7393Sniklas# Please email any bugs, comments, and/or additions to this file to: 19e93f7393Sniklas# bug-gdb@prep.ai.mit.edu 20e93f7393Sniklas 21e93f7393Sniklas# This file was written by Fred Fish. (fnf@cygnus.com) 22e93f7393Sniklas 23e93f7393Sniklasif $tracelevel then { 24e93f7393Sniklas strace $tracelevel 25e93f7393Sniklas} 26e93f7393Sniklas 27e93f7393Sniklasset prms_id 0 28e93f7393Sniklasset bug_id 0 29e93f7393Sniklas 30e93f7393Sniklasset testfile "watchpoint" 31e93f7393Sniklasset srcfile ${testfile}.c 32e93f7393Sniklasset binfile ${objdir}/${subdir}/${testfile} 33*b725ae77Skettenis 34*b725ae77Skettenisset wp_set 1 35*b725ae77Skettenis 36*b725ae77Skettenisif [get_compiler_info ${binfile}] { 37e93f7393Sniklas return -1 38e93f7393Sniklas} 39e93f7393Sniklas 40*b725ae77Skettenisif { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 41*b725ae77Skettenis gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 42*b725ae77Skettenis} 43*b725ae77Skettenis 44e93f7393Sniklas# Prepare for watchpoint tests by setting up two breakpoints and one 45e93f7393Sniklas# watchpoint. 46e93f7393Sniklas# 47e93f7393Sniklas# We use breakpoints at marker functions to get past all the startup code, 48e93f7393Sniklas# so we can get to the watchpoints in a reasonable amount of time from a 49e93f7393Sniklas# known starting point. 50e93f7393Sniklas# 51e93f7393Sniklas# For simplicity, so we always know how to reference specific breakpoints or 52e93f7393Sniklas# watchpoints by number, we expect a particular ordering and numbering of 53e93f7393Sniklas# each in the combined breakpoint/watchpoint table, as follows: 54e93f7393Sniklas# 55e93f7393Sniklas# Number What Where 56e93f7393Sniklas# 1 Breakpoint marker1() 57e93f7393Sniklas# 2 Breakpoint marker2() 58e93f7393Sniklas# 3 Watchpoint ival3 59e93f7393Sniklas 60e93f7393Sniklasproc initialize {} { 61*b725ae77Skettenis global gdb_prompt 62e93f7393Sniklas global hex 63e93f7393Sniklas global decimal 64e93f7393Sniklas global srcfile 65*b725ae77Skettenis global wp_set 66e93f7393Sniklas 67*b725ae77Skettenis # Disable hardware watchpoints if necessary. 68*b725ae77Skettenis if [target_info exists gdb,no_hardware_watchpoints] { 69*b725ae77Skettenis gdb_test "set can-use-hw-watchpoints 0" "" "" 70e93f7393Sniklas } 71e93f7393Sniklas 72*b725ae77Skettenis if [gdb_test "break marker1" "Breakpoint 1 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker1" ] { 73*b725ae77Skettenis return 0; 74e93f7393Sniklas } 75e93f7393Sniklas 76*b725ae77Skettenis 77*b725ae77Skettenis if [gdb_test "break marker2" "Breakpoint 2 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker2" ] { 78*b725ae77Skettenis return 0; 79e93f7393Sniklas } 80e93f7393Sniklas 81*b725ae77Skettenis 82*b725ae77Skettenis if [gdb_test "info break" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*" "info break in watchpoint.exp" ] { 83*b725ae77Skettenis return 0; 84*b725ae77Skettenis } 85*b725ae77Skettenis 86*b725ae77Skettenis 87*b725ae77Skettenis # ??rehrauer: To fix DTS #CHFts23014, in which setting a watchpoint 88*b725ae77Skettenis # before running can cause the inferior to croak on HP-UX 11.0 for 89*b725ae77Skettenis # reasons yet unknown, we've disabled the ability to set watches 90*b725ae77Skettenis # without a running inferior. Verify the restriction. 91*b725ae77Skettenis # 92*b725ae77Skettenis send_gdb "watch ival3\n" 93*b725ae77Skettenis gdb_expect { 94*b725ae77Skettenis -re ".*\[Ww\]atchpoint 3: ival3.*$gdb_prompt $" { 95e93f7393Sniklas pass "set watchpoint on ival3" 96e93f7393Sniklas } 97*b725ae77Skettenis -re "warning: can't do that without a running program; try \"break main\", \"run\" first.*$gdb_prompt $" { 98*b725ae77Skettenis pass "set watchpoint on ival3" 99*b725ae77Skettenis set wp_set 0 100*b725ae77Skettenis return 1 101*b725ae77Skettenis } 102*b725ae77Skettenis timeout { 103*b725ae77Skettenis fail "(timeout) set watchpoint on ival3" 104*b725ae77Skettenis return 0 105*b725ae77Skettenis } 106e93f7393Sniklas } 107e93f7393Sniklas 108e93f7393Sniklas # "info watch" is the same as "info break" 109e93f7393Sniklas 110*b725ae77Skettenis if [gdb_test "info watch" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*\r\n3\[ \]*.*watchpoint.*ival3" "watchpoint found in watchpoint/breakpoint table" ] { 111*b725ae77Skettenis return 0; 112e93f7393Sniklas } 113*b725ae77Skettenis 114e93f7393Sniklas 115e93f7393Sniklas # After installing the watchpoint, we disable it until we are ready 116e93f7393Sniklas # to use it. This allows the test program to run at full speed until 117e93f7393Sniklas # we get to the first marker function. 118e93f7393Sniklas 119*b725ae77Skettenis if [gdb_test "disable 3" "disable 3\[\r\n\]+" "disable watchpoint" ] { 120*b725ae77Skettenis return 0; 121e93f7393Sniklas } 122e93f7393Sniklas 123*b725ae77Skettenis 124e93f7393Sniklas return 1 125e93f7393Sniklas} 126e93f7393Sniklas 127e93f7393Sniklas# 128e93f7393Sniklas# Test simple watchpoint. 129e93f7393Sniklas# 130e93f7393Sniklas 131e93f7393Sniklasproc test_simple_watchpoint {} { 132*b725ae77Skettenis global gdb_prompt 133e93f7393Sniklas global hex 134e93f7393Sniklas global decimal 135*b725ae77Skettenis global wp_set 136e93f7393Sniklas 137e93f7393Sniklas # Ensure that the watchpoint is disabled when we startup. 138e93f7393Sniklas 139*b725ae77Skettenis if { $wp_set } { 140*b725ae77Skettenis if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_simple_watchpoint" ] { 141*b725ae77Skettenis return 0; 142e93f7393Sniklas } 143e93f7393Sniklas } 144e93f7393Sniklas 145*b725ae77Skettenis 146e93f7393Sniklas # Run until we get to the first marker function. 147e93f7393Sniklas 148e93f7393Sniklas gdb_run_cmd 149*b725ae77Skettenis set timeout 600 150*b725ae77Skettenis gdb_expect { 151*b725ae77Skettenis -re "Breakpoint 1, marker1 .*$gdb_prompt $" { 152e93f7393Sniklas pass "run to marker1 in test_simple_watchpoint" 153e93f7393Sniklas } 154*b725ae77Skettenis -re ".*$gdb_prompt $" { 155e93f7393Sniklas fail "run to marker1 in test_simple_watchpoint" 156e93f7393Sniklas return 157e93f7393Sniklas } 158e93f7393Sniklas timeout { 159e93f7393Sniklas fail "run to marker1 in test_simple_watchpoint (timeout)" 160e93f7393Sniklas return 161e93f7393Sniklas } 162e93f7393Sniklas } 163e93f7393Sniklas 164*b725ae77Skettenis if { !$wp_set } { 165*b725ae77Skettenis # ??rehrauer: To fix DTS #CHFts23014, in which setting a watchpoint 166*b725ae77Skettenis # before running can cause the inferior to croak on HP-UX 11.0 167*b725ae77Skettenis # for reasons yet unknown, we've disabled the ability to set 168*b725ae77Skettenis # watches without a running inferior. The following testpoints used 169*b725ae77Skettenis # to be in [initialize]. 170*b725ae77Skettenis # 171*b725ae77Skettenis send_gdb "watch ival3\n" 172*b725ae77Skettenis gdb_expect { 173*b725ae77Skettenis -re ".*\[Ww\]atchpoint 3: ival3\r\n$gdb_prompt $" { 174*b725ae77Skettenis pass "set watchpoint on ival3" 175*b725ae77Skettenis } 176*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "set watchpoint on ival3" } 177*b725ae77Skettenis timeout { fail "set watchpoint on ival3 (timeout)" } 178*b725ae77Skettenis } 179*b725ae77Skettenis 180*b725ae77Skettenis set wp_set 1 181*b725ae77Skettenis 182*b725ae77Skettenis # "info watch" is the same as "info break" 183*b725ae77Skettenis 184*b725ae77Skettenis send_gdb "info watch\n" 185*b725ae77Skettenis gdb_expect { 186*b725ae77Skettenis -re "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*\r\n3\[ \]*.*watchpoint.*ival3\r\n$gdb_prompt $" { 187*b725ae77Skettenis pass "watchpoint found in watchpoint/breakpoint table" 188*b725ae77Skettenis } 189*b725ae77Skettenis -re ".*$gdb_prompt $" { 190*b725ae77Skettenis fail "watchpoint found in watchpoint/breakpoint table" 191*b725ae77Skettenis } 192*b725ae77Skettenis timeout { 193*b725ae77Skettenis fail "watchpoint found in watchpoint/breakpoint table" 194*b725ae77Skettenis } 195*b725ae77Skettenis } 196*b725ae77Skettenis 197*b725ae77Skettenis # After installing the watchpoint, we disable it until we are ready 198*b725ae77Skettenis # to use it. This allows the test program to run at full speed until 199*b725ae77Skettenis # we get to the first marker function. 200*b725ae77Skettenis 201*b725ae77Skettenis send_gdb "disable 3\n" 202*b725ae77Skettenis gdb_expect { 203*b725ae77Skettenis -re "disable 3\[\r\n\]+$gdb_prompt $" { pass "disable watchpoint" } 204*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "disable watchpoint" } 205*b725ae77Skettenis timeout { fail "disable watchpoint (timeout)" } 206*b725ae77Skettenis } 207*b725ae77Skettenis } 208*b725ae77Skettenis 209e93f7393Sniklas # After reaching the marker function, enable the watchpoint. 210e93f7393Sniklas 211*b725ae77Skettenis if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "enable watchpoint" ] { 212*b725ae77Skettenis return ; 213e93f7393Sniklas } 214e93f7393Sniklas 215*b725ae77Skettenis 216e93f7393Sniklas gdb_test "break func1" "Breakpoint.*at.*" 217e93f7393Sniklas gdb_test "set \$func1_breakpoint_number = \$bpnum" "" 218e93f7393Sniklas 219e93f7393Sniklas gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, func1.*" \ 220e93f7393Sniklas "continue to breakpoint at func1" 221e93f7393Sniklas 222e93f7393Sniklas # Continue until the first change, from -1 to 0 223e93f7393Sniklas 224*b725ae77Skettenis send_gdb "cont\n" 225*b725ae77Skettenis gdb_expect { 226*b725ae77Skettenis -re "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count; ival4 = count;.*$gdb_prompt $" { 227e93f7393Sniklas pass "watchpoint hit, first time" 228e93f7393Sniklas } 229*b725ae77Skettenis -re "Continuing.*Breakpoint.*func1.*$gdb_prompt $" { 230e93f7393Sniklas setup_xfail "m68*-*-*" 2597 231e93f7393Sniklas fail "thought it hit breakpoint at func1 twice" 232e93f7393Sniklas gdb_test "delete \$func1_breakpoint_number" "" 233e93f7393Sniklas gdb_test "continue" "\ 234e93f7393SniklasContinuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count;" \ 235e93f7393Sniklas "watchpoint hit, first time" 236e93f7393Sniklas } 237*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "watchpoint hit, first time" ; return } 238e93f7393Sniklas timeout { fail "watchpoint hit, first time (timeout)" ; return } 239e93f7393Sniklas eof { fail "watchpoint hit, first time (eof)" ; return } 240e93f7393Sniklas } 241e93f7393Sniklas 242*b725ae77Skettenis # Check that the hit count is reported correctly 243*b725ae77Skettenis gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 1 time.*" "Watchpoint hit count is 1" 244*b725ae77Skettenis 245e93f7393Sniklas gdb_test "delete \$func1_breakpoint_number" "" 246e93f7393Sniklas 247e93f7393Sniklas # Continue until the next change, from 0 to 1. 248e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 0.*New value = 1.*ival3 = count; ival4 = count;.*" "watchpoint hit, second time" 249e93f7393Sniklas 250*b725ae77Skettenis # Check that the hit count is reported correctly 251*b725ae77Skettenis gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 2 times.*" "Watchpoint hit count is 2" 252*b725ae77Skettenis 253e93f7393Sniklas # Continue until the next change, from 1 to 2. 254e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 1.*New value = 2.*ival3 = count; ival4 = count;.*" "watchpoint hit, third time" 255e93f7393Sniklas 256*b725ae77Skettenis # Check that the hit count is reported correctly 257*b725ae77Skettenis gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 3 times.*" "Watchpoint hit count is 3" 258*b725ae77Skettenis 259e93f7393Sniklas # Continue until the next change, from 2 to 3. 260e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 2.*New value = 3.*ival3 = count; ival4 = count;.*" "watchpoint hit, fourth time" 261e93f7393Sniklas 262*b725ae77Skettenis # Check that the hit count is reported correctly 263*b725ae77Skettenis gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 4 times.*" "Watchpoint hit count is 4" 264*b725ae77Skettenis 265e93f7393Sniklas # Continue until the next change, from 3 to 4. 266e93f7393Sniklas # Note that this one is outside the loop. 267e93f7393Sniklas 268e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 3.*New value = 4.*ival3 = count; ival4 = count;.*" "watchpoint hit, fifth time" 269e93f7393Sniklas 270*b725ae77Skettenis # Check that the hit count is reported correctly 271*b725ae77Skettenis gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 5 times.*" "Watchpoint hit count is 5" 272*b725ae77Skettenis 273e93f7393Sniklas # Continue until we hit the finishing marker function. 274e93f7393Sniklas # Make sure we hit no more watchpoints. 275e93f7393Sniklas 276e93f7393Sniklas gdb_test "cont" "Continuing.*Breakpoint.*marker2 \(\).*" \ 277e93f7393Sniklas "continue to marker2" 278e93f7393Sniklas 279e93f7393Sniklas # Disable the watchpoint so we run at full speed until we exit. 280e93f7393Sniklas 281*b725ae77Skettenis if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "watchpoint disabled" ] { 282*b725ae77Skettenis return ; 283e93f7393Sniklas } 284e93f7393Sniklas 285*b725ae77Skettenis 286e93f7393Sniklas # Run until process exits. 287e93f7393Sniklas 288*b725ae77Skettenis if [target_info exists gdb,noresults] { return } 289e93f7393Sniklas 290*b725ae77Skettenis gdb_continue_to_end "continue to exit in test_simple_watchpoint" 291e93f7393Sniklas} 292e93f7393Sniklas 293e93f7393Sniklas# Test disabling watchpoints. 294e93f7393Sniklas 295e93f7393Sniklasproc test_disabling_watchpoints {} { 296*b725ae77Skettenis global gdb_prompt 297e93f7393Sniklas global binfile 298e93f7393Sniklas global srcfile 299e93f7393Sniklas global decimal 300e93f7393Sniklas global hex 301*b725ae77Skettenis 302*b725ae77Skettenis # "info watch" is the same as "info break" 303*b725ae77Skettenis gdb_test "info watch" "\[0-9\]+\[ \]*breakpoint.*marker1.*\r\n\[0-9\]+\[ \]*breakpoint.*marker2.*\r\n\[0-9]+\[ \]*.*watchpoint.*ival3\r\n\.*\[0-9\]+ times.*" "watchpoints found in watchpoint/breakpoint table" 304e93f7393Sniklas 305e93f7393Sniklas # Ensure that the watchpoint is disabled when we startup. 306e93f7393Sniklas 307*b725ae77Skettenis if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_disabling_watchpoints" ] { 308*b725ae77Skettenis return 0; 309e93f7393Sniklas } 310*b725ae77Skettenis 311e93f7393Sniklas 312e93f7393Sniklas # Run until we get to the first marker function. 313e93f7393Sniklas 314e93f7393Sniklas gdb_run_cmd 315*b725ae77Skettenis set timeout 600 316*b725ae77Skettenis gdb_expect { 317*b725ae77Skettenis -re "Breakpoint 1, marker1 .*$gdb_prompt $" { 318e93f7393Sniklas pass "run to marker1 in test_disabling_watchpoints" 319e93f7393Sniklas } 320*b725ae77Skettenis -re ".*$gdb_prompt $" { 321e93f7393Sniklas fail "run to marker1 in test_disabling_watchpoints" 322e93f7393Sniklas return 323e93f7393Sniklas } 324e93f7393Sniklas timeout { 325e93f7393Sniklas fail "run to marker1 in test_disabling_watchpoints (timeout)" 326e93f7393Sniklas return 327e93f7393Sniklas } 328e93f7393Sniklas } 329e93f7393Sniklas 330e93f7393Sniklas # After reaching the marker function, enable the watchpoint. 331e93f7393Sniklas 332*b725ae77Skettenis if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "watchpoint enabled" ] { 333*b725ae77Skettenis return ; 334e93f7393Sniklas } 335e93f7393Sniklas 336*b725ae77Skettenis 337e93f7393Sniklas # Continue until the first change, from -1 to 0 338e93f7393Sniklas # Don't check the old value, because on VxWorks the variable value 339e93f7393Sniklas # will not have been reinitialized. 340e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = .*New value = 0.*ival3 = count; ival4 = count;.*" "watchpoint hit in test_disabling_watchpoints, first time" 341e93f7393Sniklas 342e93f7393Sniklas # Continue until the next change, from 0 to 1. 343e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 0.*New value = 1.*ival3 = count; ival4 = count;.*" "watchpoint hit in test_disabling_watchpoints, second time" 344e93f7393Sniklas 345e93f7393Sniklas # Disable the watchpoint but leave breakpoints 346e93f7393Sniklas 347*b725ae77Skettenis if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint #2 in test_disabling_watchpoints" ] { 348*b725ae77Skettenis return 0; 349e93f7393Sniklas } 350*b725ae77Skettenis 351e93f7393Sniklas 352e93f7393Sniklas # Check watchpoint list, looking for the entry that confirms the 353e93f7393Sniklas # watchpoint is disabled. 354*b725ae77Skettenis gdb_test "info watchpoints" "\[0-9]+\[ \]*.*watchpoint\[ \]*keep\[ \]*n\[ \]*ival3\r\n.*" "watchpoint disabled in table" 355e93f7393Sniklas 356e93f7393Sniklas # Continue until we hit the finishing marker function. 357e93f7393Sniklas # Make sure we hit no more watchpoints. 358e93f7393Sniklas gdb_test "cont" "Continuing.*Breakpoint.*marker2 \\(\\).*" \ 359e93f7393Sniklas "disabled watchpoint skipped" 360e93f7393Sniklas 361*b725ae77Skettenis if [target_info exists gdb,noresults] { return } 362e93f7393Sniklas 363*b725ae77Skettenis gdb_continue_to_end "continue to exit in test_disabling_watchpoints" 364e93f7393Sniklas} 365e93f7393Sniklas 366e93f7393Sniklas# Test stepping and other mundane operations with watchpoints enabled 367e93f7393Sniklasproc test_stepping {} { 368*b725ae77Skettenis global gdb_prompt 369e93f7393Sniklas 370e93f7393Sniklas if [runto marker1] then { 371e93f7393Sniklas gdb_test "watch ival2" ".*\[Ww\]atchpoint \[0-9\]*: ival2" 372e93f7393Sniklas 373e93f7393Sniklas # Well, let's not be too mundane. It should be a *bit* of a challenge 374e93f7393Sniklas gdb_test "break func2 if 0" "Breakpoint.*at.*" 375e93f7393Sniklas gdb_test "p \$func2_breakpoint_number = \$bpnum" " = .*" 376e93f7393Sniklas 377e93f7393Sniklas gdb_test "p func1 ()" "= 73" \ 378e93f7393Sniklas "calling function with watchpoint enabled" 379e93f7393Sniklas 380e93f7393Sniklas # 381e93f7393Sniklas # "finish" brings us back to main. 382e93f7393Sniklas # On some targets (e.g. alpha) gdb will stop from the finish in midline 383e93f7393Sniklas # of the marker1 call. This is due to register restoring code on 384e93f7393Sniklas # the alpha and might be caused by stack adjustment instructions 385e93f7393Sniklas # on other targets. In this case we will step once more. 386e93f7393Sniklas # 387e93f7393Sniklas 388*b725ae77Skettenis send_gdb "finish\n" 389*b725ae77Skettenis gdb_expect { 390*b725ae77Skettenis -re "Run.*exit from.*marker1.* at" { 391e93f7393Sniklas pass "finish from marker1" 392e93f7393Sniklas } 393*b725ae77Skettenis default { fail "finish from marker1 (timeout)" ; return } 394e93f7393Sniklas } 395*b725ae77Skettenis 396*b725ae77Skettenis gdb_expect { 397*b725ae77Skettenis -re "marker1 \\(\\);.*$gdb_prompt $" { 398*b725ae77Skettenis send_gdb "step\n" 399*b725ae77Skettenis exp_continue 400*b725ae77Skettenis } 401*b725ae77Skettenis -re "func1 \\(\\);.*$gdb_prompt $" { 402*b725ae77Skettenis pass "back at main from marker1" 403*b725ae77Skettenis } 404*b725ae77Skettenis -re ".*$gdb_prompt $" { 405*b725ae77Skettenis fail "back at main from marker1" 406*b725ae77Skettenis } 407*b725ae77Skettenis default { fail "back at main from marker1 (timeout)" ; return } 408e93f7393Sniklas } 409e93f7393Sniklas 410e93f7393Sniklas gdb_test "next" "for \\(count = 0.*" "next to `for' in watchpoint.exp" 411e93f7393Sniklas 412e93f7393Sniklas # Now test that "until" works. It's a bit tricky to test 413e93f7393Sniklas # "until", because compilers don't always arrange the code 414e93f7393Sniklas # exactly the same way, and we might get slightly different 415e93f7393Sniklas # sequences of statements. But the following should be true 416e93f7393Sniklas # (if not it is a compiler or a debugger bug): The user who 417e93f7393Sniklas # does "until" at every statement of a loop should end up 418e93f7393Sniklas # stepping through the loop once, and the debugger should not 419e93f7393Sniklas # stop for any of the remaining iterations. 420e93f7393Sniklas 421e93f7393Sniklas gdb_test "until" "ival1 = count.*" "until to ival1 assignment" 422e93f7393Sniklas gdb_test "until" "ival3 = count.*" "until to ival3 assignment" 423*b725ae77Skettenis send_gdb "until\n" 424*b725ae77Skettenis gdb_expect { 425*b725ae77Skettenis -re "(for \\(count = 0|\}).*$gdb_prompt $" { 426e93f7393Sniklas gdb_test "until" "ival1 = count; /. Outside loop ./" \ 427e93f7393Sniklas "until out of loop" 428e93f7393Sniklas } 429*b725ae77Skettenis -re "ival1 = count; /. Outside loop ./.*$gdb_prompt $" { 430e93f7393Sniklas pass "until out of loop" 431e93f7393Sniklas } 432*b725ae77Skettenis -re ".*$gdb_prompt $" { 433e93f7393Sniklas fail "until out of loop" 434e93f7393Sniklas } 435*b725ae77Skettenis default { fail "until out of loop (timeout)" ; return } 436e93f7393Sniklas } 437e93f7393Sniklas 438e93f7393Sniklas gdb_test "step" "ival2 = count.*" "step to ival2 assignment" 439e93f7393Sniklas } 440e93f7393Sniklas} 441e93f7393Sniklas 442e93f7393Sniklas# Test stepping and other mundane operations with watchpoints enabled 443e93f7393Sniklasproc test_watchpoint_triggered_in_syscall {} { 444*b725ae77Skettenis global gdb_prompt 445e93f7393Sniklas 446*b725ae77Skettenis # These tests won't work without printf support. 447*b725ae77Skettenis if [gdb_skip_stdio_test "watchpoints triggered in syscall"] { 448*b725ae77Skettenis return; 449e93f7393Sniklas } 450e93f7393Sniklas # Run until we get to the first marker function. 451e93f7393Sniklas set x 0 452e93f7393Sniklas set y 0 453e93f7393Sniklas set testname "Watch buffer passed to read syscall" 454e93f7393Sniklas if [runto marker2] then { 455e93f7393Sniklas gdb_test "watch buf\[0\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[0\\\]" 456e93f7393Sniklas gdb_test "watch buf\[1\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[1\\\]" 457e93f7393Sniklas gdb_test "watch buf\[2\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[2\\\]" 458e93f7393Sniklas gdb_test "watch buf\[3\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[3\\\]" 459e93f7393Sniklas gdb_test "watch buf\[4\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[4\\\]" 460e93f7393Sniklas gdb_test "break marker4" ".*Breakpoint.*" 461e93f7393Sniklas 462e93f7393Sniklas gdb_test "set doread = 1" "" 463e93f7393Sniklas 464*b725ae77Skettenis # If we send_gdb "123\n" before gdb has switched the tty, then it goes 465e93f7393Sniklas # to gdb, not the inferior, and we lose. So that is why we have 466e93f7393Sniklas # watchpoint.c prompt us, so we can wait for that prompt. 467*b725ae77Skettenis send_gdb "continue\n"; 468*b725ae77Skettenis gdb_expect { 469e93f7393Sniklas -re "Continuing\\.\r\ntype stuff for buf now:" { 470e93f7393Sniklas pass "continue to read" 471e93f7393Sniklas } 472*b725ae77Skettenis default { 473*b725ae77Skettenis fail "continue to read"; 474*b725ae77Skettenis return ; 475e93f7393Sniklas } 476*b725ae77Skettenis } 477*b725ae77Skettenis 478*b725ae77Skettenis send_gdb "123\n" 479*b725ae77Skettenis gdb_expect { 480e93f7393Sniklas -re ".*\[Ww\]atchpoint.*buf\\\[0\\\].*Old value = 0.*New value = 49\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } 481e93f7393Sniklas -re ".*\[Ww\]atchpoint.*buf\\\[1\\\].*Old value = 0.*New value = 50\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } 482e93f7393Sniklas -re ".*\[Ww\]atchpoint.*buf\\\[2\\\].*Old value = 0.*New value = 51\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } 483e93f7393Sniklas -re ".*\[Ww\]atchpoint.*buf\\\[3\\\].*Old value = 0.*New value = 10\[^\n\]*\n" { set x [expr $x+1] ; exp_continue } 484*b725ae77Skettenis -re ".*$gdb_prompt $" { pass "sent 123" } 485e93f7393Sniklas timeout { fail "sent 123 (timeout)" } 486e93f7393Sniklas } 487e93f7393Sniklas 488e93f7393Sniklas # Examine the values in buf to see how many watchpoints we 489e93f7393Sniklas # should have printed. 490*b725ae77Skettenis send_gdb "print buf\[0\]\n" 491*b725ae77Skettenis gdb_expect { 492*b725ae77Skettenis -re ".*= 49.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[0\]"} 493*b725ae77Skettenis -re ".*= 0.*$gdb_prompt $" { pass "print buf\[0\]"} 494*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "print buf\[0\]"} 495e93f7393Sniklas default { fail "print buf\[0\]"} 496e93f7393Sniklas } 497*b725ae77Skettenis send_gdb "print buf\[1\]\n" 498*b725ae77Skettenis gdb_expect { 499*b725ae77Skettenis -re ".*= 50.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[1\]"} 500*b725ae77Skettenis -re ".*= 0.*$gdb_prompt $" { pass "print buf\[1\]"} 501*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "print buf\[1\]"} 502e93f7393Sniklas default { fail "print buf\[1\]"} 503e93f7393Sniklas } 504*b725ae77Skettenis send_gdb "print buf\[2\]\n" 505*b725ae77Skettenis gdb_expect { 506*b725ae77Skettenis -re ".*= 51.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[2\]"} 507*b725ae77Skettenis -re ".*= 0.*$gdb_prompt $" { pass "print buf\[2\]"} 508*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "print buf\[2\]"} 509e93f7393Sniklas default { fail "print buf\[2\]"} 510e93f7393Sniklas } 511*b725ae77Skettenis send_gdb "print buf\[3\]\n" 512*b725ae77Skettenis gdb_expect { 513*b725ae77Skettenis -re ".*= 10.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[3\]"} 514*b725ae77Skettenis -re ".*= 0.*$gdb_prompt $" { pass "print buf\[3\]"} 515*b725ae77Skettenis -re ".*$gdb_prompt $" { fail "print buf\[3\]" } 516e93f7393Sniklas default { fail "print buf\[3\]" } 517e93f7393Sniklas } 518e93f7393Sniklas 519e93f7393Sniklas # Did we find what we were looking for? If not, flunk it. 520e93f7393Sniklas if [expr $x==$y] then { pass $testname } else { fail "$testname (only triggered $x watchpoints, expected $y)"} 521e93f7393Sniklas 522e93f7393Sniklas # Continue until we hit the finishing marker function. 523e93f7393Sniklas # Make sure we hit no more watchpoints. 524e93f7393Sniklas gdb_test "cont" "Continuing.*Breakpoint.*marker4 \\(\\).*" \ 525e93f7393Sniklas "continue to marker4" 526e93f7393Sniklas 527e93f7393Sniklas # Disable everything so we can finish the program at full speed 528e93f7393Sniklas gdb_test "disable" "" "disable in test_watchpoint_triggered_in_syscall" 529e93f7393Sniklas 530*b725ae77Skettenis if [target_info exists gdb,noresults] { return } 531e93f7393Sniklas 532*b725ae77Skettenis gdb_continue_to_end "continue to exit in test_watchpoint_triggered_in_syscall" 533e93f7393Sniklas } 534e93f7393Sniklas} 535e93f7393Sniklas 536e93f7393Sniklas# Do a simple test of of watching through a pointer when the pointer 537e93f7393Sniklas# itself changes. Should add some more complicated stuff here. 538e93f7393Sniklas 539e93f7393Sniklasproc test_complex_watchpoint {} { 540*b725ae77Skettenis global gdb_prompt 541e93f7393Sniklas 542e93f7393Sniklas if [runto marker4] then { 543e93f7393Sniklas gdb_test "watch ptr1->val" ".*\[Ww\]atchpoint \[0-9\]*: ptr1->val" 544e93f7393Sniklas gdb_test "break marker5" ".*Breakpoint.*" 545e93f7393Sniklas 546e93f7393Sniklas gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ptr1->val.*Old value = 1.*New value = 2.*" "Test complex watchpoint" 547e93f7393Sniklas 548e93f7393Sniklas # Continue until we hit the marker5 function. 549e93f7393Sniklas # Make sure we hit no more watchpoints. 550e93f7393Sniklas 551e93f7393Sniklas gdb_test "cont" "Continuing.*Breakpoint.*marker5 \\(\\).*" \ 552e93f7393Sniklas "did not trigger wrong watchpoint" 553e93f7393Sniklas 554*b725ae77Skettenis # Test watches of things declared locally in a function. 555*b725ae77Skettenis # In particular, test that a watch of stack-based things 556*b725ae77Skettenis # is deleted when the stack-based things go out of scope. 557*b725ae77Skettenis # 558*b725ae77Skettenis gdb_test "disable" "" "disable in test_complex_watchpoint" 559*b725ae77Skettenis gdb_test "break marker6" ".*Breakpoint.*" 560*b725ae77Skettenis gdb_test "cont" "Continuing.*Breakpoint.*marker6 \\(\\).*" \ 561*b725ae77Skettenis "continue to marker6" 562*b725ae77Skettenis gdb_test "break func2" ".*Breakpoint.*" 563*b725ae77Skettenis gdb_test "cont" "Continuing.*func2.*" 564*b725ae77Skettenis 565*b725ae77Skettenis # Test a watch of a single stack-based variable, whose scope 566*b725ae77Skettenis # is the function we're now in. This should auto-delete when 567*b725ae77Skettenis # execution exits the scope of the watchpoint. 568*b725ae77Skettenis # 569*b725ae77Skettenis gdb_test "watch local_a" ".*\[Ww\]atchpoint \[0-9\]*: local_a" "set local watch" 570*b725ae77Skettenis gdb_test "cont" "\[Ww\]atchpoint.*local_a.*" "trigger local watch" 571*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" "self-delete local watch" 572*b725ae77Skettenis 573*b725ae77Skettenis gdb_test "cont" "Continuing.*func2.*" 574*b725ae77Skettenis # We should be in "func2" again now. Test a watch of an 575*b725ae77Skettenis # expression which includes both a stack-based local and 576*b725ae77Skettenis # something whose scope is larger than this invocation 577*b725ae77Skettenis # of "func2". This should also auto-delete. 578*b725ae77Skettenis # 579*b725ae77Skettenis gdb_test "watch local_a + ival5" ".*\[Ww\]atchpoint \[0-9\]*: local_a . ival5" \ 580*b725ae77Skettenis "set partially local watch" 581*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_a . ival5.*" \ 582*b725ae77Skettenis "trigger1 partially local watch" 583*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_a . ival5.*" \ 584*b725ae77Skettenis "trigger2 partially local watch" 585*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" \ 586*b725ae77Skettenis "self-delete partially local watch" 587*b725ae77Skettenis 588*b725ae77Skettenis # We should be in "func2" again now. Test a watch of a 589*b725ae77Skettenis # static (non-stack-based) local. Since this has scope 590*b725ae77Skettenis # across any invocations of "func2", it should not auto- 591*b725ae77Skettenis # delete. 592*b725ae77Skettenis # 593*b725ae77Skettenis gdb_test "cont" "Continuing.*func2.*" 594*b725ae77Skettenis gdb_test "watch static_b" ".*\[Ww\]atchpoint \[0-9\]*: static_b" \ 595*b725ae77Skettenis "set static local watch" 596*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: static_b.*" \ 597*b725ae77Skettenis "trigger static local watch" 598*b725ae77Skettenis gdb_test "cont" "Continuing.*marker6 \\(\\).*" \ 599*b725ae77Skettenis "continue after trigger static local watch" 600*b725ae77Skettenis gdb_test "info break" ".*watchpoint.*static_b.*" \ 601*b725ae77Skettenis "static local watch did not self-delete" 602*b725ae77Skettenis 603*b725ae77Skettenis # We should be in "recurser" now. Test a watch of a stack- 604*b725ae77Skettenis # based local. Symbols mentioned in a watchpoint are bound 605*b725ae77Skettenis # at watchpoint-creation. Thus, a watch of a stack-based 606*b725ae77Skettenis # local to a recursing function should be bound only to that 607*b725ae77Skettenis # one invocation, and should not trigger for other invocations. 608*b725ae77Skettenis # 609*b725ae77Skettenis gdb_test "tbreak recurser" ".*Breakpoint.*" 610*b725ae77Skettenis gdb_test "cont" "Continuing.*recurser.*" 611*b725ae77Skettenis gdb_test "watch local_x" ".*\[Ww\]atchpoint \[0-9\]*: local_x" \ 612*b725ae77Skettenis "set local watch in recursive call" 613*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_x.*New value = 2.*" \ 614*b725ae77Skettenis "trigger local watch in recursive call" 615*b725ae77Skettenis gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" \ 616*b725ae77Skettenis "self-delete local watch in recursive call" 617*b725ae77Skettenis 618e93f7393Sniklas # Disable everything so we can finish the program at full speed 619e93f7393Sniklas gdb_test "disable" "" "disable in test_complex_watchpoint" 620e93f7393Sniklas 621*b725ae77Skettenis if [target_info exists gdb,noresults] { return } 622e93f7393Sniklas 623*b725ae77Skettenis gdb_continue_to_end "continue to exit in test_complex_watchpoint" 624*b725ae77Skettenis } 625*b725ae77Skettenis} 626*b725ae77Skettenis 627*b725ae77Skettenisproc test_watchpoint_and_breakpoint {} { 628*b725ae77Skettenis global gdb_prompt 629*b725ae77Skettenis 630*b725ae77Skettenis # This is a test for PR gdb/38, which involves setting a 631*b725ae77Skettenis # watchpoint right after you've reached a breakpoint. 632*b725ae77Skettenis 633*b725ae77Skettenis if [runto func3] then { 634*b725ae77Skettenis gdb_breakpoint [gdb_get_line_number "second x assignment"] 635*b725ae77Skettenis gdb_continue_to_breakpoint "second x assignment" 636*b725ae77Skettenis gdb_test "watch x" ".*atchpoint \[0-9\]+: x" 637*b725ae77Skettenis gdb_test_multiple "next" "next after watch x" { 638*b725ae77Skettenis -re ".*atchpoint \[0-9\]+: x\r\n\r\nOld value = 0\r\nNew value = 1\r\n.*$gdb_prompt $" { 639*b725ae77Skettenis pass "next after watch x" 640*b725ae77Skettenis } 641*b725ae77Skettenis -re "\[0-9\]+\[\t \]+y = 1;\r\n$gdb_prompt $" { 642*b725ae77Skettenis kfail "gdb/38" "next after watch x" 643*b725ae77Skettenis } 644*b725ae77Skettenis } 645e93f7393Sniklas } 646e93f7393Sniklas} 647e93f7393Sniklas 648e93f7393Sniklas# Start with a fresh gdb. 649e93f7393Sniklas 650e93f7393Sniklasgdb_exit 651e93f7393Sniklasgdb_start 652e93f7393Sniklasgdb_reinitialize_dir $srcdir/$subdir 653e93f7393Sniklasgdb_load $binfile 654*b725ae77Skettenisset prev_timeout $timeout 655*b725ae77Skettenisset timeout 600 656*b725ae77Skettenisverbose "Timeout now 600 sec.\n" 657e93f7393Sniklas 658e93f7393Sniklasif [initialize] then { 659e93f7393Sniklas 660e93f7393Sniklas test_simple_watchpoint 661e93f7393Sniklas 662e93f7393Sniklas # The IDT/sim monitor only has 8 (!) open files, of which it uses 663e93f7393Sniklas # 4 (!). So we have to make sure one program exits before 664e93f7393Sniklas # starting another one. 665e93f7393Sniklas if [istarget "mips-idt-*"] then { 666e93f7393Sniklas gdb_exit 667e93f7393Sniklas gdb_start 668e93f7393Sniklas gdb_reinitialize_dir $srcdir/$subdir 669e93f7393Sniklas gdb_load $binfile 670e93f7393Sniklas initialize 671e93f7393Sniklas } 672e93f7393Sniklas 673e93f7393Sniklas test_disabling_watchpoints 674e93f7393Sniklas 675e93f7393Sniklas # See above. 676e93f7393Sniklas if [istarget "mips-idt-*"] then { 677e93f7393Sniklas gdb_exit 678e93f7393Sniklas gdb_start 679e93f7393Sniklas gdb_reinitialize_dir $srcdir/$subdir 680e93f7393Sniklas gdb_load $binfile 681e93f7393Sniklas initialize 682e93f7393Sniklas } 683e93f7393Sniklas 684*b725ae77Skettenis if ![target_info exists gdb,cannot_call_functions] { 685e93f7393Sniklas test_stepping 686e93f7393Sniklas 687e93f7393Sniklas # See above. 688e93f7393Sniklas if [istarget "mips-idt-*"] then { 689e93f7393Sniklas gdb_exit 690e93f7393Sniklas gdb_start 691e93f7393Sniklas gdb_reinitialize_dir $srcdir/$subdir 692e93f7393Sniklas gdb_load $binfile 693e93f7393Sniklas initialize 694e93f7393Sniklas } 695*b725ae77Skettenis } 696e93f7393Sniklas 697e93f7393Sniklas # Only enabled for some targets merely because it has not been tested 698e93f7393Sniklas # elsewhere. 699e93f7393Sniklas # On sparc-sun-sunos4.1.3, GDB was running all the way to the marker4 700e93f7393Sniklas # breakpoint before stopping for the watchpoint. I don't know why. 701e93f7393Sniklas if {[istarget "hppa*-*-*"]} then { 702e93f7393Sniklas test_watchpoint_triggered_in_syscall 703e93f7393Sniklas } 704e93f7393Sniklas 705e93f7393Sniklas # See above. 706e93f7393Sniklas if [istarget "mips-idt-*"] then { 707e93f7393Sniklas gdb_exit 708e93f7393Sniklas gdb_start 709e93f7393Sniklas gdb_reinitialize_dir $srcdir/$subdir 710e93f7393Sniklas gdb_load $binfile 711e93f7393Sniklas initialize 712e93f7393Sniklas } 713e93f7393Sniklas 714e93f7393Sniklas # Only enabled for some targets merely because it has not been tested 715e93f7393Sniklas # elsewhere. 716*b725ae77Skettenis if {[istarget "hppa*-*-*"] || \ 717*b725ae77Skettenis [istarget "sparc*-*-sunos*"] || \ 718*b725ae77Skettenis [istarget "m32r-*-*"]} then { 719e93f7393Sniklas test_complex_watchpoint 720e93f7393Sniklas } 721*b725ae77Skettenis 722*b725ae77Skettenis # Verify that a user can force GDB to use "slow" watchpoints. 723*b725ae77Skettenis # (This proves rather little on kernels that don't support 724*b725ae77Skettenis # fast watchpoints, but still...) 725*b725ae77Skettenis # 726*b725ae77Skettenis if ![runto_main] then { fail "watch tests suppressed" } 727*b725ae77Skettenis 728*b725ae77Skettenis send_gdb "set can-use-hw-watchpoints 0\n" 729*b725ae77Skettenis gdb_expect { 730*b725ae77Skettenis -re "$gdb_prompt $"\ 731*b725ae77Skettenis {pass "disable fast watches"} 732*b725ae77Skettenis timeout {fail "(timeout) disable fast watches"} 733e93f7393Sniklas } 734*b725ae77Skettenis send_gdb "show can-use-hw-watchpoints\n" 735*b725ae77Skettenis gdb_expect { 736*b725ae77Skettenis -re "Debugger's willingness to use watchpoint hardware is 0.*$gdb_prompt $"\ 737*b725ae77Skettenis {pass "show disable fast watches"} 738*b725ae77Skettenis -re "$gdb_prompt $"\ 739*b725ae77Skettenis {fail "show disable fast watches"} 740*b725ae77Skettenis timeout {fail "(timeout) show disable fast watches"} 741*b725ae77Skettenis } 742*b725ae77Skettenis send_gdb "watch ival3 if count > 1\n" 743*b725ae77Skettenis gdb_expect { 744*b725ae77Skettenis -re "Watchpoint \[0-9\]*: ival3.*$gdb_prompt $"\ 745*b725ae77Skettenis {pass "set slow conditional watch"} 746*b725ae77Skettenis -re "$gdb_prompt $"\ 747*b725ae77Skettenis {fail "set slow conditional watch"} 748*b725ae77Skettenis timeout {fail "(timeout) set slow conditional watch"} 749*b725ae77Skettenis } 750*b725ae77Skettenis send_gdb "continue\n" 751*b725ae77Skettenis gdb_expect { 752*b725ae77Skettenis -re "Watchpoint \[0-9\]*: ival3.*Old value = 1.*New value = 2.*$gdb_prompt $"\ 753*b725ae77Skettenis {pass "trigger slow conditional watch"} 754*b725ae77Skettenis -re "$gdb_prompt $"\ 755*b725ae77Skettenis {fail "trigger slow conditional watch"} 756*b725ae77Skettenis timeout {fail "(timeout) trigger slow conditional watch"} 757*b725ae77Skettenis } 758*b725ae77Skettenis 759*b725ae77Skettenis # We've explicitly disabled hardware watches. Verify that GDB 760*b725ae77Skettenis # 761*b725ae77Skettenis # 762*b725ae77Skettenis send_gdb "rwatch ival3\n" 763*b725ae77Skettenis gdb_expect { 764*b725ae77Skettenis -re "Expression cannot be implemented with read/access watchpoint..*$gdb_prompt $"\ 765*b725ae77Skettenis {pass "rwatch disallowed when can-set-hw-watchpoints cleared"} 766*b725ae77Skettenis -re "$gdb_prompt $"\ 767*b725ae77Skettenis {fail "rwatch disallowed when can-set-hw-watchpoints cleared"} 768*b725ae77Skettenis timeout {fail "(timeout) rwatch disallowed when can-use-hw-watchpoints cleared"} 769*b725ae77Skettenis } 770*b725ae77Skettenis 771*b725ae77Skettenis # Read- and access watchpoints are unsupported on HP-UX. Verify 772*b725ae77Skettenis # that GDB gracefully responds to requests to create them. 773*b725ae77Skettenis # 774*b725ae77Skettenis if [istarget "hppa*-*-hpux*"] then { 775*b725ae77Skettenis send_gdb "set can-use-hw-watchpoints 1\n" 776*b725ae77Skettenis gdb_expect { 777*b725ae77Skettenis -re "$gdb_prompt $"\ 778*b725ae77Skettenis {pass "enable fast watches"} 779*b725ae77Skettenis timeout {fail "(timeout) enable fast watches"} 780*b725ae77Skettenis } 781*b725ae77Skettenis send_gdb "rwatch ival3\n" 782*b725ae77Skettenis gdb_expect { 783*b725ae77Skettenis -re "Target does not have this type of hardware watchpoint support.*$gdb_prompt $"\ 784*b725ae77Skettenis {pass "read watches disallowed"} 785*b725ae77Skettenis -re "$gdb_prompt $"\ 786*b725ae77Skettenis {fail "read watches disallowed"} 787*b725ae77Skettenis timeout {fail "(timeout) read watches disallowed"} 788*b725ae77Skettenis } 789*b725ae77Skettenis 790*b725ae77Skettenis send_gdb "awatch ival3\n" 791*b725ae77Skettenis gdb_expect { 792*b725ae77Skettenis -re "Target does not have this type of hardware watchpoint support.*$gdb_prompt $"\ 793*b725ae77Skettenis {pass "access watches disallowed"} 794*b725ae77Skettenis -re "$gdb_prompt $"\ 795*b725ae77Skettenis {fail "access watches disallowed"} 796*b725ae77Skettenis timeout {fail "(timeout) access watches disallowed"} 797*b725ae77Skettenis } 798*b725ae77Skettenis } 799*b725ae77Skettenis 800*b725ae77Skettenis # See above. 801*b725ae77Skettenis if [istarget "mips-idt-*"] then { 802*b725ae77Skettenis gdb_exit 803*b725ae77Skettenis gdb_start 804*b725ae77Skettenis gdb_reinitialize_dir $srcdir/$subdir 805*b725ae77Skettenis gdb_load $binfile 806*b725ae77Skettenis initialize 807*b725ae77Skettenis } 808*b725ae77Skettenis 809*b725ae77Skettenis test_watchpoint_and_breakpoint 810*b725ae77Skettenis} 811*b725ae77Skettenis 812*b725ae77Skettenis# Restore old timeout 813*b725ae77Skettenisset timeout $prev_timeout 814*b725ae77Skettenisverbose "Timeout now $timeout sec.\n" 815