# This testcase is part of GDB, the GNU debugger.

# Copyright 2009, 2010, 2011 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 GDB can cope with two watchpoints being hit by different threads at the
# same time, GDB reports one of them and after "continue" to report the other
# one GDB should not be confused by differently set watchpoints that time.
# This is the goal of "reorder1".  "reorder0" tests the basic functionality of
# two watchpoints being hit at the same time, without reordering them during the
# stop.  The formerly broken functionality is due to the all-stop mode default
# "show breakpoint always-inserted" being "off".  Formerly the remembered hit
# could be assigned during continuation of a thread with pending SIGTRAP to the
# different/new watchpoint, just based on the watchpoint/debug register number.

if {[skip_hw_watchpoint_access_tests]
    || [skip_hw_watchpoint_multi_tests]
    || ![istarget *-*-linux*]} {
    return 0
}

set testfile "watchthreads-reorder"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" ${binfile} executable [list debug additional_flags=-lrt]] != "" } {
    return -1
}

foreach reorder {0 1} {

    global pf_prefix
    set prefix_test $pf_prefix
    lappend pf_prefix "reorder$reorder:"

    clean_restart $testfile

    gdb_test "set can-use-hw-watchpoints 1"

    if ![runto_main] {
	return -1
    }

    # Use "rwatch" as "watch" would report the watchpoint changed just based on its
    # read memory value during a stop by unrelated event.  We are interested in not
    # losing the hardware watchpoint trigger.

    gdb_test "rwatch thread1_rwatch" "Hardware read watchpoint \[0-9\]+: thread1_rwatch"
    set test "rwatch thread2_rwatch"
    gdb_test_multiple $test $test {
	-re "Target does not support this type of hardware watchpoint\\.\r\n$gdb_prompt $" {
	    # ppc64 supports at most 1 hw watchpoints.
	    unsupported $test
	    return
	}
	-re "Hardware read watchpoint \[0-9\]+: thread2_rwatch\r\n$gdb_prompt $" {
	    pass $test
	}
    }
    gdb_breakpoint [gdb_get_line_number "break-at-exit"]

    # The watchpoints can happen in arbitrary order depending on random:
    # SEL: Found 2 SIGTRAP events, selecting #[01]
    # As GDB contains no srand() on the specific host/OS it will behave always the
    # same.  Such order cannot be guaranteed for GDB in general.

    gdb_test "continue" \
	     "Hardware read watchpoint \[0-9\]+: thread\[12\]_rwatch\r\n\r\nValue = 0\r\n0x\[0-9a-f\]+ in thread\[12\]_func .*" \
	     "continue a"

    if $reorder {
	# GDB orders watchpoints by their addresses so inserting new variables
	# with lower addresses will shift the former watchpoints to higher
	# debug registers.

	gdb_test "rwatch unused1_rwatch" "Hardware read watchpoint \[0-9\]+: unused1_rwatch"
	gdb_test "rwatch unused2_rwatch" "Hardware read watchpoint \[0-9\]+: unused2_rwatch"
    }

    gdb_test "continue" \
	     "Hardware read watchpoint \[0-9\]+: thread\[12\]_rwatch\r\n\r\nValue = 0\r\n0x\[0-9a-f\]+ in thread\[12\]_func .*" \
	     "continue b"

    # While the debug output itself is not checked in this testcase one bug was
    # found in the DEBUG_INFRUN code path.
    gdb_test "set debug infrun 1"

    gdb_continue_to_breakpoint "break-at-exit" ".*break-at-exit.*"

    set pf_prefix $prefix_test
}
