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

require {!target_info exists gdb,nosignals}

standard_testfile segv.c

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

# Run to main.  But, before, change cwd to get the core into the
# output directory.
set_inferior_cwd_to_output_dir

if { ![runto_main] } {
    return -1
}

# Get the inferior's PID for later.
set pid [get_inferior_pid]

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

# We don't need the core file, remove it.
remove_core $pid

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