# Copyright 2012-2017 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Test case for forgotten hw-watchpoints after fork()-off of a process.

set testfile watchpoint-fork

proc test {type symbol} {
    with_test_prefix "$type" {
	global testfile subdir srcdir gdb_prompt

	set srcfile_type ${srcdir}/${subdir}/${testfile}-${type}.c

	# no threads

	with_test_prefix "singlethreaded" {
	    set executable ${testfile}-${type}-st
	    set srcfile_main ${testfile}-st.c
	    if {[build_executable $testfile.exp $executable \
		     [list $srcfile_main ${testfile}-${type}.c] \
		     [list debug additional_flags=-D$symbol]] == -1} {
		return -1
	    }

	    clean_restart $executable

	    if [target_info exists gdb,no_hardware_watchpoints] {
		# The software watchpoint functionality is in GDB an unrelated test.
		gdb_test_no_output "set can-use-hw-watchpoints 0"
	    }

	    gdb_test "show detach-on-fork" "Whether gdb will detach the child of a fork is on\\."
	    gdb_test_no_output "set follow-fork-mode $type"
	    gdb_test "show follow-fork-mode" "Debugger response to a program call of fork or vfork is \"$type\"\\."
	    # Testcase uses it for the `follow-fork-mode child' type.
	    gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*"

	    if ![runto_main] {
		return
	    }

	    gdb_test "watch var" "atchpoint \[0-9\]+: var" "set the watchpoint"

	    # It is never hit but it should not be left over in the fork()ed-off child.
	    if [skip_hw_breakpoint_tests] {
		set hbreak "break"
	    } else {
		set hbreak "hbreak"
	    }
	    gdb_test "$hbreak marker"

	    gdb_breakpoint "mark_exit"

	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "hardware breakpoints work"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*forkoff *\\(1\\).*" "watchpoints work"
	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "breakpoint after the first fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*forkoff *\\(2\\).*" "watchpoint after the first fork"
	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "breakpoint after the second fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*mark_exit \\(\\);" "watchpoint after the second fork"
	    gdb_test "continue" "Continuing\\..*\r\n(Thread .* hit )?Breakpoint \[0-9\]+, mark_exit .*" "finish"
	}

	# threads

	if [target_info exists gdb,no_hardware_watchpoints] {
	    # Watchpoint hits would get detected in unexpected threads.
	    return
	}

	with_test_prefix "multithreaded" {
	    set executable ${testfile}-${type}-mt
	    set srcfile_main ${srcdir}/${subdir}/${testfile}-mt.c
	    if { [gdb_compile_pthreads "${srcfile_main} ${srcfile_type}" [standard_output_file ${executable}] executable [list debug "additional_flags=-D$symbol -DTHREAD"]] != "" } {
		untested "failed to compile"
		return
	    }
	    clean_restart $executable

	    gdb_test_no_output "set follow-fork-mode $type"
	    # Testcase uses it for the `follow-fork-mode child' type.
	    gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*"

	    if ![runto_main] {
		return
	    }

	    gdb_test "watch var" "atchpoint \[0-9\]+: var" "set the watchpoint"

	    # It should not be left over in the fork()ed-off child.
	    gdb_test "$hbreak marker" {reakpoint [0-9]+.*}

	    gdb_breakpoint "mark_exit"

	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "hardware breakpoints work"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*validity-first.*" "singlethread watchpoints work"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*validity-thread-A.*" "multithreaded watchpoints work at A"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*validity-thread-B.*" "multithreaded watchpoints work at B"
	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the first fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 3.*New value = 4.*after-fork1-A.*" "watchpoint A after the first fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 4.*New value = 5.*after-fork1-B.*" "watchpoint B after the first fork"
	    gdb_test "continue" \
		"reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the second fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 5.*New value = 6.*after-fork2-A.*" "watchpoint A after the second fork"
	    gdb_test "continue" \
		"atchpoint \[0-9\]+: var.*Old value = 6.*New value = 7.*after-fork2-B.*" "watchpoint B after the second fork"
	    gdb_test "continue" "Continuing\\..*\r\nThread .* hit Breakpoint \[0-9\]+, mark_exit .*" "finish"
	}
    }
}

test parent FOLLOW_PARENT

# Only GNU/Linux is known to support `set follow-fork-mode child'.
if [istarget "*-*-linux*"] {
    test child FOLLOW_CHILD
} else {
    untested "${testfile}: child"
}
