# 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} {
    global testfile objdir subdir srcdir gdb_prompt

    global pf_prefix
    set prefix_test $pf_prefix
    lappend pf_prefix "$type:"
    set prefix_mt $pf_prefix

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


    # no threads

    set pf_prefix $prefix_mt
    lappend pf_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
	set pf_prefix $prefix_test
	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] {
	set pf_prefix $prefix_test
	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.
	set pf_prefix $prefix_test
	return
    }

    set pf_prefix $prefix_mt
    lappend pf_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
	set pf_prefix $prefix_test
	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] {
	set pf_prefix $prefix_test
	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"


    # cleanup
    set pf_prefix $prefix_test
}

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