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

# flaky
return -1

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