# Copyright 2012 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

if [is_remote target] {
    kfail "remote/13584" "gdbserver does not support debugging across fork"
    return
}

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\nBreakpoint \[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 ${testfile}.exp
	    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\nBreakpoint \[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"
}
