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

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

standard_testfile

if [target_info exists gdb,nosignals] {
    verbose "Skipping ${testfile}.exp because of nosignals."
    return -1
}

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

if ![runto_main] then {
    return -1
}

# If we can examine what's at memory address 0, it is possible that we
# could also execute it.  This could probably make us run away,
# executing random code, which could have all sorts of ill effects,
# especially on targets without an MMU.  Don't run the tests in that
# case.

if { [is_address_zero_readable] } {
    untested "memory at address 0 is possibly executable"
    return -1
}

# Run until we hit the SIGSEGV (or SIGBUS on some platforms).
gdb_test "continue" \
	 ".*Program received signal (SIGBUS|SIGSEGV).*bowler.*" \
         "continue to fault"

# Insert conditional breakpoint at faulting instruction
gdb_test "break if 0" ".*" "set conditional breakpoint"

# Set SIGSEGV/SIGBUS to pass+nostop
gdb_test "handle SIGSEGV nostop print pass" ".*" "pass SIGSEGV"
gdb_test "handle SIGBUS nostop print pass" ".*" "pass SIGBUS"

# Step off the faulting instruction into the handler, triggering nested faults
gdb_test "continue" \
         ".*Program received signal (SIGBUS|SIGSEGV).*Program received signal (SIGBUS|SIGSEGV).*exited normally.*" \
	 "run through nested faults"

