| # 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" |