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

# Copyright 2004, 2005 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

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

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

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 "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 " 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 "The program is running.  Exit anyway\\? \\(y or n\\) $" {
	send_gdb "y\n"
	exp_continue
    }
    eof {
        pass "$test"
    }
}
