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

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] {
    unsupported "this target can not call functions"
    continue
}

standard_testfile

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

if { ![runto_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.
if {[gdb_test "call gen_signal ()"  \
	 "\[\r\n\]*The program being debugged was signaled.*" \
	 "unwindonsignal, inferior function call signaled"] != 0} {
    return 0
}

# 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
