| # Copyright 2021-2024 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 trap instructions inserted into |
| # the code. |
| |
| if { [istarget powerpc-*] } { |
| standard_testfile powerpc-trap.s |
| # Number of expected SIGTRAPs to get. This needs to be kept in sync |
| # with the source file powerpc-trap.s. |
| set expected_traps 3 |
| } elseif {[istarget powerpc64*] } { |
| standard_testfile powerpc64-trap.s |
| # Number of expected SIGTRAPs to get. This needs to be kept in sync |
| # with the source file powerpc64-trap.s. |
| set expected_traps 5 |
| } else { |
| unsupported "Skipping powerpc-specific tests" |
| return |
| } |
| |
| if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { |
| return -1 |
| } |
| |
| if {![runto_main]} { |
| untested "could not run to main" |
| return -1 |
| } |
| |
| set keep_going 1 |
| set count 0 |
| |
| while {$keep_going} { |
| set keep_going 0 |
| |
| # Continue to next program breakpoint instruction. |
| gdb_test_multiple "continue" "trap instruction $count causes SIGTRAP" { |
| -re "Program received signal SIGTRAP, Trace/breakpoint trap.*$gdb_prompt $" { |
| pass $gdb_test_name |
| |
| # Advance PC to next instruction |
| gdb_test "set \$pc = \$pc + 4" "" "advance past trap instruction $count" |
| |
| incr count |
| if {$count < $expected_traps} { |
| set keep_going 1 |
| } |
| } |
| } |
| } |
| |
| # Verify we stopped at the expected number of SIGTRAP's. |
| gdb_assert {$count == $expected_traps} "all trap instructions triggered" |
| |
| # One last continue to reach the end of the test, to make sure we don't get |
| # another SIGTRAP. |
| gdb_test "continue" "exited normally.*" "continue to end" |