# Copyright 2021-2023 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 . # 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