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

# This test checks both $_exitcode and $_exitsignal variables.  The
# purpose of this checking is to ensure that the variables are
# mutually exclusive, i.e., that when $_exitsignal is set, $_exitcode
# is not, and vice-versa.  This mutual exclusion happens because if an
# inferior exited (either successfuly or not), it certainly was not
# killed by a signal.  However, if it was killed by an uncaught
# signal, then there is no way for it to have exited.

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

standard_testfile segv.c

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

# Run to main
if { ![runto_main] } {
    return -1
}

# Print $_exitsignal.  It should be void now, because nothing
# happened.
gdb_test "print \$_exitsignal" " = void" \
    "\$_exitsignal is void before running"

# Just to guarantee, making sure that $_exitcode is also void.
gdb_test "print \$_exitcode" " = void" \
    "\$_exitcode is void before running"

# Trigger SIGSEGV.
gdb_test "continue" "Program received signal SIGSEGV.*" "trigger SIGSEGV"

# Continue until the end.
gdb_test "continue" "Program terminated with signal SIGSEGV.*" \
    "program terminated with SIGSEGV"

# Now, print $_exitsignal again.  It should be 11 (SIGSEGV).
gdb_test "print \$_exitsignal" " = 11" \
    "\$_exitsignal is 11 (SIGSEGV) after SIGSEGV."

# And $_exitcode should still be void, since the inferior died because
# of a signal, and did not return.
gdb_test "print \$_exitcode" " = void" \
    "\$_exitcode is still void after SIGSEGV"

# Re-run to main, i.e., restart the executable.
rerun_to_main

# Print the $_exitsignal again.  Even in this normal scenario, it
# should still contain the signal triggered in the other run.
gdb_test "print \$_exitsignal" " = 11" \
    "\$_exitsignal is 11 (SIGSEGV) after restarting the inferior"

# And, again, print $_exitcode.
gdb_test "print \$_exitcode" " = void" \
    "\$_exitcode is still void after restarting the inferior"

# Now we test the behaviour of $_exit{code,signal} during a normal
# inferior execution.
standard_testfile normal.c

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

# Checking $_exitsignal and $_exitcode, both should be void before the
# inferior is executed.
gdb_test "print \$_exitsignal" " = void" \
    "\$_exitsignal is void before normal inferior is executed"
gdb_test "print \$_exitcode" " = void" \
    "\$_exitcode is void before normal inferior is executed"

# Run the inferior until the end.
if { ![runto_main] } {
    return -1
}

gdb_continue_to_end

# Checking $_exitcode.  It should be 0.
gdb_test "print \$_exitcode" " = 0" \
    "\$_exitcode is zero after normal inferior is executed"

# Checking $_exitsignal.  It should still be void, since the inferior
# has not received any signal.
gdb_test "print \$_exitsignal" " = void" \
    "\$_exitsignal is still void after normal inferior is executed"
