# Copyright 2004, 2007-2008, 2010-2012 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-obj.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 we can inspect signal info using the
# $_siginfo convenience variable.

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

if { ! [istarget "i?86-*-linux*"]
     && ! [istarget "x86_64-*-linux*"]
     && ! [istarget "arm*-*-linux*"] } {
    verbose "Skipping siginfo-obj.exp because of lack of support."
    return
}


set testfile siginfo-obj
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile ${srcfile}.c"
    return -1
}

# get things started
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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

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

# Try to generate a core file, for a later test.
set gcorefile [standard_output_file $testfile.gcore]
set gcore_created [gdb_gcore_cmd $gcorefile "save a core file"]

set ssi_addr ""
set test "Extract si_addr"
gdb_test_multiple "p \$_siginfo" "$test" {
    -re "si_addr = ($hex).*$gdb_prompt $" {
	set ssi_addr $expect_out(1,string)
	pass "$test"
    }
}

set test "Extract si_errno"
gdb_test_multiple "p \$_siginfo" "$test" {
    -re "si_errno = (\[0-9\]\+).*$gdb_prompt $" {
	set ssi_errno $expect_out(1,string)
	pass "$test"
    }
}

set test "Extract si_code"
gdb_test_multiple "p \$_siginfo" "$test" {
    -re "si_code = (\[0-9\]\+).*$gdb_prompt $" {
	set ssi_code $expect_out(1,string)
	pass "$test"
    }
}

set test "Extract si_signo"
gdb_test_multiple "p \$_siginfo" "$test" {
    -re "si_signo = (\[0-9\]\+).*$gdb_prompt $" {
	set ssi_signo $expect_out(1,string)
	pass "$test"
    }
}

set bp_location [gdb_get_line_number "set breakpoint here"]

gdb_test "break $bp_location"
gdb_test "continue" ".* handler .*" "continue to handler"

gdb_test "p ssi_addr" " = \\(void \\*\\) $ssi_addr"
gdb_test "p ssi_errno" " = $ssi_errno"
gdb_test "p ssi_code" " = $ssi_code"
gdb_test "p ssi_signo" " = $ssi_signo"

# Again, but this time, patch si_addr and check that the inferior sees
# the changed value.

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

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

set test "Set si_addr"
gdb_test "p \$_siginfo._sifields._sigfault.si_addr = 0x666" " = \\(void \\*\\) 0x666"
gdb_test "p \$_siginfo.si_errno = 666" " = 666"
gdb_test "p \$_siginfo.si_code = 999" " = 999"
gdb_test "p \$_siginfo.si_signo = 11" " = 11"

gdb_test "break $bp_location"
gdb_test "continue" ".* handler .*" "continue to handler"

gdb_test "p ssi_addr" " = \\(void \\*\\) 0x666"
gdb_test "p ssi_errno" " = 666"
gdb_test "p ssi_code" " = 999"
gdb_test "p ssi_signo" " = 11"

# Test siginfo preservation in core files.
if {$gcore_created} {
    clean_restart $binfile

    gdb_test "core $gcorefile" "Core was generated by.*" \
	"core [file tail $gcorefile]"

    gdb_test "p \$_siginfo.si_signo" " = $ssi_signo" \
	"p \$_siginfo.si_signo from core file"
    gdb_test "p \$_siginfo.si_errno" " = $ssi_errno" \
	"p \$_siginfo.si_errno from core file"
    gdb_test "p \$_siginfo.si_code" " = $ssi_code" \
	"p \$_siginfo.si_code from core file"
    gdb_test "p \$_siginfo._sifields._sigfault.si_addr" \
	" = \\(void \\*\\) $ssi_addr" \
	"p \$_siginfo._sifields._sigfault.si_addr from core file"
}
