# Copyright 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Fred Fish. (fnf@cygnus.com)

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "watchpoint"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

set wp_set 1

if [get_compiler_info ${binfile}] {
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Prepare for watchpoint tests by setting up two breakpoints and one
# watchpoint.
#
# We use breakpoints at marker functions to get past all the startup code,
# so we can get to the watchpoints in a reasonable amount of time from a
# known starting point.
#
# For simplicity, so we always know how to reference specific breakpoints or
# watchpoints by number, we expect a particular ordering and numbering of
# each in the combined breakpoint/watchpoint table, as follows:
#
#	Number		What		Where
#	1		Breakpoint	marker1()
#	2		Breakpoint	marker2()
#	3		Watchpoint	ival3

proc initialize {} {
    global gdb_prompt
    global hex
    global decimal
    global srcfile
    global wp_set

    # Disable hardware watchpoints if necessary.
    if [target_info exists gdb,no_hardware_watchpoints] {
	gdb_test "set can-use-hw-watchpoints 0" "" ""
    }

    if [gdb_test "break marker1" "Breakpoint 1 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker1" ] { 
      return 0; 
    }


    if [gdb_test "break marker2" "Breakpoint 2 at $hex: file .*$srcfile, line $decimal.*" "set breakpoint at marker2" ] { 
      return 0; 
    }


    if [gdb_test "info break" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*" "info break in watchpoint.exp" ] { 
      return 0; 
    }


    # ??rehrauer: To fix DTS #CHFts23014, in which setting a watchpoint
    # before running can cause the inferior to croak on HP-UX 11.0 for
    # reasons yet unknown, we've disabled the ability to set watches
    # without a running inferior.  Verify the restriction. 
    #
    send_gdb "watch ival3\n"
    gdb_expect {
        -re ".*\[Ww\]atchpoint 3: ival3.*$gdb_prompt $" {
            pass "set watchpoint on ival3"
        }
        -re "warning: can't do that without a running program; try \"break main\", \"run\" first.*$gdb_prompt $" {
            pass "set watchpoint on ival3"
            set wp_set 0
            return 1
        }
        timeout {
            fail "(timeout) set watchpoint on ival3"
            return 0
        }
    }

    # "info watch" is the same as "info break"

    if [gdb_test "info watch" "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*\r\n3\[ \]*.*watchpoint.*ival3" "watchpoint found in watchpoint/breakpoint table" ] { 
      return 0; 
    }


    # After installing the watchpoint, we disable it until we are ready
    # to use it.  This allows the test program to run at full speed until
    # we get to the first marker function.

    if [gdb_test "disable 3" "disable 3\[\r\n\]+" "disable watchpoint" ] { 
      return 0; 
    }


    return 1
}

#
# Test simple watchpoint.
#

proc test_simple_watchpoint {} {
    global gdb_prompt
    global hex
    global decimal
    global wp_set

    # Ensure that the watchpoint is disabled when we startup.

    if { $wp_set } {
        if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_simple_watchpoint" ] { 
	    return 0; 
	}
    }


    # Run until we get to the first marker function.

    gdb_run_cmd
    set timeout 600
    gdb_expect {
	-re "Breakpoint 1, marker1 .*$gdb_prompt $" {
	    pass "run to marker1 in test_simple_watchpoint"
	}
	-re ".*$gdb_prompt $" {
	    fail "run to marker1 in test_simple_watchpoint"
	    return
	}
	timeout {
	    fail "run to marker1 in test_simple_watchpoint (timeout)"
	    return
	}
    }

    if { !$wp_set } {
	# ??rehrauer: To fix DTS #CHFts23014, in which setting a watchpoint
	# before running can cause the inferior to croak on HP-UX 11.0
	# for reasons yet unknown, we've disabled the ability to set 
	# watches without a running inferior.  The following testpoints used
	# to be in [initialize].
	#
	send_gdb "watch ival3\n"
	gdb_expect {
	    -re ".*\[Ww\]atchpoint 3: ival3\r\n$gdb_prompt $" { 
	        pass "set watchpoint on ival3"
	    }
	    -re ".*$gdb_prompt $" { fail "set watchpoint on ival3"  }
	    timeout { fail "set watchpoint on ival3 (timeout)"  }
	}

        set wp_set 1

	# "info watch" is the same as "info break"

	send_gdb "info watch\n"
	gdb_expect {
	    -re "1\[ \]*breakpoint.*marker1.*\r\n2\[ \]*breakpoint.*marker2.*\r\n3\[ \]*.*watchpoint.*ival3\r\n$gdb_prompt $" {
	        pass "watchpoint found in watchpoint/breakpoint table"
	    }
	    -re ".*$gdb_prompt $" {
	        fail "watchpoint found in watchpoint/breakpoint table"
	    }
	    timeout {
	       fail "watchpoint found in watchpoint/breakpoint table"
	    }
	}

	# After installing the watchpoint, we disable it until we are ready
	# to use it.  This allows the test program to run at full speed until
	# we get to the first marker function.

	send_gdb "disable 3\n"
	gdb_expect {
	    -re "disable 3\[\r\n\]+$gdb_prompt $" { pass "disable watchpoint" }
	    -re ".*$gdb_prompt $" { fail "disable watchpoint"  }
	    timeout { fail "disable watchpoint (timeout)"  }
	}
    }

    # After reaching the marker function, enable the watchpoint.

    if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "enable watchpoint" ] { 
      return ; 
    }


    gdb_test "break func1" "Breakpoint.*at.*"
    gdb_test "set \$func1_breakpoint_number = \$bpnum" ""

    gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, func1.*" \
	"continue to breakpoint at func1"

    # Continue until the first change, from -1 to 0

    send_gdb "cont\n"
    gdb_expect {
	-re "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count; ival4 = count;.*$gdb_prompt $" {
	    pass "watchpoint hit, first time"
	}
	-re "Continuing.*Breakpoint.*func1.*$gdb_prompt $" {
	    setup_xfail "m68*-*-*" 2597
	    fail "thought it hit breakpoint at func1 twice"
	    gdb_test "delete \$func1_breakpoint_number" ""
	    gdb_test "continue" "\
Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count;" \
		"watchpoint hit, first time"
	}
	-re ".*$gdb_prompt $" { fail "watchpoint hit, first time" ; return }
	timeout { fail "watchpoint hit, first time (timeout)" ; return }
	eof { fail "watchpoint hit, first time (eof)" ; return }
    }

    # Check that the hit count is reported correctly
    gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 1 time.*" "Watchpoint hit count is 1"

    gdb_test "delete \$func1_breakpoint_number" ""

    # Continue until the next change, from 0 to 1.
    gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 0.*New value = 1.*ival3 = count; ival4 = count;.*" "watchpoint hit, second time"

    # Check that the hit count is reported correctly
    gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 2 times.*" "Watchpoint hit count is 2"

    # Continue until the next change, from 1 to 2.
    gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 1.*New value = 2.*ival3 = count; ival4 = count;.*" "watchpoint hit, third time"

    # Check that the hit count is reported correctly
    gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 3 times.*" "Watchpoint hit count is 3"
    
    # Continue until the next change, from 2 to 3.
    gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 2.*New value = 3.*ival3 = count; ival4 = count;.*" "watchpoint hit, fourth time"

    # Check that the hit count is reported correctly
    gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 4 times.*" "Watchpoint hit count is 4"

    # Continue until the next change, from 3 to 4.
    # Note that this one is outside the loop.

    gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = 3.*New value = 4.*ival3 = count; ival4 = count;.*" "watchpoint hit, fifth time"

    # Check that the hit count is reported correctly
    gdb_test "info break" ".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+ival3\r\n\[ \t]+breakpoint already hit 5 times.*" "Watchpoint hit count is 5"

    # Continue until we hit the finishing marker function.
    # Make sure we hit no more watchpoints.

    gdb_test "cont" "Continuing.*Breakpoint.*marker2 \(\).*" \
	"continue to marker2"

    # Disable the watchpoint so we run at full speed until we exit.

    if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "watchpoint disabled" ] { 
      return ; 
    }


    # Run until process exits.

    if [target_info exists gdb,noresults] { return }

    gdb_continue_to_end "continue to exit in test_simple_watchpoint"
}

# Test disabling watchpoints.

proc test_disabling_watchpoints {} {
    global gdb_prompt
    global binfile
    global srcfile
    global decimal
    global hex

    # "info watch" is the same as "info break"
    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"

    # Ensure that the watchpoint is disabled when we startup.

    if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint in test_disabling_watchpoints" ] { 
      return 0; 
    }


    # Run until we get to the first marker function.

    gdb_run_cmd
    set timeout 600
    gdb_expect {
	-re "Breakpoint 1, marker1 .*$gdb_prompt $" {
	    pass "run to marker1 in test_disabling_watchpoints"
	}
	-re ".*$gdb_prompt $" {
	    fail "run to marker1 in test_disabling_watchpoints"
	    return
	}
	timeout {
	    fail "run to marker1 in test_disabling_watchpoints (timeout)"
	    return
	}
    }

    # After reaching the marker function, enable the watchpoint.

    if [gdb_test "enable 3" "^enable 3\[\r\n\]+" "watchpoint enabled" ] { 
      return ; 
    }


    # Continue until the first change, from -1 to 0
    # Don't check the old value, because on VxWorks the variable value
    # will not have been reinitialized.
    gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = .*New value = 0.*ival3 = count; ival4 = count;.*" "watchpoint hit in test_disabling_watchpoints, first time"
    
    # Continue until the next change, from 0 to 1.
    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"
    
    # Disable the watchpoint but leave breakpoints

    if [gdb_test "disable 3" "^disable 3\[\r\n\]+" "disable watchpoint #2 in test_disabling_watchpoints" ] { 
      return 0; 
    }


    # Check watchpoint list, looking for the entry that confirms the
    # watchpoint is disabled.
    gdb_test "info watchpoints" "\[0-9]+\[ \]*.*watchpoint\[ \]*keep\[ \]*n\[ \]*ival3\r\n.*" "watchpoint disabled in table"

    # Continue until we hit the finishing marker function.
    # Make sure we hit no more watchpoints.
    gdb_test "cont" "Continuing.*Breakpoint.*marker2 \\(\\).*" \
	"disabled watchpoint skipped"
    
    if [target_info exists gdb,noresults] { return }

    gdb_continue_to_end "continue to exit in test_disabling_watchpoints"
}

# Test stepping and other mundane operations with watchpoints enabled
proc test_stepping {} {
    global gdb_prompt

    if [runto marker1] then {
	gdb_test "watch ival2" ".*\[Ww\]atchpoint \[0-9\]*: ival2"

	# Well, let's not be too mundane.  It should be a *bit* of a challenge
	gdb_test "break func2 if 0" "Breakpoint.*at.*"
	gdb_test "p \$func2_breakpoint_number = \$bpnum" " = .*"

	gdb_test "p func1 ()" "= 73" \
	    "calling function with watchpoint enabled"

	# 
	# "finish" brings us back to main.
	# On some targets (e.g. alpha) gdb will stop from the finish in midline
	# of the marker1 call. This is due to register restoring code on
	# the alpha and might be caused by stack adjustment instructions
	# on other targets. In this case we will step once more.
	#

	send_gdb "finish\n"
	gdb_expect {
	    -re "Run.*exit from.*marker1.* at" {
		pass "finish from marker1"
	    }
	    default { fail "finish from marker1 (timeout)" ; return }
	}

	gdb_expect {
	    -re "marker1 \\(\\);.*$gdb_prompt $" {
		send_gdb "step\n"
		exp_continue
	    }
	    -re "func1 \\(\\);.*$gdb_prompt $" {
		pass "back at main from marker1"
	    }
	    -re ".*$gdb_prompt $" {
		fail "back at main from marker1"
	    }
	    default { fail "back at main from marker1 (timeout)" ; return }
	}

	gdb_test "next" "for \\(count = 0.*" "next to `for' in watchpoint.exp"

	# Now test that "until" works.  It's a bit tricky to test
	# "until", because compilers don't always arrange the code
	# exactly the same way, and we might get slightly different
	# sequences of statements.  But the following should be true
	# (if not it is a compiler or a debugger bug): The user who
	# does "until" at every statement of a loop should end up
	# stepping through the loop once, and the debugger should not
	# stop for any of the remaining iterations.

	gdb_test "until" "ival1 = count.*" "until to ival1 assignment"
	gdb_test "until" "ival3 = count.*" "until to ival3 assignment"
	send_gdb "until\n"
	gdb_expect {
	    -re "(for \\(count = 0|\}).*$gdb_prompt $" {
		gdb_test "until" "ival1 = count; /. Outside loop ./" \
		    "until out of loop"
	    }
	    -re "ival1 = count; /. Outside loop ./.*$gdb_prompt $" {
		pass "until out of loop"
	    }
	    -re ".*$gdb_prompt $" {
		fail "until out of loop"
	    }
	    default { fail "until out of loop (timeout)" ; return }
	}

	gdb_test "step" "ival2 = count.*" "step to ival2 assignment"
    }
}

# Test stepping and other mundane operations with watchpoints enabled
proc test_watchpoint_triggered_in_syscall {} {
    global gdb_prompt

    # These tests won't work without printf support.
    if [gdb_skip_stdio_test "watchpoints triggered in syscall"] {
	return;
    }
    # Run until we get to the first marker function.
    set x 0
    set y 0
    set testname "Watch buffer passed to read syscall"
    if [runto marker2] then {
	gdb_test "watch buf\[0\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[0\\\]"
	gdb_test "watch buf\[1\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[1\\\]"
	gdb_test "watch buf\[2\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[2\\\]"
	gdb_test "watch buf\[3\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[3\\\]"
	gdb_test "watch buf\[4\]" ".*\[Ww\]atchpoint \[0-9\]*: buf\\\[4\\\]"
	gdb_test "break marker4" ".*Breakpoint.*"

	gdb_test "set doread = 1" ""

	# If we send_gdb "123\n" before gdb has switched the tty, then it goes
	# to gdb, not the inferior, and we lose.  So that is why we have
	# watchpoint.c prompt us, so we can wait for that prompt.
	send_gdb "continue\n";
	gdb_expect {
	    -re "Continuing\\.\r\ntype stuff for buf now:" {
		pass "continue to read"
	    }
	    default {
		fail "continue to read";
		return ;
	    }
	}

	send_gdb "123\n"
	gdb_expect {
	    -re ".*\[Ww\]atchpoint.*buf\\\[0\\\].*Old value = 0.*New value = 49\[^\n\]*\n" { set x [expr $x+1] ; exp_continue }
	    -re ".*\[Ww\]atchpoint.*buf\\\[1\\\].*Old value = 0.*New value = 50\[^\n\]*\n" { set x [expr $x+1] ; exp_continue }
	    -re ".*\[Ww\]atchpoint.*buf\\\[2\\\].*Old value = 0.*New value = 51\[^\n\]*\n" { set x [expr $x+1] ; exp_continue }
	    -re ".*\[Ww\]atchpoint.*buf\\\[3\\\].*Old value = 0.*New value = 10\[^\n\]*\n" { set x [expr $x+1] ; exp_continue }
	    -re ".*$gdb_prompt $" { pass "sent 123" }
	    timeout { fail "sent 123 (timeout)" }
	}

	# Examine the values in buf to see how many watchpoints we
	# should have printed.
	send_gdb "print buf\[0\]\n"
	gdb_expect {
	    -re ".*= 49.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[0\]"}
	    -re ".*= 0.*$gdb_prompt $" { pass "print buf\[0\]"}
	    -re ".*$gdb_prompt $" { fail "print buf\[0\]"}
	    default { fail "print buf\[0\]"}
	}
	send_gdb "print buf\[1\]\n"
	gdb_expect {
	    -re ".*= 50.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[1\]"}
	    -re ".*= 0.*$gdb_prompt $" { pass "print buf\[1\]"}
	    -re ".*$gdb_prompt $" { fail "print buf\[1\]"}
	    default { fail "print buf\[1\]"}
	}
	send_gdb "print buf\[2\]\n"
	gdb_expect {
	    -re ".*= 51.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[2\]"}
	    -re ".*= 0.*$gdb_prompt $" { pass "print buf\[2\]"}
	    -re ".*$gdb_prompt $" { fail "print buf\[2\]"}
	    default { fail "print buf\[2\]"}
	}
	send_gdb "print buf\[3\]\n"
	gdb_expect {
	    -re ".*= 10.*$gdb_prompt $" { set y [expr $y+1]; pass "print buf\[3\]"}
	    -re ".*= 0.*$gdb_prompt $" { pass "print buf\[3\]"}
	    -re ".*$gdb_prompt $" { fail "print buf\[3\]" }
	    default { fail "print buf\[3\]" }
	}

	# Did we find what we were looking for?  If not, flunk it.
	if [expr $x==$y] then { pass $testname } else { fail "$testname (only triggered $x watchpoints, expected $y)"}

	# Continue until we hit the finishing marker function.
	# Make sure we hit no more watchpoints.
	gdb_test "cont" "Continuing.*Breakpoint.*marker4 \\(\\).*" \
	    "continue to marker4"

	# Disable everything so we can finish the program at full speed
	gdb_test "disable" "" "disable in test_watchpoint_triggered_in_syscall"

	if [target_info exists gdb,noresults] { return }

	gdb_continue_to_end "continue to exit in test_watchpoint_triggered_in_syscall"
    }
}

# Do a simple test of of watching through a pointer when the pointer
# itself changes.  Should add some more complicated stuff here.

proc test_complex_watchpoint {} {
    global gdb_prompt

    if [runto marker4] then {
	gdb_test "watch ptr1->val" ".*\[Ww\]atchpoint \[0-9\]*: ptr1->val"
	gdb_test "break marker5" ".*Breakpoint.*"

	gdb_test "cont" "Continuing.*\[Ww\]atchpoint.*ptr1->val.*Old value = 1.*New value = 2.*" "Test complex watchpoint"

	# Continue until we hit the marker5 function.
	# Make sure we hit no more watchpoints.

	gdb_test "cont" "Continuing.*Breakpoint.*marker5 \\(\\).*" \
	    "did not trigger wrong watchpoint"

        # Test watches of things declared locally in a function.
        # In particular, test that a watch of stack-based things
        # is deleted when the stack-based things go out of scope.
        #
	gdb_test "disable" "" "disable in test_complex_watchpoint"
        gdb_test "break marker6" ".*Breakpoint.*"
        gdb_test "cont" "Continuing.*Breakpoint.*marker6 \\(\\).*" \
            "continue to marker6"
        gdb_test "break func2" ".*Breakpoint.*"
        gdb_test "cont" "Continuing.*func2.*"

        # Test a watch of a single stack-based variable, whose scope
        # is the function we're now in.  This should auto-delete when
        # execution exits the scope of the watchpoint.
        #
        gdb_test "watch local_a" ".*\[Ww\]atchpoint \[0-9\]*: local_a" "set local watch"
        gdb_test "cont" "\[Ww\]atchpoint.*local_a.*" "trigger local watch"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" "self-delete local watch"

        gdb_test "cont" "Continuing.*func2.*"
        # We should be in "func2" again now.  Test a watch of an
        # expression which includes both a stack-based local and
        # something whose scope is larger than this invocation
        # of "func2".  This should also auto-delete.
        #
        gdb_test "watch local_a + ival5" ".*\[Ww\]atchpoint \[0-9\]*: local_a . ival5" \
                 "set partially local watch"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_a . ival5.*" \
                 "trigger1 partially local watch"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_a . ival5.*" \
                 "trigger2 partially local watch"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" \
                 "self-delete partially local watch"

        # We should be in "func2" again now.  Test a watch of a
        # static (non-stack-based) local.  Since this has scope
        # across any invocations of "func2", it should not auto-
        # delete.
        #
        gdb_test "cont" "Continuing.*func2.*"
        gdb_test "watch static_b" ".*\[Ww\]atchpoint \[0-9\]*: static_b" \
                 "set static local watch"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: static_b.*" \
                 "trigger static local watch"
        gdb_test "cont" "Continuing.*marker6 \\(\\).*" \
                 "continue after trigger static local watch"
        gdb_test "info break" ".*watchpoint.*static_b.*" \
                 "static local watch did not self-delete"

        # We should be in "recurser" now.  Test a watch of a stack-
        # based local.  Symbols mentioned in a watchpoint are bound
        # at watchpoint-creation.  Thus, a watch of a stack-based
        # local to a recursing function should be bound only to that
        # one invocation, and should not trigger for other invocations.
        #
        gdb_test "tbreak recurser" ".*Breakpoint.*"
        gdb_test "cont" "Continuing.*recurser.*"
        gdb_test "watch local_x" ".*\[Ww\]atchpoint \[0-9\]*: local_x" \
                 "set local watch in recursive call"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: local_x.*New value = 2.*" \
                 "trigger local watch in recursive call"
        gdb_test "cont" "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*" \
                 "self-delete local watch in recursive call"

	# Disable everything so we can finish the program at full speed
	gdb_test "disable" "" "disable in test_complex_watchpoint"

	if [target_info exists gdb,noresults] { return }

	gdb_continue_to_end "continue to exit in test_complex_watchpoint"
    }
}

proc test_watchpoint_and_breakpoint {} {
    global gdb_prompt

    # This is a test for PR gdb/38, which involves setting a
    # watchpoint right after you've reached a breakpoint.

    if [runto func3] then {
	gdb_breakpoint [gdb_get_line_number "second x assignment"]
	gdb_continue_to_breakpoint "second x assignment"
	gdb_test "watch x" ".*atchpoint \[0-9\]+: x"
	gdb_test_multiple "next" "next after watch x" {
	    -re ".*atchpoint \[0-9\]+: x\r\n\r\nOld value = 0\r\nNew value = 1\r\n.*$gdb_prompt $" {
		pass "next after watch x"
	    }
	    -re "\[0-9\]+\[\t \]+y = 1;\r\n$gdb_prompt $" {
		kfail "gdb/38" "next after watch x"
	    }
	}
    }
}
    
# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile
set prev_timeout $timeout
set timeout 600	
verbose "Timeout now 600 sec.\n"

if [initialize] then {

    test_simple_watchpoint

    # The IDT/sim monitor only has 8 (!) open files, of which it uses
    # 4 (!).  So we have to make sure one program exits before
    # starting another one.
    if [istarget "mips-idt-*"] then {
	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir
	gdb_load $binfile
	initialize
    }

    test_disabling_watchpoints

    # See above.
    if [istarget "mips-idt-*"] then {
	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir
	gdb_load $binfile
	initialize
    }

    if ![target_info exists gdb,cannot_call_functions] {
	test_stepping

	# See above.
	if [istarget "mips-idt-*"] then {
	    gdb_exit
	    gdb_start
	    gdb_reinitialize_dir $srcdir/$subdir
	    gdb_load $binfile
	    initialize
	}
    }

    # Only enabled for some targets merely because it has not been tested 
    # elsewhere.
    # On sparc-sun-sunos4.1.3, GDB was running all the way to the marker4 
    # breakpoint before stopping for the watchpoint.  I don't know why.
    if {[istarget "hppa*-*-*"]} then {
	test_watchpoint_triggered_in_syscall
    }

    # See above.
    if [istarget "mips-idt-*"] then {
	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir
	gdb_load $binfile
	initialize
    }

    # Only enabled for some targets merely because it has not been tested 
    # elsewhere.
    if {[istarget "hppa*-*-*"] || \
	    [istarget "sparc*-*-sunos*"] || \
	    [istarget "m32r-*-*"]} then {
	test_complex_watchpoint
    }

    # Verify that a user can force GDB to use "slow" watchpoints.
    # (This proves rather little on kernels that don't support
    # fast watchpoints, but still...)
    #
    if ![runto_main] then { fail "watch tests suppressed" }

    send_gdb "set can-use-hw-watchpoints 0\n"
    gdb_expect {
      -re "$gdb_prompt $"\
              {pass "disable fast watches"}
      timeout {fail "(timeout) disable fast watches"}
    }
    send_gdb "show can-use-hw-watchpoints\n"
    gdb_expect {
      -re "Debugger's willingness to use watchpoint hardware is 0.*$gdb_prompt $"\
              {pass "show disable fast watches"}
      -re "$gdb_prompt $"\
              {fail "show disable fast watches"}
      timeout {fail "(timeout) show disable fast watches"}
    }
    send_gdb "watch ival3 if  count > 1\n"
    gdb_expect {
      -re "Watchpoint \[0-9\]*: ival3.*$gdb_prompt $"\
              {pass "set slow conditional watch"}
      -re "$gdb_prompt $"\
              {fail "set slow conditional watch"}
      timeout {fail "(timeout) set slow conditional watch"}
    }
    send_gdb "continue\n"
    gdb_expect {
      -re "Watchpoint \[0-9\]*: ival3.*Old value = 1.*New value = 2.*$gdb_prompt $"\
              {pass "trigger slow conditional watch"}
      -re "$gdb_prompt $"\
              {fail "trigger slow conditional watch"}
      timeout {fail "(timeout) trigger slow conditional watch"}
    }

    # We've explicitly disabled hardware watches.  Verify that GDB
    # 
    #
    send_gdb "rwatch ival3\n"
    gdb_expect {
      -re "Expression cannot be implemented with read/access watchpoint..*$gdb_prompt $"\
              {pass "rwatch disallowed when can-set-hw-watchpoints cleared"}
      -re "$gdb_prompt $"\
              {fail "rwatch disallowed when can-set-hw-watchpoints cleared"}
      timeout {fail "(timeout) rwatch disallowed when can-use-hw-watchpoints cleared"}
    }

    # Read- and access watchpoints are unsupported on HP-UX.  Verify
    # that GDB gracefully responds to requests to create them.
    #
    if [istarget "hppa*-*-hpux*"] then {
      send_gdb "set can-use-hw-watchpoints 1\n"
      gdb_expect {
        -re "$gdb_prompt $"\
                {pass "enable fast watches"}
        timeout {fail "(timeout) enable fast watches"}
      }
      send_gdb "rwatch ival3\n"
      gdb_expect {
        -re "Target does not have this type of hardware watchpoint support.*$gdb_prompt $"\
                {pass "read watches disallowed"}
        -re "$gdb_prompt $"\
                {fail "read watches disallowed"}
        timeout {fail "(timeout) read watches disallowed"}
      }

      send_gdb "awatch ival3\n"
      gdb_expect {
        -re "Target does not have this type of hardware watchpoint support.*$gdb_prompt $"\
                {pass "access watches disallowed"}
        -re "$gdb_prompt $"\
                {fail "access watches disallowed"}
        timeout {fail "(timeout) access watches disallowed"}
      }
    }

    # See above.
    if [istarget "mips-idt-*"] then {
	gdb_exit
	gdb_start
	gdb_reinitialize_dir $srcdir/$subdir
	gdb_load $binfile
	initialize
    }

    test_watchpoint_and_breakpoint
}

# Restore old timeout
set timeout $prev_timeout
verbose "Timeout now $timeout sec.\n"
