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

# Test inferior resumption after discarding a hand-called function.
# There are two things to test.
# 1) Inferior stops normally.  Upon resumption it should continue normally,
#    regardless of whatever signal the hand-called function got.
# 2) Inferior is stopped at a signal.  Upon resumption it should continue
#    with that signal, regardless of whatever the hand-called function did.

if [target_info exists gdb,nosignals] {
    verbose "Skipping call-signal-resume.exp because of nosignals."
    continue
}


standard_testfile call-signals.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested "failed to compile"
     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] {
    unsupported "this target can not call functions"
    continue
}

proc get_dummy_frame_number { } {
    global gdb_prompt

    gdb_test_multiple "bt" "backtrace" {
	-re "#(\[0-9\]*) *<function called from gdb>.*$gdb_prompt $" {
	    return $expect_out(1,string)
	}
    }
    return ""
}

# Start with a fresh gdb.

clean_restart ${binfile}

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

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

# 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.*" \
	 "inferior function call signaled"] != 0} {
    return 0
}

set frame_number [get_dummy_frame_number]
if { "$frame_number" == "" } {
    fail "dummy stack frame number"
    setup_xfail "*-*-*"
} else {
    pass "dummy stack frame number"
}

# Pop the dummy frame.
gdb_test "frame $frame_number" ".*"
gdb_test_no_output "set confirm off"
gdb_test "return" ""

# Verify there are no remains of the dummy frame.
gdb_test_no_output "maintenance print dummy-frames"
set test "maintenance info breakpoints"
gdb_test_multiple $test $test {
    -re " call dummy .*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "\r\n$gdb_prompt $" {
	pass $test
    }
}

# Resume execution, the program should continue without any signal.

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

# Continue again, we should get a signal.

gdb_test "continue" "Program received signal .*" \
    "continue to receipt of signal"

# Hand call another function that prematurely stops,
# then manually pop the dummy stack frame.

gdb_test "break null_hand_call" "Breakpoint \[0-9\]* at .*"
gdb_test "call null_hand_call ()" "Breakpoint \[0-9\]*, null_hand_call.*" \
    "null_hand_call"

set frame_number [get_dummy_frame_number]
if { "$frame_number" == "" } {
    fail "dummy stack frame number"
    setup_xfail "*-*-*"
    # Need something.
    set frame_number 0
} else {
    pass "dummy stack frame number"
}

# Pop the dummy frame.
gdb_test "frame $frame_number" ".*"
gdb_test_no_output "set confirm off"
gdb_test "return" ""

# Continue again, this time we should get to the signal handler.

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

# Continue one last time, the program should exit normally.

gdb_test "continue" "$inferior_exited_re normally." \
    "continue to program exit"

return 0
