# 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 objdir 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 ${srcdir}/${subdir}/${testfile}-st.c
	if { [gdb_compile "${srcfile_main} ${srcfile_type}" ${objdir}/${subdir}/${executable} executable [list debug additional_flags=-D$symbol]] != "" } {
	    untested ${testfile}.exp
	    return
	}
	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}" ${objdir}/${subdir}/${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"
}
