# Copyright 1992-2020 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/>.

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


standard_testfile

if [get_compiler_info] {
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     return -1
}

# True if we're forcing no hardware watchpoints.
set no_hw 0

# 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

    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
    }

    gdb_test "watch ival3" ".*\[Ww\]atchpoint 3: ival3.*" "set watchpoint on ival3"

    if [gdb_test "info watch" "3\[ \]*.*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

    # Ensure that the watchpoint is disabled when we startup.

    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
    set test "run to marker1 in test_simple_watchpoint"
    set retcode [gdb_test_multiple "" $test {
	-re "Breakpoint 1, marker1 .*$gdb_prompt $" {
	    pass $test
	}
    }]

    if { $retcode != 0 } {
	return
    }

    # 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_no_output "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

    set test "watchpoint hit, first time"
    gdb_test_multiple "cont" $test {
	-re "Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count; ival4 = count;.*$gdb_prompt $" {
	    pass $test
	}
	-re "Continuing.*Breakpoint.*func1.*$gdb_prompt $" {
	    setup_xfail "m68*-*-*" 2597
	    fail "thought it hit breakpoint at func1 twice"
	    gdb_test_no_output "delete \$func1_breakpoint_number"
	    gdb_test "continue" "\
Continuing.*\[Ww\]atchpoint.*ival3.*Old value = -1.*New value = 0.*ival3 = count;" \
		$test
	}
    }

    # 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_no_output "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

    gdb_test "info watch" "\[0-9]+\[ \]*.*watchpoint.*ival3.*" "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
    set test "run to marker1 in test_disabling_watchpoints"
    set retcode [gdb_test_multiple "" $test {
	-re "Breakpoint 1, marker1 .*$gdb_prompt $" {
	    pass $test
	}
    }]

    if { $retcode != 0 } {
	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"
	set test "until out of loop"
	gdb_test_multiple "until" $test {
	    -re "(for \\(count = 0|\}).*$gdb_prompt $" {
		gdb_test "until" "ival1 = count; /. Outside loop ./" $test
	    }
	    -re "ival1 = count; /. Outside loop ./.*$gdb_prompt $" {
		pass $test
	    }
	}

	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_no_output "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
	    }
	}

	set test "sent 123"
	gdb_test_multiple "123" $test {
	    -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 $test }
	}

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

	# 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_no_output "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_no_output "disable" "disable in test_complex_watchpoint, first time"
        gdb_test "break marker6" ".*Breakpoint.*"
        gdb_test "cont" "Continuing.*Breakpoint.*marker6 \\(\\).*" \
            "continue to marker6"
	gdb_breakpoint [gdb_get_line_number "func2 breakpoint here"]
	gdb_continue_to_breakpoint "func2 breakpoint here, first time"

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

	set test "self-delete local watch"
        gdb_test_multiple "cont" $test {
	    -re "Continuing.*\[Ww\]atchpoint .* deleted because the program has left the block in.*which its expression is valid.*\r\n$gdb_prompt $" {
		pass $test
	    }
	    -re "can't compute CFA for this frame.*\r\n$gdb_prompt $" {
		global no_hw

		# GCC < 4.5.0 does not get LOCATIONS_VALID set by dwarf2read.c.
		# Therefore epilogue unwinder gets applied which is
		# incompatible with dwarf2_frame_cfa.
		if {$no_hw && ([test_compiler_info {gcc-[0-3]-*}]
			       || [test_compiler_info {gcc-4-[0-4]-*}])} {
		    xfail "$test (old GCC has broken watchpoints in epilogues)"
		    return
		}
		fail $test
	    }
	}

	gdb_continue_to_breakpoint "func2 breakpoint here, second time"
        # 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_continue_to_breakpoint "func2 breakpoint here, third time"
        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.
        #
	with_test_prefix "local_x" {
	    gdb_test "tbreak recurser" ".*breakpoint.*"
	    gdb_test "cont" "Continuing.*recurser.*"
	    gdb_test "next" "if \\(x > 0.*" "next past local_x initialization"
	    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"
	}

        # Repeat the preceding test, but this time use "recurser::local_x" as
        # the variable to track.
	with_test_prefix "recurser::local_x" {
	    gdb_test "cont" "Continuing.*marker6.*" "continue to marker6"
	    gdb_test "tbreak recurser" ".*breakpoint.*"
	    gdb_test "cont" "Continuing.*recurser.*" "continue to recurser"
	    gdb_test "next" "if \\(x > 0.*" "next past local_x initialization"
	    gdb_test "watch recurser::local_x" ".*\[Ww\]atchpoint \[0-9\]*: recurser::local_x" \
		"set local watch in recursive call with explicit scope"
	    gdb_test "cont" "Continuing.*\[Ww\]atchpoint .*: recurser::local_x.*New value = 2.*" \
		"trigger local watch with explicit scope 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 with explicit scope in recursive call (2)"
	}

	# Disable everything so we can finish the program at full speed
	gdb_test_no_output "disable" "disable in test_complex_watchpoint, second time"

	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 breakpoints/7143, 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 "next" \
	    ".*atchpoint \[0-9\]+: x\r\n\r\nOld value = 0\r\nNew value = 1\r\n.*" \
	    "next after watch x"

	gdb_test_no_output "delete \$bpnum" "delete watch x"
    }
}

proc test_constant_watchpoint {} {
    gdb_test "watch 5" "Cannot watch constant value `5'." "number is constant"
    gdb_test "watch (int *)5" "Cannot watch constant value `\\(int \\*\\)5'." \
    "number with cast is constant"
    gdb_test "watch marker1" "Cannot watch constant value `marker1'." \
    "marker1 is constant"
    gdb_test "watch count + 6" ".*atchpoint \[0-9\]+: count \\+ 6"
    gdb_test_no_output "delete \$bpnum" "delete watchpoint `count + 6'"
    gdb_test "watch 7 + count" ".*atchpoint \[0-9\]+: 7 \\+ count"
    gdb_test_no_output "delete \$bpnum" "delete watchpoint `7 + count'"
}

proc test_disable_enable_software_watchpoint {} {
    # This is regression test for a bug that caused `enable' to fail
    # for software watchpoints.

    # Watch something not memory to force a software watchpoint.
    gdb_test {watch $pc} ".*atchpoint \[0-9\]+: .pc"

    gdb_test_no_output "disable \$bpnum" "disable watchpoint `\$pc'"
    gdb_test_no_output "enable \$bpnum" "reenable watchpoint `\$pc'"

    gdb_test "info watchpoint \$bpnum" \
	".*watchpoint\[ \t\]+keep\[ \t\]+y\[ \t\]+.pc.*" \
	"watchpoint `\$pc' is enabled"

    gdb_test_no_output "delete \$bpnum" "delete watchpoint `\$pc'"
}

proc test_watch_location {} {
    global gdb_prompt

    gdb_breakpoint [gdb_get_line_number "func5 breakpoint here"]
    gdb_continue_to_breakpoint "func5 breakpoint here"

    # Check first if a null pointer can be dereferenced on the target.
    gdb_test_multiple "p *nullptr" "" {
	-re "Cannot access memory at address 0x0.*$gdb_prompt $" {
	    gdb_test "watch -location nullptr->p->x" \
		"Cannot access memory at address 0x0"
	}
	-re ".*$gdb_prompt $" {
	    # Null pointer dereference is legitimate.
	}
    }

    gdb_test "watch -location *x" "atchpoint .*: .*" "watch -location .x"

    gdb_test "continue" \
	"Continuing.*\[Ww\]atchpoint .*: .*New value = 27.*" \
	"continue with watch -location"

    gdb_test_no_output "delete \$bpnum" "delete watch -location"
}

# Tests watching areas larger than a word.

proc test_wide_location_1 {} {
    global no_hw
    global gdb_prompt

    # This test watches two words on most 32-bit ABIs, and one word on
    # most 64-bit ABIs.

    # Platforms where the target can't watch such a large region
    # should clear hw_expected below.
    if { $no_hw || [target_info exists gdb,no_hardware_watchpoints]
         || [istarget arm*-*-*]
         || ([istarget powerpc*-*-*] && ![is_lp64_target])} {
	set hw_expected 0
    } else {
	set hw_expected 1
    }

    gdb_breakpoint [gdb_get_line_number "func6 breakpoint here"]
    gdb_continue_to_breakpoint "func6 breakpoint here"

    if { $hw_expected } {
	gdb_test "watch foo2" "Hardware watchpoint .*: .*"
	gdb_test "continue" \
	    "Continuing.*Hardware watchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*" \
	    "continue with watch foo2"
    } else {
	gdb_test "watch foo2" "atchpoint .*: .*"
	set test "continue with watch foo2"
	gdb_test_multiple "cont" $test {
	    -re "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 11\\\}\\\}.*$gdb_prompt $" {
		pass $test
	    }
	    -re "Could not insert hardware breakpoints:.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
		# This may happen with remote targets that support
		# hardware watchpoints.  We only find out the
		# watchpoint was too large, for example, at insert
		# time.  If GDB is ever adjusted to downgrade the
		# watchpoint automatically in this case, this match
		# should be removed.
		pass $test
	    }
	}
    }

    gdb_test_no_output "delete \$bpnum" "delete watch foo2"
}

proc test_wide_location_2 {} {
    global no_hw
    global gdb_prompt

    # This test watches four words on most 32-bit ABIs, and two words
    # on 64-bit ABIs.

    # Platforms where the target can't watch such a large region
    # should clear hw_expected below.
    if { $no_hw || [target_info exists gdb,no_hardware_watchpoints]
         || [istarget arm*-*-*]
         || [istarget powerpc*-*-*]} {
	set hw_expected 0
    } else {
	set hw_expected 1
    }

    gdb_breakpoint [gdb_get_line_number "func7 breakpoint here"]
    gdb_continue_to_breakpoint "func7 breakpoint here"

    if { $hw_expected } {
	gdb_test "watch foo4" "Hardware watchpoint .*: .*"
	gdb_test "continue" \
	    "Continuing.*Hardware watchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*" \
	    "continue with watch foo4"
    } else {
	gdb_test "watch foo4" "atchpoint .*: .*"
	set test "continue with watch foo4"
	gdb_test_multiple "cont" $test {
	    -re "Continuing.*\[Ww\]atchpoint .*: .*New value = \\\{val = \\\{0, 0, 0, 33\\\}\\\}.*$gdb_prompt $" {
		pass $test
	    }
	    -re "Could not insert hardware breakpoints:.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
		# This may happen with remote targets that support
		# hardware watchpoints.  We only find out the
		# watchpoint was too large, for example, at insert
		# time.  If GDB is ever adjusted to downgrade the
		# watchpoint automatically in this case, this match
		# should be removed.
		pass $test
	    }
	}
    }

    gdb_test_no_output "delete \$bpnum" "delete watch foo4"
}

proc test_inaccessible_watchpoint {} {
    global gdb_prompt

    # This is a test for watchpoints on currently inaccessible (but later
    # valid) memory.

    if [runto func4] then {
	# Make sure we only allow memory access errors.
	set msg "watchpoint refused to insert on nonexistent struct member"
	gdb_test_multiple "watch struct1.nosuchmember" $msg {
	    -re ".*atchpoint \[0-9\]+: struct1.nosuchmember.*$gdb_prompt $" {
		# PR breakpoints/9681
		fail $msg
	    }
	    -re "There is no member named nosuchmember\\..*$gdb_prompt $" {
		pass $msg
	    }
	}

	# See whether a watchpoint on a normal variable is a hardware
	# watchpoint or not.  The watchpoints on NULL should be hardware
	# iff this one is.
	set watchpoint_msg "Watchpoint"
	gdb_test_multiple "watch global_ptr" "watch global_ptr" {
	    -re "Watchpoint \[0-9\]+: global_ptr\r\n.*$gdb_prompt $" {
		pass "watch global_ptr"
	    }
	    -re "Hardware watchpoint \[0-9\]+: global_ptr\r\n.*$gdb_prompt $" {
		set watchpoint_msg "Hardware watchpoint"
		pass "watch global_ptr"
	    }
	}
	delete_breakpoints

	# Make sure that we can watch a constant address, and correctly
	# use a HW watchpoint if supported.
	gdb_test "watch *(int *) 0" \
	    "$watchpoint_msg \[0-9\]+: \\*\\(int \\*\\) 0"
	delete_breakpoints

	# The same, but using -location through an indirection.
	gdb_test "watch -location *global_ptr" \
	    "$watchpoint_msg \[0-9\]+: \-location \\*global_ptr"
	delete_breakpoints

	# This step requires two HW watchpoints.  Since some platforms only
	# have a single one, accept either SW or HW watchpoint in this case.
	if {[skip_hw_watchpoint_multi_tests]} {
	    set watchpoint_msg "(Watchpoint|Hardware watchpoint)"
	}

	gdb_test "watch *global_ptr" "$watchpoint_msg \[0-9\]+: \\\*global_ptr"
	gdb_test "set \$global_ptr_breakpoint_number = \$bpnum" ""
	gdb_test "next" ".*global_ptr = buf.*" "global_ptr next"
	gdb_test_multiple "next" "next over ptr init" {
	    -re ".*atchpoint \[0-9\]+: \\*global_ptr\r\n\r\nOld value = .*\r\nNew value = 3 .*\r\n.*$gdb_prompt $" {
		# We can not test for <unknown> here because NULL may be readable.
		# This test does rely on *NULL != 3.
		pass "next over ptr init"
	    }
	}
	gdb_test_multiple "next" "next over buffer set" {
	    -re ".*atchpoint \[0-9\]+: \\*global_ptr\r\n\r\nOld value = 3 .*\r\nNew value = 7 .*\r\n.*$gdb_prompt $" {
		pass "next over buffer set"
	    }
	}
	gdb_test "delete \$global_ptr_breakpoint_number" ""
	gdb_test "watch **global_ptr_ptr" ".*atchpoint \[0-9\]+: \\*\\*global_ptr_ptr"
	gdb_test "set \$global_ptr_ptr_breakpoint_number = \$bpnum" ""
	gdb_test "next" ".*global_ptr_ptr = &global_ptr.*" "global_ptr_ptr next"
	gdb_test "next" ".*atchpoint \[0-9\]+: \\*\\*global_ptr_ptr\[\r\n\]+Old value = .*\r\nNew value = 7 .*" "next over global_ptr_ptr init"
	gdb_test "next" ".*atchpoint \[0-9\]+: \\*\\*global_ptr_ptr\[\r\n\]+Old value = 7 .*\r\nNew value = 9 .*" "next over global_ptr_ptr buffer set"
	gdb_test "next" ".*atchpoint \[0-9\]+: \\*\\*global_ptr_ptr\[\r\n\]+Old value = 9 .*\r\nNew value = 5 .*" "next over global_ptr_ptr pointer advance"
	gdb_test_no_output "delete \$global_ptr_ptr_breakpoint_number"
    }
}

proc test_no_hw_watchpoints {} {
    global testfile

    clean_restart $testfile

    # 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" }

    gdb_test_no_output "set can-use-hw-watchpoints 0" "disable fast watches"

    gdb_test "show can-use-hw-watchpoints" \
	"Debugger's willingness to use watchpoint hardware is 0." \
	"show disable fast watches"

    gdb_test "watch ival3 if  count > 1" \
	"Watchpoint \[0-9\]*: ival3.*" \
	"set slow conditional watch"

    gdb_test "continue" \
	"Watchpoint \[0-9\]*: ival3.*Old value = 1.*New value = 2.*" \
	"trigger slow conditional watch"

    gdb_test_no_output "delete \$bpnum" "delete watch ival3"

    gdb_test "watch ival3 if  count > 1  thread 1 " \
         "Watchpoint \[0-9\]*: ival3.*" \
         "set slow condition watch w/thread"

    gdb_test_no_output "delete \$bpnum" "delete watch w/condition and thread"

    # We've explicitly disabled hardware watches.  Verify that GDB
    # refrains from using them.
    #
    gdb_test "rwatch ival3" \
	"Can't set read/access watchpoint when hardware watchpoints are disabled." \
	"rwatch disallowed when can-set-hw-watchpoints cleared"
    gdb_test "awatch ival3" \
	"Can't set read/access watchpoint when hardware watchpoints are disabled." \
	"awatch disallowed when can-set-hw-watchpoints cleared"


    # Re-enable hardware watchpoints if necessary.
    if ![target_info exists gdb,no_hardware_watchpoints] {
        gdb_test_no_output "set can-use-hw-watchpoints 1" ""
    }
}

proc test_watchpoint_in_big_blob {} {
    global gdb_prompt

    # On native targets where we do hardware resource accounting, this
    # may end up as a software watchpoint.
    set ok 0
    set test "watch buf"
    gdb_test_multiple "watch buf" $test {
	-re "Hardware watchpoint \[0-9\]+: buf.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
	    # This may happen with remote targets (where we don't do
	    # resource accounting) that support hardware watchpoints,
	    # when breakpoint always-inserted is on.  The watchpoint
	    # was too large, for example.  If GDB is ever adjusted to
	    # downgrade the watchpoint automatically in this case,
	    # this match should be removed.  Note the breakpoint has
	    # been created, and is in the list, so it needs deleting.
	    pass $test
	}
	-re ".*atchpoint \[0-9\]+: buf.*$gdb_prompt $" {
	    pass $test
	    set ok 1
	}
    }

    if { $ok } {
	set test "watchpoint on buf hit"
	gdb_test_multiple "cont" $test {
	    -re "Continuing.*atchpoint \[0-9\]+: buf\r\n\r\nOld value = .*testte\".*$gdb_prompt $" {
		pass $test
	    }
	    -re "Could not insert hardware breakpoints:.*You may have requested too many hardware breakpoints/watchpoints.*$gdb_prompt $" {
		# This may happen with remote targets that support
		# hardware watchpoints.  We only find out the
		# watchpoint was too large, for example, at insert
		# time.  If GDB is ever adjusted to downgrade the
		# watchpoint automatically in this case, this match
		# should be removed.
		pass $test
	    }
	}
    }

    gdb_test_no_output "delete \$bpnum" "delete watch buf"
}

proc test_watch_register_location {} {
    global no_hw

    if {!$no_hw && ![target_info exists gdb,no_hardware_watchpoints]} {
	# Non-memory read/access watchpoints are not supported, they would
	# require software read/access watchpoint support (which is not
	# currently available).
	gdb_test "rwatch \$pc" \
	    "Expression cannot be implemented with read/access watchpoint..*" \
	    "rwatch disallowed for register based expression"
	gdb_test "awatch \$pc" \
	    "Expression cannot be implemented with read/access watchpoint..*" \
	    "awatch disallowed for register based expression"
    }
}

# Start with a fresh gdb.

set prev_timeout $timeout
set timeout 600	
verbose "Timeout now 600 sec.\n"

test_no_hw_watchpoints

proc do_tests {} {
    global testfile
    global no_hw

    clean_restart $testfile

    if {$no_hw || [target_info exists gdb,no_hardware_watchpoints]} {
	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
    }

    if [initialize] then {

	test_simple_watchpoint

	test_disabling_watchpoints

	if ![target_info exists gdb,cannot_call_functions] {
	    test_stepping
	}
    }

    # Tests below don't rely on the markers and watchpoint set by
    # `initialize' anymore.
    clean_restart $testfile

    if {$no_hw || [target_info exists gdb,no_hardware_watchpoints]} {
	gdb_test_no_output "set can-use-hw-watchpoints 0" ""
    }

    # 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
    }

    test_complex_watchpoint

    test_inaccessible_watchpoint

    test_watchpoint_and_breakpoint

    test_watchpoint_in_big_blob

    test_constant_watchpoint

    test_disable_enable_software_watchpoint

    test_watch_location

    test_wide_location_1
    test_wide_location_2

    test_watch_register_location
}

# On targets that can do hardware watchpoints, run the tests twice:
# once with hardware watchpoints enabled; another with hardware
# watchpoints force-disabled.

do_tests
if ![target_info exists gdb,no_hardware_watchpoints] {
    with_test_prefix "no-hw" {
	set no_hw 1
	do_tests
    }
}

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