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

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