binutils-gdb/gdb/testsuite/gdb.python/py-watchpoint.exp
Guinevere Larsen 25bb95ea6d gdb: register frame_destroyed function for amd64 gdbarch
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>
2023-12-19 13:57:16 +01:00

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"