1# Copyright (C) 2014-2020 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# Test that GDB doesn't get confused in the following scenario 17# (PR breakpoints/17000). Say, we have this program: 18# 19# => 0xff000001 INSN1 20# 0xff000002 INSN2 21# 22# The PC currently points at INSN1. 23# 24# 1 - User sets a breakpoint at 0xff000002 (INSN2). 25# 26# 2 - User steps. On software single-step archs, this sets a software 27# single-step breakpoint at 0xff000002 (INSN2) too. 28# 29# 3 - User deletes breakpoint (INSN2) before the single-step finishes. 30# 31# 4 - The single-step finishes, and GDB removes the single-step 32# breakpoint. 33 34# Test relies on checking gdb debug output. Do not run if gdb debug is 35# enabled as any debug will be redirected to the log. 36if [gdb_debug_enabled] { 37 untested "debug is enabled" 38 return 0 39} 40 41standard_testfile 42 43if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { 44 return -1 45} 46 47if ![runto_main] { 48 fail "can't run to main" 49 return 0 50} 51 52delete_breakpoints 53 54# With the all-stop RSP, we can't talk to the target while it's 55# running, until we get back the stop reply. If not using single-step 56# breakpoints, then the "del" in stepi_del_break below will try to 57# delete the user breakpoint from the target, which will fail, with 58# "Cannot execute this command while the target is running.". On 59# software single-step targets, that del shouldn't trigger any RSP 60# traffic. Hardware-step targets that can't access memory while the 61# target is running, either remote or native, are likewise affected. 62# So we just skip the test if not using software single-stepping. We 63# detect that by looking for 'to_resume (..., step)' in "debug 64# target" output. 65 66# Probe for software single-step breakpoint use. 67 68gdb_test_no_output "set debug target 1" 69set hardware_step 0 70set test "probe target hardware step" 71gdb_test_multiple "si" $test { 72 -re "resume \\(\[^\r\n\]+, step, .*$gdb_prompt $" { 73 set hardware_step 1 74 pass $test 75 } 76 -re "$gdb_prompt $" { 77 pass $test 78 } 79} 80 81if { $hardware_step } { 82 unsupported "target doesn't use software single-stepping" 83 return 84} 85 86gdb_test "set debug target 0" "->log_command.*\\)" 87 88set line_re "\[^\r\n\]*" 89 90gdb_test "b test:label" "Breakpoint .*" 91gdb_continue_to_breakpoint "run past setup" 92delete_breakpoints 93 94# So we can precisely control breakpoint insertion order. 95gdb_test_no_output "set breakpoint always-inserted on" 96 97# Capture disassembly output. PREFIX is used as test prefix. The 98# current instruction indicator (=>) is stripped away. 99proc disassemble { prefix } { 100 with_test_prefix "$prefix" { 101 set output [capture_command_output "disassemble test" ""] 102 return [string map {"=>" " "} $output] 103 } 104} 105 106# Issue a stepi and immediately delete the user breakpoint that is set 107# at the same address as the software single-step breakpoint. Do this 108# in a user defined command, so that the stepi's trap doesn't have a 109# chance to be handled before further input is processed. We then 110# compare before/after disassembly. GDB should be able to handle 111# deleting the user breakpoint before deleting the single-step 112# breakpoint. E.g., we shouldn't see breakpoint instructions in the 113# disassembly. 114 115set disasm_before [disassemble "before"] 116 117gdb_test "b test:label2" ".*" "set breakpoint where si will land" 118 119set test "define stepi_del_break" 120gdb_test_multiple $test $test { 121 -re "Type commands for definition of \"stepi_del_break\".\r\nEnd with a line saying just \"end\".\r\n>$" { 122 gdb_test "si&\ndel \$bpnum\nend" "" $test 123 } 124} 125 126set command "stepi_del_break" 127set test $command 128gdb_test_multiple $command $test { 129 -re "^$command\r\n$gdb_prompt " { 130 # Note no end anchor, because "si&" finishes and prints the 131 # current frame/line after the prompt is printed. 132 pass $test 133 } 134} 135 136# Now consume the output of the finished "si&". 137set test "si& finished" 138gdb_test_multiple "" $test { 139 -re "must be a single line \\\*/\r\n" { 140 pass $test 141 } 142} 143 144set disasm_after [disassemble "after"] 145 146set test "before/after disassembly matches" 147if ![string compare $disasm_before $disasm_after] { 148 pass $test 149} else { 150 fail $test 151} 152