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

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

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


standard_testfile
set static_flag "-static"

foreach_with_prefix 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 " ${tdlabel_re} .*$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"
}
