# Copyright 2012-2014 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 . 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"