# Copyright 2018-2025 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/>.

# This test verifies that we can read and write the value of a pseudo register
# in unwound frames.  For the test, we choose one raw register, rbx, and one
# pseudo register that is backed by rbx, ebx.  We have two frames (the inner one,
# #0 and the outer one, #1) that each set a value for rbx.  We verify that we
# can read both rbx and ebx correctly for each frame, and that when we write to
# ebx, rbx for that frame is correctly updated.

if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
    verbose "Skipping amd64 pseudo register unwind."
    return
}

standard_testfile amd64-pseudo-unwind.c amd64-pseudo-unwind-asm.S

if { [prepare_for_testing "failed to prepare" ${testfile} \
	"${srcfile} ${srcfile2}" {debug}] } {
    return -1
}

clean_restart ${binfile}

if {![runto_main]} {
    return
}

gdb_breakpoint break_here_asm temporary
gdb_continue_to_breakpoint "continue to callee"

# Verify the value of rbx/ebx in the inner frame (callee).
with_test_prefix "callee, before change" {
    gdb_test "p/x \$rbx" " = 0x2021222324252627"
    gdb_test "p/x \$ebx" " = 0x24252627"
}

# Verify that we can change the value of the pseudo register (ebx) in the inner
# frame (callee).
gdb_test_no_output "set \$ebx = 0x34353637"

# Verify the value of rbx/ebx in the inner frame (callee) after the change.
with_test_prefix "callee, after change" {
    gdb_test "p/x \$rbx" " = 0x2021222334353637"
    gdb_test "p/x \$ebx" " = 0x34353637"
}

# Go up one frame, and do the same.
gdb_test "up"

# Verify the value of rbx/ebx in the outer frame (caller).
with_test_prefix "caller, before change" {
    gdb_test "p/x \$rbx" " = 0x1011121314151617"
    gdb_test "p/x \$ebx" " = 0x14151617"
}

# Verify that we can change the value of the pseudo register (ebx) in the outer
# frame (caller).
gdb_test_no_output "set \$ebx = 0x44454647"

# Verify the value of rbx/ebx in the outer frame (caller) after the change.
with_test_prefix "caller, after change" {
    gdb_test "p/x \$rbx" " = 0x1011121344454647"
    gdb_test "p/x \$ebx" " = 0x44454647"
}

# Go back to frame 0 (callee), check that the change to the outer frame didn't
# mess up anything there.
gdb_test "down"
with_test_prefix "callee, after change in caller" {
    gdb_test "p/x \$rbx" " = 0x2021222334353637"
    gdb_test "p/x \$ebx" " = 0x34353637"
}

# Verify that the value of the saved rbx we changed is correctly seen by the
# inferior.
gdb_breakpoint break_here_c temporary
gdb_continue_to_breakpoint "continue to break_here_c"
gdb_test "p/x value" " = 0x1011121344454647"
