| # This testcase is part of GDB, the GNU debugger. |
| |
| # Copyright 2014-2021 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 tstepping an instruction just as long as decr_pc_after_break |
| # after removing a breakpoint at PC. GDB used to get confused with |
| # this in non-stop mode, and adjust the PC incorrectly. PR gdb/12623. |
| |
| standard_testfile |
| |
| if [build_executable "failed to build" ${testfile} ${srcfile} {debug}] { |
| return -1 |
| } |
| |
| set linenum_for_user_bp [gdb_get_line_number "break for user-bp test here"] |
| set linenum_for_step_resume [gdb_get_line_number "break for step-resume test here"] |
| |
| proc test {non_stop displaced always_inserted} { |
| global binfile |
| global linenum_for_user_bp |
| global linenum_for_step_resume |
| global GDBFLAGS |
| |
| save_vars { GDBFLAGS } { |
| set GDBFLAGS "$GDBFLAGS -ex \"set non-stop $non_stop\"" |
| clean_restart $binfile |
| } |
| |
| gdb_test_no_output "set displaced-stepping $displaced" |
| gdb_test_no_output "set breakpoint always-inserted $always_inserted" |
| |
| if ![runto_main] { |
| return -1 |
| } |
| |
| with_test_prefix "user bp" { |
| delete_breakpoints |
| |
| gdb_breakpoint $linenum_for_user_bp |
| gdb_continue_to_breakpoint "continue to breakpoint" |
| |
| # If breakpoint always-inserted is on, this makes the location |
| # moribund. |
| delete_breakpoints |
| |
| gdb_test "si" "INSN.*insn1.*" "si advances" |
| } |
| |
| with_test_prefix "step-resume" { |
| delete_breakpoints |
| |
| gdb_breakpoint $linenum_for_step_resume |
| gdb_continue_to_breakpoint "continue to breakpoint" |
| |
| gdb_test "next" "insn1.*" |
| |
| # We're now stopped where the step-resume breakpoint for the |
| # previous "next" was. That breakpoint was removed and is now |
| # on the moribund locations list. |
| gdb_test "si" "INSN.*insn2.*" "si advances" |
| |
| delete_breakpoints |
| } |
| } |
| |
| foreach_with_prefix non_stop { "off" "on" } { |
| foreach_with_prefix displaced_step { "off" "on" } { |
| foreach_with_prefix always_inserted { "off" "on" } { |
| test $non_stop $displaced_step $always_inserted |
| } |
| } |
| } |