Index: gdb/testsuite/gdb.multi/watchpoint-multi.exp |
diff --git a/gdb/testsuite/gdb.multi/watchpoint-multi.exp b/gdb/testsuite/gdb.multi/watchpoint-multi.exp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..09d3f7c516e47958e1e3a60fbef7766acbf9f05e |
--- /dev/null |
+++ b/gdb/testsuite/gdb.multi/watchpoint-multi.exp |
@@ -0,0 +1,94 @@ |
+# 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/>. |
+ |
+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" |