# Copyright 2004-2020 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 siginfo.c creates a backtrace containing a signal
# handler registered using sigaction's sa_sigaction / SA_SIGINFO.
# Some OS's (e.g., GNU/Linux) use different signal trampolines for
# sa_sigaction and sa_handler.

# This test first confirms that GDB can backtrace through the
# alternative sa_sigaction signal handler, and second that GDB can
# nexti/stepi out of such a handler.

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


standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

gdb_test "display/i \$pc"

# Advance to main
if ![runto_main] then {
    fail "can't run to main"
    return 0
}

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

# Check that GDB can step the inferior back to main
set test "step out of handler"
gdb_test_multiple "step" "${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 "$i\n"
	exp_continue
    }
    -re "\} .. handler .*${gdb_prompt} $" {
	send_gdb "step\n"
	exp_continue
    }
    -re "$inferior_exited_re normally.*${gdb_prompt} $" {
	kfail gdb/1613 "$test (program exited)"
    }
    -re "(while ..done|return 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"
    }
}
