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


# Multi-threaded siginfo test.

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

if { ![supports_get_siginfo_type] } {
    verbose "Skipping siginfo-thread.exp because of lack of support."
    return
}

standard_testfile .c

if  {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" \
	  "${binfile}" executable {debug}] != "" } {
    return -1
}

clean_restart $binfile

# Advance to main
if ![runto_main] then {
    fail "can't run to main"
    return 0
}

# Run to the signal.
gdb_test "continue" "Thread .* 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"

gdb_test "thread 1" ".*"
# siginfo is available here -- it shows SIGSTOP -- so we test to make
# sure that we have a different signal from the SEGV thread.
gdb_test "p \$_siginfo.si_signo == $ssi_signo" " = 0" \
    "test signal in main thread"

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

    # We don't know which thread will be signalled, so we simply
    # ensure that only one thread got a SEGV.
    gdb_test_no_output "set variable \$count = 0"
    foreach thread {1 2} {
	gdb_test "thread $thread" ".*" "select thread $thread with core file"
	gdb_test_no_output \
	    "set variable \$count += (\$_siginfo.si_signo == $ssi_signo)" \
	    "update counter in thread $thread"
    }
    gdb_test "print \$count" " = 1"
}
