mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
1d506c26d9
This commit is the result of the following actions: - Running gdb/copyright.py to update all of the copyright headers to include 2024, - Manually updating a few files the copyright.py script told me to update, these files had copyright headers embedded within the file, - Regenerating gdbsupport/Makefile.in to refresh it's copyright date, - Using grep to find other files that still mentioned 2023. If these files were updated last year from 2022 to 2023 then I've updated them this year to 2024. I'm sure I've probably missed some dates. Feel free to fix them up as you spot them.
97 lines
4.0 KiB
Plaintext
97 lines
4.0 KiB
Plaintext
# Copyright (C) 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/>.
|
|
|
|
# Setup an unwinder that uses gdb.UnwindInfo.add_saved_register with
|
|
# the register's 'pc' and 'sp'. On some (all?) targets, these
|
|
# registers are implemented as user-registers, and so can't normally
|
|
# be written to directly.
|
|
#
|
|
# The Python unwinder now includes code similar to how the expression
|
|
# evaluator would handle something like 'set $pc=0x1234', we fetch the
|
|
# value of '$pc', and then use the value's location to tell us which
|
|
# register to write to.
|
|
#
|
|
# The unwinder defined here deliberately breaks the unwind by setting
|
|
# the unwound $pc and $sp to be equal to the current frame's $pc and
|
|
# $sp. GDB will spot this as a loop in the backtrace and terminate
|
|
# the unwind.
|
|
#
|
|
# However, by the time the unwind terminates we have already shown
|
|
# that it is possible to call add_saved_register with a user-register,
|
|
# so the test is considered passed.
|
|
#
|
|
# For completeness this test checks two cases, calling
|
|
# add_saved_register with a gdb.RegisterDescriptor and calling
|
|
# add_saved_register with a string containing the register name.
|
|
|
|
load_lib gdb-python.exp
|
|
|
|
require allow_python_tests
|
|
|
|
standard_testfile
|
|
|
|
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
|
|
return -1
|
|
}
|
|
|
|
if {![runto_main]} {
|
|
return 0
|
|
}
|
|
|
|
set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py]
|
|
|
|
gdb_breakpoint [gdb_get_line_number "Break here"]
|
|
gdb_continue_to_breakpoint "stop at test breakpoint"
|
|
|
|
# Load the script containing the unwinders. There are actually two
|
|
# unwinders defined here that will catch the same function, so we
|
|
# immediately disable one of the unwinders.
|
|
gdb_test_no_output "source ${pyfile}"\
|
|
"import python scripts"
|
|
gdb_test "disable unwinder global \"break unwinding using strings\"" \
|
|
"1 unwinder disabled" "disable the unwinder that uses strings"
|
|
|
|
# At this point we are using the unwinder that passes a
|
|
# gdb.RegisterDescriptor to add_saved_register.
|
|
gdb_test_sequence "bt" "Backtrace corrupted by descriptor based unwinder" {
|
|
"\\r\\n#0 \[^\r\n\]* foo \\(\\) at "
|
|
"\\r\\n#1 \[^\r\n\]* bar \\(\\) at "
|
|
"Backtrace stopped: previous frame inner to this frame \\(corrupt stack\\?\\)"
|
|
}
|
|
|
|
# Disable the unwinder that calls add_saved_register with a
|
|
# gdb.RegisterDescriptor, and enable the unwinder that calls
|
|
# add_saved_register with a string (containing the register name).
|
|
gdb_test "disable unwinder global \"break unwinding using descriptors\"" \
|
|
"1 unwinder disabled" "disable the unwinder that uses descriptors"
|
|
gdb_test "enable unwinder global \"break unwinding using strings\"" \
|
|
"1 unwinder enabled" "enable the unwinder that uses strings"
|
|
gdb_test_sequence "bt" "Backtrace corrupted by string based unwinder" {
|
|
"\\r\\n#0 \[^\r\n\]* foo \\(\\) at "
|
|
"\\r\\n#1 \[^\r\n\]* bar \\(\\) at "
|
|
"Backtrace stopped: previous frame inner to this frame \\(corrupt stack\\?\\)"
|
|
}
|
|
|
|
# Just for completeness, disable the string unwinder again (neither of
|
|
# our special unwinders are now enabled), and check the backtrace. We
|
|
# now get the complete stack back to main.
|
|
gdb_test "disable unwinder global \"break unwinding using strings\"" \
|
|
"1 unwinder disabled" "disable the unwinder that uses strings again"
|
|
gdb_test_sequence "bt" "Backtrace not corrupted when using no unwinder" {
|
|
"\\r\\n#0 \[^\r\n\]* foo \\(\\) at "
|
|
"\\r\\n#1 \[^\r\n\]* bar \\(\\) at "
|
|
"\\r\\n#2 \[^\r\n\]* main \\(\\) at "
|
|
}
|