# Copyright 2004-2018 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/>.


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


standard_testfile

if {[build_executable $testfile.exp $testfile $srcfile debug]} {
    untested "failed to compile"
    return -1
}

set clear_done [gdb_get_line_number {done = 0}]
set infinite_loop [gdb_get_line_number {while (!done)}]
set other_handler_location [gdb_get_line_number "other handler location"]

# Restart GDB, set a display showing $PC, and run to main.

proc restart {} {
    global binfile

    clean_restart $binfile

    gdb_test "display/i \$pc"

    runto_main
}

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

proc validate_backtrace {} {
    with_test_prefix "validate backtrace" {
	restart

	gdb_test "break handler"
	gdb_test "continue" ".* handler .*" "continue to stepi handler"
	gdb_test_sequence "bt" "backtrace for nexti" {
	    "\[\r\n\]+.0 \[^\r\n\]* handler "
	    "\[\r\n\]+.1  .signal handler called."
	    "\[\r\n\]+.2 \[^\r\n\]* main "
	}
    }
}

validate_backtrace

# Goes to handler using ENTER_CMD, runs IN_HANDLER while in the signal
# hander, and then steps out of the signal handler using EXIT_CMD.

proc advance { enter_cmd in_handler_prefix in_handler exit_cmd } {
    global gdb_prompt inferior_exited_re
    global clear_done other_handler_location

    set prefix "$enter_cmd to handler, $in_handler_prefix in handler, $exit_cmd from handler"

    with_test_prefix $prefix {
	restart

	# Get us into the handler
	if { $enter_cmd == "continue" } {
	    gdb_test "break handler"
	} else {
	    gdb_test "handle SIGALRM print pass stop"
	    gdb_test "handle SIGVTALRM print pass stop"
	    gdb_test "continue" "Program received signal.*" "continue to signal"
	}
	gdb_test "$enter_cmd" ".*handler .*" "$enter_cmd to handler"

	delete_breakpoints

	uplevel 1 $in_handler

	if { $exit_cmd == "continue" } {
	    gdb_test "break $clear_done" ".*" "break clear done"
	}

	set test "leave handler"
	gdb_test_multiple "$exit_cmd" "${test}" {
	    -re "Could not insert single-step breakpoint.*$gdb_prompt $" {
		setup_kfail gdb/8841 "sparc*-*-openbsd*"
		fail "$test (could not insert single-step breakpoint)"
	    }
	    -re "Cannot insert breakpoint.*Cannot access memory.*$gdb_prompt $" {
		setup_kfail gdb/8841 "nios2*-*-linux*"
		fail "$test (could not insert single-step breakpoint)"
	    }
	    -re "done = 1;.*${gdb_prompt} $" {
		send_gdb "$exit_cmd\n"
		exp_continue -continue_timer
	    }
	    -re "\} .. handler .*${gdb_prompt} $" {
		send_gdb "$exit_cmd\n"
		exp_continue -continue_timer
	    }
	    -re "$inferior_exited_re normally.*${gdb_prompt} $" {
		setup_kfail gdb/8744 powerpc-*-*bsd*
		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"
	    }
	}
    }
}

# Map of PREFIX => "things to do within the signal handler", for the
# advance tests.

set in_handler_map {
    "nothing" {
    }
    "si+advance" {
	# Advance to the second location in handler.
	gdb_test "si" "handler.*" "si in handler"

	set test "advance in handler"
	gdb_test_multiple "advance $other_handler_location" $test {
	    -re "Program received signal SIGTRAP.*$gdb_prompt $" {
		# On some versions of Linux (observed on
		# 3.16.4-200.fc20.x86_64), using PTRACE_SINGLESTEP+sig
		# to step into a signal handler, and then issuing
		# another PTRACE_SINGLESTEP within the handler ends up
		# with $eflags.TF mistakenly set, which results in
		# subsequent PTRACE_CONTINUEs trapping after each
		# insn.
		if {$enter_cmd != "continue"} {
		    setup_xfail "i?86-*-linux*" gdb/17511
		    setup_xfail "x86_64-*-linux*" gdb/17511
		}
		fail "$test (spurious SIGTRAP)"
		return
	    }
	    -re "other handler location.*$gdb_prompt $" {
		pass $test
	    }
	}
    }
}

# Check that we can step/next/continue, etc. our way in and out of a
# signal handler.  Also test that we can step, and run to a breakpoint
# within the handler.

foreach enter_cmd { "stepi" "nexti" "step" "next" "continue" } {
    if { $enter_cmd != "continue" && ![can_single_step_to_signal_handler] } {
	continue
    }

    foreach exit_cmd { "step" "next" "continue" } {
	foreach {in_handler_prefix in_handler} $in_handler_map {
	    advance $enter_cmd $in_handler_prefix $in_handler $exit_cmd
	}
    }
}

proc advancei { cmd } {
    global gdb_prompt inferior_exited_re

    with_test_prefix "$cmd from handleri" {
	restart

	# Get us into the handler.
	gdb_test "break handler"
	gdb_test "continue" ".* handler .*" "continue to handler"

	set program_exited 0
	set test "leave handler"
	gdb_test_multiple "$cmd" "${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 gdb/8841 "i?86-*-linux*"
		setup_kfail gdb/8841 "*-*-openbsd*"
		setup_kfail gdb/8841 "nios2-*-linux*"
		fail "$test (could not set breakpoint)"
		return
	    }
	    -re "Could not insert single-step breakpoint.*$gdb_prompt $" {
		setup_kfail gdb/8841 "sparc*-*-openbsd*"
		fail "$test (could not insert single-step breakpoint)"
	    }
	    -re "Breakpoint \[0-9\]*, handler .*${gdb_prompt} $" {
		fail "$test (hit breakpoint again)"
	    }
	    -re "done = 1;.*${gdb_prompt} $" {
		send_gdb "$cmd\n"
		exp_continue -continue_timer
	    }
	    -re "\} .. handler .*${gdb_prompt} $" {
		send_gdb "$cmd\n"
		exp_continue -continue_timer
	    }
	    -re "signal handler called.*${gdb_prompt} $" {
		pass "$test"
	    }
	    -re "main .*${gdb_prompt} $" {
		fail "$test (in main)"
	    }
	    -re "$inferior_exited_re 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 "leave signal trampoline"
	gdb_test_multiple "$cmd" "${test}" {
	    -re "while .*${gdb_prompt} $" {
		pass "$test (in main)"
	    }
	    -re "signal handler called.*${gdb_prompt} $" {
		send_gdb "$cmd\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 "$inferior_exited_re normally.*${gdb_prompt} $" {
		kfail gdb/8744 "$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 our way out of a signal handler, using
# commands that first step out to the signal trampoline, and then out
# to the mainline code.

foreach cmd {"stepi" "nexti" "finish" "return"} {
    advancei $cmd
}

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


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

proc skip_to_handler { cmd } {
    global infinite_loop

    with_test_prefix "$cmd to handler" {
	restart
	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	# Advance to the infinite loop.
	gdb_test "advance $infinite_loop" ".*" "advance to infinite loop"

	# Make the signal pending.
	sleep 1

	# Insert the handler breakpoint.
	gdb_test "break handler" ".*" "break handler"

	# Step into the handler.
	gdb_test "$cmd" " handler .*" "performing $cmd"
    }
}

foreach cmd {"step" "next" "continue"} {
    skip_to_handler $cmd
}

# 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 { cmd } {
    global infinite_loop

    with_test_prefix "$cmd to handler entry" {
	restart
	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	# Advance to the infinite loop.
	gdb_test "advance $infinite_loop" ".*" "advance to infinite loop"

	# Make the signal pending.
	sleep 1

	# Insert / remove the handler breakpoint.
	gdb_test "break *handler" ".*" "break handler"
	gdb_test "$cmd" " handler .*" "performing $cmd"
    }
}

foreach cmd {"stepi" "nexti" "step" "next" "continue"} {
    skip_to_handler_entry $cmd
}

# Get the address of where a single-step should land.

proc get_next_pc {test} {
    global gdb_prompt
    global hex

    set next ""
    gdb_test_multiple "x/2i \$pc" $test {
	-re "$hex .*:\[^\r\n\]+\r\n\[ \]+($hex).*\.\r\n$gdb_prompt $" {
	    set next $expect_out(1,string)
	    pass $test
	}
    }

    return $next
}

# Test that the command skipped over the handler.

proc test_skip_handler {cmd} {
    if {$cmd == "stepi" || $cmd == "nexti"} {
	set next_pc [get_next_pc "get next PC"]
	gdb_test "$cmd" "dummy = 0.*" "performing $cmd"
	gdb_test "p /x \$pc" " = $next_pc" "advanced"
    } else {
	gdb_test "$cmd" "done = 0.*" "performing $cmd"
    }
}

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

proc skip_over_handler { cmd } {
    global infinite_loop
    global clear_done

    with_test_prefix "$cmd over handler" {
	restart
	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	gdb_test "break $clear_done" ".*" "break clear done"

	# Advance to the infinite loop.
	gdb_test "advance $infinite_loop" ".*" "advance to infinite loop"

	# Make the signal pending.
	sleep 1

	test_skip_handler $cmd
    }
}

foreach cmd {"stepi" "nexti" "step" "next" "continue"} {
    skip_over_handler $cmd
}

# 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.  DISPLACED indicates
# whether to try with or without displaced stepping (to exercise the
# different techniques of stepping over the breakpoint at the current
# instruction).

proc breakpoint_to_handler { displaced cmd } {
    global infinite_loop

    with_test_prefix "displaced=$displaced: $cmd on breakpoint, to handler" {
	restart

	gdb_test_no_output "set displaced-stepping $displaced"

	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	gdb_test "break $infinite_loop" ".*" "break infinite loop"
	gdb_test "break handler" ".*" "break handler"

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

	# Make the signal pending.
	sleep 1

	gdb_test "$cmd" " handler .*" "performing $cmd"

	# Make sure we the displaced stepping scratch pad isn't in the
	# backtrace.
	gdb_test_sequence "bt" "backtrace" {
	    "\[\r\n\]+.0 \[^\r\n\]* handler "
	    "\[\r\n\]+.1  .signal handler called."
	    "\[\r\n\]+.2 \[^\r\n\]* main "
	}
    }
}

foreach displaced {"off" "on"} {
    foreach cmd {"step" "next" "continue"} {
	breakpoint_to_handler $displaced $cmd
    }
}

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

# DISPLACED indicates whether to try with or without displaced
# stepping (to exercise the different techniques of stepping over the
# breakpoint at the current instruction).
proc breakpoint_to_handler_entry { displaced cmd } {
    global infinite_loop

    with_test_prefix "displaced=$displaced: $cmd on breakpoint, to handler entry" {
	restart

	gdb_test_no_output "set displaced-stepping $displaced"

	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	gdb_test "break $infinite_loop" ".*" "break infinite loop"
	gdb_test "break *handler" ".*" "break handler"

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

	# Make the signal pending.
	sleep 1

	gdb_test "$cmd" " handler .*" "performing $cmd"

	# Make sure we the displaced stepping scratch pad isn't in the
	# backtrace.
	gdb_test_sequence "bt" "backtrace" {
	    "\[\r\n\]+.0 \[^\r\n\]* handler "
	    "\[\r\n\]+.1  .signal handler called."
	    "\[\r\n\]+.2 \[^\r\n\]* main "
	}
    }
}

foreach displaced {"off" "on"} {
    foreach cmd {"step" "next" "continue"} {
	breakpoint_to_handler_entry $displaced $cmd
    }
}

# 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/instruction.  DISPLACED
# indicates whether to try with or without displaced stepping (to
# exercise the different techniques of stepping over the breakpoint at
# the current instruction).  If SW_WATCH is true, set a software
# watchpoint, which exercises stepping the breakpoint instruction
# while delivering a signal at the same time.  If NO_HANDLER, arrange
# for the signal's handler be SIG_IGN, thus when the software
# watchpoint is also set, testing stepping a breakpoint instruction
# and immediately triggering the breakpoint (exercises
# adjust_pc_after_break logic).

proc breakpoint_over_handler { displaced cmd with_sw_watch no_handler } {
    global infinite_loop
    global clear_done

    set prefix "$cmd on breakpoint, skip handler"
    if { $with_sw_watch } {
	append prefix ", with sw-watchpoint"
    }
    if { $no_handler } {
	append prefix ", no handler"
    }

    with_test_prefix "displaced=$displaced: $prefix" {
	restart

	gdb_test_no_output "set displaced-stepping $displaced"

	# Use the real-time itimer, as otherwize the process never gets
	# enough time to expire the timer.
	gdb_test_no_output "set itimer = itimer_real"

	if {$no_handler} {
	    gdb_test "print no_handler = 1" " = 1" \
		"set no_handler"
	}

	gdb_test "break $infinite_loop" ".*" "break infinite loop"

	gdb_test "break $clear_done" ".*" "break clear done"

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

	# Make the signal pending
	sleep 1

	if { $with_sw_watch } {
	    # A watchpoint on a convenience variable is always a
	    # software watchpoint.
	    gdb_test "watch \$convenience" "Watchpoint .*: \\\$convenience"
	}

	if {$no_handler} {
	    # With no handler, we need to set the global ourselves
	    # manually.
	    gdb_test "print done = 1" " = 1" "set done"
	}

	test_skip_handler $cmd
    }
}

foreach displaced {"off" "on"} {
    foreach cmd {"stepi" "nexti" "step" "next" "continue"} {
	foreach with_sw_watch {0 1} {
	    foreach no_handler {0 1} {
		breakpoint_over_handler $displaced $cmd $with_sw_watch $no_handler
	    }
	}
    }
}
