# Copyright 2008, 2010-2012 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
}


set testfile "unwindonsignal"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested unwindonsignal.exp
     return -1
}

# 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
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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
