mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
98 lines
4.1 KiB
Plaintext
98 lines
4.1 KiB
Plaintext
# Copyright (C) 2021-2022 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
|
|
|
|
standard_testfile
|
|
|
|
if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } {
|
|
return -1
|
|
}
|
|
|
|
# Skip all tests if Python scripting is not enabled.
|
|
if { [skip_python_tests] } { continue }
|
|
|
|
if ![runto_main] then {
|
|
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 "
|
|
}
|