| # 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/>. |
| |
| # Test that inserting a hardware and a software breakpoint at the same |
| # address behaves as expected. GDB used to consider hw and sw |
| # breakpoint locations as duplicate locations, which would lead to bad |
| # behavior. See PR gdb/25741. |
| |
| if {[skip_hw_breakpoint_tests]} { |
| return 0 |
| } |
| |
| set test hbreak |
| set srcfile ${test}.c |
| if { [prepare_for_testing "failed to prepare" ${test} ${srcfile}] } { |
| return -1 |
| } |
| |
| if ![runto_main] { |
| return -1 |
| } |
| |
| delete_breakpoints |
| |
| gdb_test_no_output "set breakpoint always-inserted on" |
| gdb_test_no_output "set breakpoint condition-evaluation host" |
| gdb_test_no_output "set confirm off" |
| |
| # Test inserting a hw breakpoint first, then a sw breakpoint at the |
| # same address. |
| with_test_prefix "hw-sw" { |
| gdb_test "hbreak -q main" \ |
| "Hardware assisted breakpoint .* at .*" \ |
| "hbreak" |
| |
| gdb_test "break -q main" \ |
| "Note: breakpoint .* also set at .*\r\nBreakpoint .* at .*" \ |
| "break" |
| |
| # A bad GDB debugging against GDBserver would output a warning |
| # here: |
| # delete breakpoints |
| # warning: Error removing breakpoint 3 |
| # (gdb) FAIL: gdb.base/hw-sw-break-same-address.exp: hw-sw: delete breakpoints |
| gdb_test_no_output "delete breakpoints" |
| } |
| |
| # Now the opposite: test inserting a sw breakpoint first, then a hw |
| # breakpoint at the same address. |
| with_test_prefix "sw-hw" { |
| gdb_test "break -q main" \ |
| "Breakpoint .* at .*" \ |
| "break" |
| |
| gdb_test "hbreak -q main" \ |
| "Note: breakpoint .* also set at .*\r\nHardware assisted breakpoint .* at .*" \ |
| "hbreak" |
| |
| gdb_test_no_output "delete breakpoints" |
| } |