mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
140 lines
4.4 KiB
Plaintext
140 lines
4.4 KiB
Plaintext
# Copyright (C) 2014-2022 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 that when a step-over trips on a watchpoint, that watchpoint is
|
|
# reported.
|
|
|
|
standard_testfile
|
|
set executable ${testfile}
|
|
|
|
# This test verifies that a watchpoint is detected in a multithreaded
|
|
# program so the test is only meaningful on a system with hardware
|
|
# watchpoints.
|
|
if {[skip_hw_watchpoint_tests]} {
|
|
return 0
|
|
}
|
|
|
|
if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
|
executable [list debug "incdir=${objdir}"]] != "" } {
|
|
return -1
|
|
}
|
|
|
|
# The test proper. DISPLACED is true if we should try with displaced
|
|
# stepping. WITH_BP is true if we should try with a thread-specific
|
|
# breakpoint (for the wrong thread) right after the instruction that
|
|
# triggers the watchpoint.
|
|
proc do_test { displaced with_bp } {
|
|
global executable
|
|
global gdb_prompt
|
|
global hex
|
|
|
|
if ${with_bp} {
|
|
set prefix "with thread-specific bp"
|
|
} else {
|
|
set prefix "no thread-specific bp"
|
|
}
|
|
with_test_prefix "displaced=$displaced: $prefix" {
|
|
# Cover both stepping and non-stepping execution commands.
|
|
foreach command {"step" "next" "continue" } {
|
|
with_test_prefix $command {
|
|
clean_restart $executable
|
|
|
|
if ![runto_main] {
|
|
continue
|
|
}
|
|
|
|
gdb_test_no_output "set displaced-stepping $displaced"
|
|
|
|
set line [gdb_get_line_number "set wait-thread breakpoint here"]
|
|
if { ![gdb_breakpoint $line] } {
|
|
return
|
|
}
|
|
gdb_continue_to_breakpoint "run to wait-thread breakpoint"
|
|
gdb_test "info threads" "\\\* 1 .* 2 .*" "info threads shows all threads"
|
|
|
|
gdb_test_no_output "set scheduler-locking on"
|
|
|
|
delete_breakpoints
|
|
|
|
gdb_breakpoint [gdb_get_line_number "set breakpoint child here"]
|
|
gdb_test "thread 2" "Switching to .*"
|
|
gdb_continue_to_breakpoint "run to breakpoint in thread 2"
|
|
|
|
set address_triggers_watch "<invalid>"
|
|
set after_address_triggers_watch "<invalid>"
|
|
|
|
# Let the watchpoint trigger once (with the other
|
|
# thread locked), in order to find both the address of
|
|
# the instruction that triggers the watchpoint and the
|
|
# address of the instruction immediately after.
|
|
with_test_prefix "find addresses" {
|
|
gdb_test "p watch_me = 0" " = 0" "clear watch_me"
|
|
gdb_test "watch watch_me" "Hardware watchpoint .*"
|
|
|
|
gdb_test "continue" \
|
|
"Hardware watchpoint.*: watch_me.*New value = 1.*" \
|
|
"continue to watchpoint"
|
|
|
|
set msg "find addresses"
|
|
gdb_test_multiple "disassemble" $msg {
|
|
-re " ($hex) \[^\r\n\]*\r\n=> ($hex) .*$gdb_prompt $" {
|
|
set address_triggers_watch $expect_out(1,string)
|
|
set after_address_triggers_watch $expect_out(2,string)
|
|
pass $msg
|
|
}
|
|
}
|
|
|
|
delete_breakpoints
|
|
}
|
|
|
|
gdb_test "break *$address_triggers_watch" "Breakpoint .*" \
|
|
"set breakpoint at address that triggers watch"
|
|
gdb_continue_to_breakpoint \
|
|
"run to instruction that triggers watch in thread 2"
|
|
|
|
gdb_test "p counter = 0" " = 0" "unbreak loop in thread 2"
|
|
gdb_test "p watch_me = 0" " = 0" "clear watch_me"
|
|
gdb_test "watch watch_me" "Hardware watchpoint .*"
|
|
|
|
if ${with_bp} {
|
|
gdb_test "b *$after_address_triggers_watch thread 1" \
|
|
"Breakpoint .*" \
|
|
"set breakpoint specific to thread 1"
|
|
}
|
|
|
|
# Switch back to thread 1 and disable scheduler locking.
|
|
gdb_test "thread 1" "Switching to .*"
|
|
gdb_test_no_output "set scheduler-locking off"
|
|
|
|
# Thread 2 is still stopped at a breakpoint that needs
|
|
# to be stepped over. However, the instruction that
|
|
# is under the breakpoint triggers a watchpoint, which
|
|
# should trap and be reported to the user.
|
|
gdb_test "$command" "Hardware watchpoint.*: watch_me.*New value = 1.*"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach displaced { "off" "on" } {
|
|
if { $displaced != "off" && ![support_displaced_stepping] } {
|
|
continue
|
|
}
|
|
|
|
foreach with_bp { 0 1 } {
|
|
do_test $displaced $with_bp
|
|
}
|
|
}
|