mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
25bb95ea6d
gdbarches usually register functions to check when a frame is destroyed which is used with software watchpoints, since the expression of the watchpoint is no longer vlaid at this point. On amd64, this wasn't done anymore because GCC started using CFA for variable locations instead. However, clang doesn't use the CFA and instead relies on specifying when an epilogue has started, meaning software watchpoints get a spurious hit when a frame is destroyed. This patch re-adds the code to register the function that detects when a frame is destroyed, but only uses this when the producer is LLVM, so gcc code isn't affected. The logic that identifies the epilogue has been factored out into the new function amd64_stack_frame_destroyed_p_1, so the frame sniffer can call it directly, and its behavior isn't changed. This can also remove the XFAIL added to gdb.python/pq-watchpoint tests that handled this exact flaw in clang. Co-Authored-By: Andrew Burgess <aburgess@redhat.com> Approved-By: Andrew Burgess <aburgess@redhat.com>
47 lines
1.7 KiB
Plaintext
47 lines
1.7 KiB
Plaintext
# Copyright (C) 2022-2023 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/>.
|
|
|
|
# Check that Watchpoints are deleted after use.
|
|
|
|
load_lib gdb-python.exp
|
|
|
|
standard_testfile
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile]} {
|
|
return -1
|
|
}
|
|
|
|
require allow_python_tests
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
# For remote host testing
|
|
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
|
|
|
|
gdb_test_no_output "set can-use-hw-watchpoints 0" "don't use hardware watchpoints"
|
|
set for_line_no [gdb_get_line_number "main for"]
|
|
gdb_test "break $for_line_no" ".*" "set breakpoint before loop"
|
|
gdb_test "continue" ".*" "run until reaching loop"
|
|
gdb_test "clear" ".*" "delete the breakpoint before loop"
|
|
gdb_test "python print(len(gdb.breakpoints()))" "1" "check default BP count"
|
|
gdb_test "source $pyfile" ".*Python script imported.*" \
|
|
"import python scripts"
|
|
gdb_test "python print(len(gdb.breakpoints()))" "2" "check modified BP count"
|
|
gdb_test "continue" ".*" "run until program stops"
|
|
gdb_test "python print(bpt.n)" "5" "check watchpoint hits"
|
|
gdb_test "python print(len(gdb.breakpoints()))" "1" "check BP count"
|