# Copyright 2020-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/>.
#
# This file is part of the gdb testsuite.

# Test if GDB stops at various BRK instruction patterns inserted into
# the code.

if {![is_aarch64_target]} {
    verbose "Skipping ${gdb_test_file_name}."
    return
}

standard_testfile
if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
    return -1
}

if {![runto_main]} {
    return -1
}

# Number of expected SIGTRAP's to get.  This needs to be kept in sync
# with the source file.
set expected_traps 3
set keep_going 1
set count 0

# Make sure we have a lower timeout in case GDB doesn't support a particular
# instruction.  Such instruction will cause GDB to loop infinitely.
while {$keep_going} {
    # Continue to next program breakpoint instruction.
    gdb_test_multiple "continue" "brk instruction $count causes SIGTRAP" {
	-re "Program received signal SIGTRAP, Trace/breakpoint trap.*$gdb_prompt $" {
	    pass $gdb_test_name

	    # Insert a breakpoint at the program breakpoint instruction so
	    # GDB can step over it.
	    gdb_test "break" \
		"Breakpoint $decimal at $hex: file .*$srcfile, line $decimal.*" \
		"insert breakpoint at brk instruction $count"
	    incr count
	}
	# We've reached the end of the test.
	-re "exited normally.*$gdb_prompt $" {
	    set keep_going 0
	}
	timeout {
	    fail $gdb_test_name
	    set keep_going 0
	}
    }
}

# Verify we stopped at the expected number of SIGTRAP's.
gdb_assert {$count == $expected_traps} "all brk instructions triggered"
