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

if [target_info exists gdb,noinferiorio] {
    verbose "Skipping unwindonsignal.exp because of no fileio capabilities."
    continue
}

if [target_info exists gdb,nosignals] {
    verbose "Skipping unwindonsignal.exp because of nosignals."
    continue
}


# Some targets can't do function calls, so don't even bother with this
# test.
if [target_info exists gdb,cannot_call_functions] {
    setup_xfail "*-*-*" 2416
    fail "This target can not call functions"
    continue
}

standard_testfile

if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
    untested $testfile.exp
    return -1
}

if { ![runto_main] } {
    fail "Can't run to main"
    return 0
}

gdb_test "break stop_here" "Breakpoint \[0-9\]* at .*"
gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, stop_here.*" \
    "continue to breakpoint at stop_here"

# Turn on unwindonsignal.
gdb_test_no_output "set unwindonsignal on" \
	"setting unwindonsignal"

gdb_test "show unwindonsignal" \
	"Unwinding of stack .* is on." \
	"showing unwindonsignal"

# Call function (causing the program to get a signal), and see if gdb handles
# it properly.
gdb_test_multiple "call gen_signal ()" \
	"unwindonsignal, inferior function call signaled" {
    -re "\[\r\n\]*no signal\[\r\n\]+$gdb_prompt $" {
	unsupported "unwindonsignal, inferior function call signaled"
	return 0
    }
    -re "\[\r\n\]*The program being debugged was signaled.*\[\r\n\]+$gdb_prompt $" {
	pass "unwindonsignal, inferior function call signaled"
    }
}

# Verify the stack got unwound.
gdb_test "bt" \
    "#0 *\[x0-9a-f in\]*stop_here \\(.*\\) at .*#1 *\[x0-9a-f in\]*main \\(.*\\) at .*" \
	"unwindonsignal, stack unwound"

# Verify the dummy frame got removed from dummy_frame_stack.
gdb_test_multiple "maint print dummy-frames" \
	"unwindonsignal, dummy frame removed" {
    -re "\[\r\n\]*.*stack=.*code=.*\[\r\n\]+$gdb_prompt $" {
	fail "unwindonsignal, dummy frame removed"
    }
    -re "\[\r\n\]+$gdb_prompt $" {
	pass "unwindonsignal, dummy frame removed"
    }
}

return 0
