# Copyright 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  


# The program sigstep.c creates a very simple backtrace containing one
# signal handler and signal trampoline.  A flag is set and then the
# handler returns.  This is repeated at infinitum.

# This test runs the program up to the signal handler, and then
# attempts to step/next out of the handler and back into main.

if [target_info exists gdb,nosignals] {
    verbose "Skipping sigstep.exp because of nosignals."
    continue
}

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile sigstep
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile ${module}.c"
    return -1
}

# get things started
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "display/i \$pc"

# Advance to main
if { ![runto_main] } then {
    gdb_suppress_tests;
}

# Pass all the alarms straight through (but verbosely)
# gdb_test "handle SIGALRM print pass nostop"
# gdb_test "handle SIGVTALRM print pass nostop"
# gdb_test "handle SIGPROF print pass nostop"

# Run to the signal handler, validate the backtrace.
gdb_test "break handler"
gdb_test "continue" ".* handler .*" "continue to stepi handler"
send_gdb "bt\n"
gdb_expect_list "backtrace for nexti" ".*$gdb_prompt $" {
    "\[\r\n\]+.0 \[^\r\n\]* handler "
    "\[\r\n\]+.1  .signal handler called."
    "\[\r\n\]+.2 \[^\r\n\]* main .*"
}

proc advance { i } {
    global gdb_prompt
    set prefix "$i from handler"

    # Get us back into the handler
    gdb_test "continue" ".* handler .*" "$prefix; continue to handler"

    set test "$prefix; leave handler"
    gdb_test_multiple "$i" "${test}" {
	-re "done = 1;.*${gdb_prompt} $" {
	    send_gdb "$i\n"
	    exp_continue -continue_timer
	}
	-re "\} .. handler .*${gdb_prompt} $" {
	    send_gdb "$i\n"
	    exp_continue -continue_timer
	}
	-re "Program exited normally.*${gdb_prompt} $" {
	    setup_kfail powerpc-*-*bsd* gdb/1639
	    fail "$test (program exited)"
	}
	-re "(while ..done|done = 0).*${gdb_prompt} $" {
	    # After stepping out of a function /r signal-handler, GDB will
	    # advance the inferior until it is at the first instruction of
	    # a code-line.  While typically things return to the middle of
	    # the "while..." (and hence GDB advances the inferior to the
	    # "return..." line) it is also possible for the return to land
	    # on the first instruction of "while...".  Accept both cases.
	    pass "$test"
	}
    }
}

proc advancei { i } {
    global gdb_prompt
    set prefix "$i from handleri"
    set program_exited 0

    # Get us back into the handler
    gdb_test "continue" ".* handler .*" "$prefix; continue to handler"

    set test "$prefix; leave handler"
    gdb_test_multiple "$i" "${test}" {
        -re "Cannot insert breakpoint 0.*${gdb_prompt} $" {
            # Some platforms use a special read-only page for signal
            # trampolines.  We can't set a breakpoint there, and we
            # don't gracefully fall back to single-stepping.
            setup_kfail "i?86-*-linux*" gdb/1736
            fail "$test (could not set breakpoint)"
	    return
        }
	-re "done = 1;.*${gdb_prompt} $" {
	    send_gdb "$i\n"
	    exp_continue -continue_timer
	}
	-re "\} .. handler .*${gdb_prompt} $" {
	    send_gdb "$i\n"
	    exp_continue -continue_timer
	}
	-re "signal handler called.*${gdb_prompt} $" {
	    pass "$test"
	}
	-re "main .*${gdb_prompt} $" {
	    fail "$test (in main)"
	}
	-re "Program exited normally.*${gdb_prompt} $" {
	    fail "$test (program exited)"
	    set program_exited 1
	}
	-re "Make handler return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue -continue_timer
	}
    }

    set test "$prefix; leave signal trampoline"
    gdb_test_multiple "$i" "${test}" {
	-re "while .*${gdb_prompt} $" {
	    pass "$test (in main)"
	}
	-re "signal handler called.*${gdb_prompt} $" {
	    send_gdb "$i\n"
	    exp_continue -continue_timer
	}
	-re "return .*${gdb_prompt} $" {
	    fail "$test (stepped)"
	}
	-re "Make .*frame return now.*y or n. $" {
	    send_gdb "y\n"
	    exp_continue -continue_timer
	}
	-re "Program exited normally.*${gdb_prompt} $" {
	    kfail gdb/1639 "$test (program exited)"
	    set program_exited 1
	}
	-re "The program is not being run.*${gdb_prompt} $" {
	    if { $program_exited } {
		# Previously kfailed with an exit
		pass "$test (the program is not being run)"
	    } else {
		fail "$test (the program is not being run)"
	    }
	}
    }
}

# Check that we can step/next our way out of a signal handler.

advance step
advancei stepi

advance next
advancei nexti

advancei finish
advancei return
gdb_test "set done = 1" "" "Set done as return will have skipped it"


# Check that we can step/next our way into / over a signal handler.

# There are at least the following cases: breakpoint @pc VS breakpoint
# in handler VS step / next / continue.

# Use the real-time itimer, as otherwize the process never gets enough
# time to expire the timer.

delete_breakpoints
set infinite_loop [gdb_get_line_number {while (!done)}]
gdb_test "set itimer = itimer_real"
gdb_test "break [gdb_get_line_number {done = 0}]"

# Try stepping when there's a signal pending, and a breakpoint at the
# handler.  Should step into the signal handler.

proc skip_to_handler { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i to handler"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    # Advance to the infinite loop
    gdb_test "advance $infinite_loop" "" "$prefix; advance to infinite loop"

    # Make the signal pending
    sleep 1
    
    # Insert / remove the handler breakpoint.
    gdb_test "break handler" "" "$prefix; break handler"
    gdb_test "$i" " handler .*" "$prefix; performing $i"
    gdb_test "clear handler" "" "$prefix; clear handler"
}

skip_to_handler step
skip_to_handler next
skip_to_handler continue

# Try stepping when there's a signal pending, and a breakpoint at the
# handler's entry-point.  Should step into the signal handler stopping
# at the entry-point.

# Some systems (e.x., GNU/Linux as of 2004-08-30), when delivering a
# signal, resume the process at the first instruction of the signal
# handler and not the first instruction of the signal trampoline.  The
# stack is constructed such that the signal handler still appears to
# have been called by the trampoline code.  This test checks that it
# is possible to stop the inferior, even at that first instruction.

proc skip_to_handler_entry { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i to handler entry"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    # Advance to the infinite loop
    gdb_test "advance $infinite_loop" "" "$prefix; advance to infinite loop"

    # Make the signal pending
    sleep 1
    
    # Insert / remove the handler breakpoint.
    gdb_test "break *handler" "" "$prefix; break handler"
    gdb_test "$i" " handler .*" "$prefix; performing $i"
    gdb_test "clear *handler" "" "$prefix; clear handler"
}

skip_to_handler_entry step
skip_to_handler_entry next
skip_to_handler_entry continue

# Try stepping when there's a signal pending but no breakpoints.
# Should skip the handler advancing to the next line.

proc skip_over_handler { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i over handler"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    # Advance to the infinite loop
    gdb_test "advance $infinite_loop" "" "$prefix; advance to infinite loop"

    # Make the signal pending
    sleep 1
    
    gdb_test "$i" "done = 0.*" "$prefix; performing $i"
}

skip_over_handler step
skip_over_handler next
skip_over_handler continue

# Try stepping when there's a signal pending, a pre-existing
# breakpoint at the current instruction, and a breakpoint in the
# handler.  Should advance to the signal handler.

proc breakpoint_to_handler { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i on breakpoint, to handler"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    gdb_test "break $infinite_loop" "" "$prefix; break infinite loop"
    gdb_test "break handler" "" "$prefix; break handler"

    # Continue to the infinite loop
    gdb_test "continue" "while ..done.*" "$prefix; continue to infinite loop"

    # Make the signal pending
    sleep 1
    
    setup_kfail "i*86-*-*" gdb/1738
    gdb_test "$i" " handler .*" "$prefix; performing $i"
    gdb_test "clear $infinite_loop" "" "$prefix; clear infinite loop"
    gdb_test "clear handler" "" "$prefix; clear handler"
}

breakpoint_to_handler step
breakpoint_to_handler next
breakpoint_to_handler continue

# Try stepping when there's a signal pending, and a breakpoint at the
# handler's entry instruction and a breakpoint at the current
# instruction.  Should step into the signal handler and breakpoint at
# that entry instruction.

# Some systems (e.x., GNU/Linux as of 2004-08-30), when delivering a
# signal, resume the process at the first instruction of the signal
# handler and not the first instruction of the signal trampoline.  The
# stack is constructed such that the signal handler still appears to
# have been called by the trampoline code.  This test checks that it
# is possible to stop the inferior, even at that first instruction.

proc breakpoint_to_handler_entry { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i on breakpoint, to handler entry"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    gdb_test "break $infinite_loop" "" "$prefix; break infinite loop"
    gdb_test "break *handler" "" "$prefix; break handler"

    # Continue to the infinite loop
    gdb_test "continue" "while ..done.*" "$prefix; continue to infinite loop"

    # Make the signal pending
    sleep 1
    
    setup_kfail "i*86-*-*" gdb/1738
    gdb_test "$i" " handler .*" "$prefix; performing $i"
    gdb_test "clear $infinite_loop" "" "$prefix; clear infinite loop"
    gdb_test "clear *handler" "" "$prefix; clear handler"
}

breakpoint_to_handler_entry step
breakpoint_to_handler_entry next
breakpoint_to_handler_entry continue

# Try stepping when there's a signal pending, and a pre-existing
# breakpoint at the current instruction, and no breakpoint in the
# handler.  Should advance to the next line.

proc breakpoint_over_handler { i } {
    global gdb_prompt
    global infinite_loop
    set prefix "$i on breakpoint, skip handler"
    
    # Run around to the done
    # You can add more patterns to this if you need them.
    set test "$prefix; resync"
    gdb_test_multiple "continue" "$test" {
	-re "done = 0.*$gdb_prompt " {
	    pass "$test"
	}
    }
    
    gdb_test "break $infinite_loop" "" "$prefix; break infinite loop"

    # Continue to the infinite loop
    gdb_test "continue" "while ..done.*" "$prefix; continue to infinite loop"

    # Make the signal pending
    sleep 1
    
    gdb_test "$i" "done = 0.*" "$prefix; performing $i"
    gdb_test "clear $infinite_loop" "" "$prefix; clear infinite loop"
}

breakpoint_over_handler step
breakpoint_over_handler next
breakpoint_over_handler continue
