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

standard_testfile
set executable ${testfile}

# Multiple inferiors are needed, therefore both native and extended gdbserver
# modes are supported.  Only non-extended gdbserver is not supported.
if [target_info exists use_gdb_stub] {
    untested ${testfile}.exp
    return
}

# Do not use simple hardware watchpoints ("watch") as its false hit may be
# unnoticed by GDB if it reads it still has the same value.
if [skip_hw_watchpoint_access_tests] {
    untested "${testfile} (no hardware access watchpoints)"
    return
}

if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested ${testfile}.exp
    return -1
}

clean_restart $executable

# Simulate non-stop+target-async which also uses breakpoint always-inserted.
gdb_test_no_output "set breakpoint always-inserted on"
# displaced-stepping is also needed as other GDB sometimes still removes the
# breakpoints, even with always-inserted on.
# Without the support this test just is not as thorough as it could be.
if [support_displaced_stepping] {
    gdb_test_no_output "set displaced-stepping on"
}

# Debugging of this testcase:
#gdb_test_no_output "maintenance set show-debug-regs on"
#gdb_test_no_output "set debug infrun 1"

gdb_breakpoint main {temporary}
gdb_test "run" "Temporary breakpoint.* main .*" "start to main inferior 1"

gdb_test "add-inferior" "Added inferior 2" "add inferior 2"
gdb_test "inferior 2" "witching to inferior 2 .*" "switch to inferior 2, first time"
gdb_load $binfile

gdb_breakpoint main {temporary}
gdb_test "run" "Temporary breakpoint.* main .*" "start to main inferior 2"

gdb_test "awatch c" \
    "Hardware access \\(read/write\\) watchpoint \[0-9\]+: c" \
    "awatch c on inferior 2"

gdb_breakpoint "marker_exit"

gdb_test "inferior 1" "witching to inferior 1 .*" "switch back to inferior 1"

if [skip_hw_watchpoint_multi_tests] {
    # On single hardware watchpoint at least test the watchpoint in inferior
    # 2 is not hit.
} else {
    gdb_test "awatch b" \
	"Hardware access \\(read/write\\) watchpoint \[0-9\]+: b" \
	"awatch b on inferior 1"

    gdb_test "inferior 2" "witching to inferior 2 .*" "switch to inferior 2 again"

    # FAIL would be a hit on watchpoint for `b' - that one is for the other
    # inferior.
    gdb_test "continue" \
	"Hardware access \\(read/write\\) watchpoint \[0-9\]+: c\r\n\r\nOld value = 0\r\nNew value = 3\r\n.*" \
	"catch c on inferior 2"

    gdb_test "continue" "Breakpoint \[0-9\]+, marker_exit .*" "catch marker_exit in inferior 2"

    gdb_test "inferior 1" "witching to inferior 1 .*" "switch back to inferior 1 again"

    gdb_test "continue" "Hardware access \\(read/write\\) watchpoint \[0-9\]+: b\r\n\r\nOld value = 0\r\nNew value = 2\r\n.*" "catch b on inferior 1"
}

gdb_test "continue" "Breakpoint \[0-9\]+, marker_exit .*" "catch marker_exit in inferior 1"
