# This testcase is part of GDB, the GNU debugger.

# Copyright 2014-2020 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

    clean_restart $binfile

    gdb_test_no_output "set non-stop $non_stop"
    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
	}
    }
}
