# Copyright (C) 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/>.

# 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 "
}
