# This testcase is part of GDB, the GNU debugger.

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

# Test SIGILL generated by some special cases of breakpoints on ia64.  Problem
# was SIGILL being stored in non-current thread for later retrieval when its
# breakpoint has been already deleted.  moribund locations are not active in
# the default all-stop mode.

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

clean_restart $testfile

if ![runto_main] {
    return -1
}

set test "info addr label"
gdb_test_multiple $test $test {
    -re "Symbol \"label\" is at 0x\[0-9a-f\]+0 in .*\r\n$gdb_prompt $" {
	# Verify the label really starts at the start of ia64 bundle.
	pass $test

	# ia64 generates SIGILL for breakpoint at B slot of an MIB bundle.
	gdb_test "break *label+2" {Breakpoint [0-9]+ at 0x[0-9a-f]+2:.*}
    }
    -re "No symbol \"label\" in current context\\.\r\n$gdb_prompt $" {
	pass $test

	# Either this target never generates non-SIGTRAP signals or they do
	# not depend on the breakpoint address.  Try any address.
	gdb_breakpoint [gdb_get_line_number "break-here"]
    }
}

gdb_test_no_output {set $sigill_bpnum=$bpnum}

gdb_breakpoint [gdb_get_line_number "break-at-exit"]

gdb_test_no_output "set debug infrun 1"

# The ia64 SIGILL signal is visible only in the lin-lwp debug.

gdb_test "continue" "Breakpoint \[0-9\]+,( .* in)? thread_func .*"

gdb_test_no_output {delete $sigill_bpnum}

set test "continue for the pending signal"
gdb_test_multiple "continue" $test {
    -re "Breakpoint \[0-9\]+, .*break-at-exit.*\r\n$gdb_prompt $" {
	# Breakpoint has been skipped in the other thread.
	pass $test
    }
    -re "Program received signal .*\r\n$gdb_prompt $" {
	fail $test
    }
}
