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

set prms_id 0
set bug_id 0

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

  send_gdb "bt\n"
  gdb_expect {
    -re "#(\[0-9\]*) *<function called from gdb>.*$gdb_prompt $"
      {
	return $expect_out(1,string)
      }
    -re "$gdb_prompt $"
      {
	return ""
      }
    timeout
      {
	return ""
      }
  }
  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 "set confirm off" ""
gdb_test "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 "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" "Program exited normally." \
    "continue to program exit"

return 0
