# Copyright 2004-2021 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 {
    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"
    }
}
