# Copyright 2004-2013 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-addr.c arranges for a signal handler registered
# using sigaction's sa_sigaction / SA_SIGINFO to be called with
# si_addr filled in.

# This test confirms that the si_addr value is correct rather than
# having been corrupted when GDB passed the signal on to the handler.

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

if [gdb_skip_stdio_test "siginfo-addr.exp"] {
    continue
}


standard_testfile
if {[prepare_for_testing $testfile.exp $testfile $srcfile debug]} {
    untested "Couldn't compile ${srcfile}.c"
    return -1
}

gdb_test "display/i \$pc"

# Advance to main
if { ![runto_main] } then {
    gdb_suppress_tests
}

# Run to the signal.
gdb_test "continue" ".*Program received signal SIGSEGV.*" "continue to signal"

# Check for correct si_addr.
set test "program exit"
gdb_test_multiple "continue" "${test}" {
    -re "Correct si_addr" {
	pass "si_addr value"
    }
    -re "Got si_addr" {
	fail "si_addr value"
    }
}
