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