# Copyright 2012-2013 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"
}
