# static.exp -- test script, for GDB, the GNU debugger.

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

# Based on manythreads written by Jeff Johnston, contributed by Red
# Hat.


standard_testfile
set static_flag "-static"

foreach have_tls { "-DHAVE_TLS" "" } {
    if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	     executable \
	     [list debug "additional_flags=${static_flag} ${have_tls}" \
		 ]] == "" } {
	break
    }
    if { $have_tls == "" } {
	return -1
    }
}

clean_restart ${binfile}
gdb_test_no_output "set print sevenbit-strings"


# See if the static multi-threaded program runs.

runto_main
gdb_test "break sem_post"
set test "continue to main's call of sem_post"
gdb_test_multiple "continue" "$test" {
    -re "Breakpoint .*, .*sem_post .*$gdb_prompt " {
	pass "$test"
    }
    -re " received signal .*$gdb_prompt " {
	kfail gdb/1328 "$test"
    }
}
    

# See if handle SIG32 helps (a little) with a static multi-threaded
# program.

set sig "SIG32"

# SIGRTMIN is 37 on hppa-linux
if [istarget hppa*-*-*] {
  set sig "SIG37"
}

rerun_to_main
gdb_test "handle $sig nostop noprint pass"
set test "handle $sig helps"
gdb_test "continue" " .*sem_post .*" "handle $sig helps"


# See if info threads produces anything approaching a thread list.

set test "info threads"
gdb_test_multiple "info threads" "$test" {
    -re " Thread .*$gdb_prompt " {
	pass "$test"
    }
    -re "$gdb_prompt " {
	kfail gdb/1328 "$test"
    }
}


# Check that the program can be quit.

set test "GDB exits with static thread program"
gdb_test_multiple "quit" "$test" {
    -re "Quit anyway\\? \\(y or n\\) $" {
	send_gdb "y\n"
	exp_continue
    }
    eof {
        pass "$test"
    }
}
clean_restart ${binfile}


if { "$have_tls" != "" } {
    if ![runto_main] {
	return -1
    }
    gdb_breakpoint [gdb_get_line_number "tlsvar-is-set"]
    gdb_continue_to_breakpoint "tlsvar-is-set" ".* tlsvar-is-set .*"
    gdb_test "p tlsvar" " = 2" "tlsvar in thread"
    gdb_test "thread 1" ".*"
    # Unwind to main.
    gdb_test "up 10" " in main .*"
    gdb_test "p tlsvar" " = 1" "tlsvar in main"
}
