# Copyright 1992-2021 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 Jeff Law. (law@cs.utah.edu)


standard_testfile

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

proc recurse_tests {} {

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

    if [runto recurse] then {
	# First we need to step over the assignment of b, so it has a known
	# value.
	gdb_test "next" "if \\(a == 1\\)" "next over b = 0 in first instance"
	gdb_test "watch b" ".*\[Ww\]atchpoint \[0-9]*: b" \
	    "set first instance watchpoint"

	# Continue until initial set of b.
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 0.*New value = 10.*" \
	    "continue to first instance watchpoint, first time"

	# Continue inward for a few iterations
	gdb_test "continue" "Breakpoint.* recurse \\(a=9\\).*" \
	    "continue to recurse (a = 9)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=8\\).*" \
	    "continue to recurse (a = 8)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=7\\).*" \
	    "continue to recurse (a = 7)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=6\\).*" \
	    "continue to recurse (a = 6)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=5\\).*" \
	    "continue to recurse (a = 5)"

	# Put a watchpoint on another instance of b
	# First we need to step over the assignment of b, so it has a known
	# value.
	gdb_test "next" "if \\(a == 1\\)" "next over b = 0 in second instance"
	gdb_test "watch b" ".*\[Ww\]atchpoint \[0-9]*: b" \
	    "set second instance watchpoint"

	# Continue until initial set of b (second instance).
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 0.*New value = 5.*"\
	    "continue to second instance watchpoint, first time"

	# Continue inward for a few iterations
	gdb_test "continue" "Breakpoint.* recurse \\(a=4\\).*" \
	    "continue to recurse (a = 4)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=3\\).*" \
	    "continue to recurse (a = 3)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=2\\).*" \
	    "continue to recurse (a = 2)"
	gdb_test "continue" "Breakpoint.* recurse \\(a=1\\).*" \
	    "continue to recurse (a = 1)"

	# Continue until second set of b (second instance).
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*: b.*Old value = 5.*New value = 120.*return.*" \
	    "continue to second instance watchpoint, second time"

	# Continue again.  We should have a watchpoint go out of scope now
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*deleted.*recurse \\(a=6\\) .*" \
	    "second instance watchpoint deleted when leaving scope"

	# Continue until second set of b (first instance).
	# 24320 is allowed as the final value for b as that's the value
	# b would have on systems with 16bit integers.
	#
	# We could fix the test program to deal with this too.
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*b.*Old value = 10.*New value = \(3628800|24320\).*return.*" \
	    "continue to first instance watchpoint, second time"

	# Continue again.  We should have a watchpoint go out of scope now.
	#
	# The former version expected the test to return to main().
	# Now it expects the test to return to main or to stop in the
	# function's epilogue.
	# 
	# The problem is that gdb needs to (but doesn't) understand
	# function epilogues in the same way as for prologues.
	# 
	# If there is no hardware watchpoint (such as a x86 debug register),
	# then watchpoints are done "the hard way" by single-stepping the
	# target until the value of the watched variable changes.  If you
	# are single-stepping, you will eventually step into an epilogue.
	# When you do that, the "top" stack frame may become partially
	# deconstructed (as when you pop the frame pointer, for instance),
	# and from that point on, GDB can no longer make sense of the stack.
	# 
	# A test which stops in the epilogue is trying to determine when GDB
	# leaves the stack frame in which the watchpoint was created.  It does
	# this basically by watching for the frame pointer to change.  When
	# the frame pointer changes, the test expects to be back in main, but
	# instead it is still in the epilogue of the callee.
	gdb_test "continue" \
	    "Continuing.*\[Ww\]atchpoint.*deleted.*\(main \\(\\) \|21.*\}\).*" \
	    "first instance watchpoint deleted when leaving scope"
    }
}

# Preserve the old timeout, and set a new one that should be
# sufficient to avoid timing out during this test.
set oldtimeout $timeout
set timeout [expr "$timeout + 60"]
verbose "Timeout is now $timeout seconds" 2

recurse_tests

# Restore the preserved old timeout value.
set timeout $oldtimeout
verbose "Timeout is now $timeout seconds" 2

