# Copyright 2008, 2010, 2011 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 $tracelevel then {
	strace $tracelevel
}

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

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


set testfile "call-signals"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested call-signal-resume.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
}

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.

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_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.
gdb_test_multiple "call gen_signal ()" \
	"inferior function call signaled" {
    -re "\[\r\n\]*no signal\[\r\n\]+$gdb_prompt $" {
	unsupported "inferior function call signaled"
	return 0
    }
    -re "\[\r\n\]*The program being debugged was signaled.*\[\r\n\]+$gdb_prompt $" {
	pass "inferior function call signaled"
    }
}

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_no_output "return"

# 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_no_output "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
