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

# Copyright 2004, 2005, 2007, 2008, 2009, 2010 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.

if $tracelevel then {
	strace $tracelevel
}


set testfile "staticthreads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
set static_flag "-static"

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

gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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 "Program 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 and hpux
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"
    }
}
