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

# Copyright 2011-2013 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 ${testfile}.exp ${testfile} ${srcfile} {debug}] {
    untested ${testfile}.exp
    return -1
}

if ![runto_main] then {
    untested ${testfile}.exp
    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.

gdb_test_multiple "x 0" "memory at address 0" {
    -re "0x0:.*Cannot access memory at address 0x0.*$gdb_prompt $" { }
    -re "0x0:.*Error accessing memory address 0x0.*$gdb_prompt $" { }
    -re ".*$gdb_prompt $" {
	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"

