# Copyright 2018-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/>.

# This testcase is a regression test for a regression in the in-line
# step-over machinery.  If a resumption that starts a step-over
# failed, a following resumption would make GDB hang forever:
#
#  (gdb) b *0
#  Breakpoint 2 at 0x0
#  continue
#  Continuing.
#  Warning:
#  Cannot insert breakpoint 2.
#  Cannot access memory at address 0x0
#
#  Command aborted.
#  delete breakpoints
#  Delete all breakpoints? (y or n) y
#  (gdb) b function
#  Breakpoint 3 at 0x40048b: file test.c, line 33.
#  continue
#  Continuing.
#  *GDB hangs forever*

standard_testfile

if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

# DISPLACED indicates whether to use displaced-stepping.
proc do_test {displaced breakpoint_always_inserted} {
    global gdb_prompt decimal
    global srcfile binfile

    clean_restart $binfile

    gdb_test_no_output "set displaced-stepping $displaced"
    gdb_test_no_output "set breakpoint always-inserted $breakpoint_always_inserted"

    if ![runto_main] {
	return -1
    }

    # We rely on not being able to set a breakpoint at 0, as proxy for
    # any kind of breakpoint insertion failure.  If we can examine
    # what's at memory address 0, it is possible that we could also
    # execute it.
    if [is_address_zero_readable] {
	untested "memory at address 0 is possibly executable"
	return
    }

    # Set a breakpoint that fails to insert.
    if { $breakpoint_always_inserted == "on" } {
	gdb_test "b *0" "Breakpoint $decimal at 0x0.*"
    } else {
	gdb_test "b *0" "Breakpoint $decimal at 0x0"
    }

    gdb_test "continue" \
	"Command aborted\\." \
	"continue aborts"

    # Delete the "bad" breakpoint and try continuing again.
    delete_breakpoints
    gdb_test "b function" "Breakpoint $decimal .*$srcfile.*"

    gdb_test "continue" \
	"Breakpoint $decimal, function \\(\\) at .*$srcfile:.*" \
	"continue to function"
}

# This testcase exercises a regression with the in-line step-over
# machinery.  So make sure this runs with displaced stepping disabled,
# and for good measure, also try with displaced stepping enabled.
foreach_with_prefix displaced-stepping {"off" "on"} {
    foreach_with_prefix breakpoint-always-inserted {"off" "on"} {
	do_test ${displaced-stepping} ${breakpoint-always-inserted}
    }
}
