# Copyright (C) 2004, 2007, 2008, 2009 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/>.

# gdb 6.1.1 on AIX had a bug where the aix-threads code called
# getthrds() incorrectly so that gdb lost track of breakpoints.
# GDB reported a SIGTRAP signal in a random thread when hitting
# a breakpoint.

if $tracelevel then {
	strace $tracelevel
}

set testfile "bp_in_thread"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
runto_main

gdb_test "break noreturn" \
         "Breakpoint 2 at .*: file .*${srcfile}, line .*" \
         "breakpoint on noreturn"

# Run the program and make sure GDB reports that we stopped after
# hitting breakpoint 1 in noreturn().

gdb_test "continue" \
         ".*Breakpoint 2, noreturn ().*" \
         "run to noreturn"

