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

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

set prompt "$gdb_prompt \\\[infrun\\\] fetch_inferior_event: exit\r\n$"
gdb_test_multiple "continue" "continue" -prompt $prompt {
    -re "Breakpoint \[0-9\]+,( .* in)? thread_func .*$prompt$" {
	pass $gdb_test_name
    }
}

gdb_test_no_output {delete $sigill_bpnum}

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