| # Copyright 2021-2024 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/>. |
| |
| # Regression test for PR gdb/28621. Test that GDB does not misreport |
| # a watchpoint hit when a previous watchpoint hit is immediately |
| # followed by a catchpoint hit. |
| |
| # This test uses "awatch". |
| require allow_hw_watchpoint_access_tests |
| |
| standard_testfile |
| |
| if {[build_executable "failed to prepare" $testfile $srcfile debug]} { |
| return |
| } |
| |
| # Check that fork catchpoints are supported. Returns 1 if they are. |
| # Returns 0 and issues unsupported if they are not supported. If it |
| # couldn't be determined, returns 0 (but does not call unsupported). |
| |
| proc_with_prefix catch_fork_supported {} { |
| clean_restart $::testfile |
| |
| if { ![runto_main] } { |
| return 0 |
| } |
| |
| # Verify that the system supports "catch fork". |
| gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" "insert first fork catchpoint" |
| set has_fork_catchpoints -1 |
| gdb_test_multiple "continue" "continue to first fork catchpoint" { |
| -re -wrap ".*Your system does not support this type\r\nof catchpoint.*" { |
| set has_fork_catchpoints 0 |
| pass $gdb_test_name |
| } |
| -re -wrap ".*Catchpoint.*" { |
| set has_fork_catchpoints 1 |
| pass $gdb_test_name |
| } |
| } |
| |
| if {$has_fork_catchpoints == 1} { |
| return 1 |
| } elseif {$has_fork_catchpoints == -1} { |
| return 0 |
| } else { |
| unsupported "catch fork not supported" |
| return 0 |
| } |
| } |
| |
| # The test proper. |
| |
| proc_with_prefix test {} { |
| clean_restart $::testfile |
| |
| if { ![runto_main] } { |
| return 0 |
| } |
| |
| gdb_test "awatch global_var" \ |
| "Hardware access \\(read/write\\) watchpoint .*: global_var.*" \ |
| "watchpoint on global variable" |
| |
| gdb_test "continue" \ |
| "Hardware access \\(read/write\\) watchpoint .*: global_var.*" \ |
| "continue to watchpoint" |
| |
| set seen_watchpoint 0 |
| gdb_test_multiple "continue" "continue to catch fork" { |
| -re "watchpoint" { |
| set seen_watchpoint 1 |
| exp_continue |
| } |
| -re "$::gdb_prompt " { |
| gdb_assert { !$seen_watchpoint } $gdb_test_name |
| } |
| } |
| } |
| |
| if {![catch_fork_supported] } { |
| return |
| } |
| |
| test |