binutils-gdb/gdb/testsuite/gdb.reverse/finish-reverse-next.exp
Pedro Alves 5fec7411a2 gdb_is_target_remote -> gdb_protocol_is_remote
This is similar to the previous patch, but for gdb_protocol_is_remote.

gdb_is_target_remote and its MI cousin mi_is_target_remote, use "maint
print target-stack", which is unnecessary when checking whether
gdb_protocol is "remote" or "extended-remote" would do.  Checking
gdb_protocol is more efficient, and can be done before starting GDB
and running to main, unlike gdb_is_target_remote/mi_is_target_remote.

This adds a new gdb_protocol_is_remote procedure, and uses it in place
of gdb_is_target_remote/mi_is_target_remote throughout.

There are no uses of gdb_is_target_remote/mi_is_target_remote left
after this.  Those will be eliminated in a following patch.

In some spots, we no longer need to defer the check until after
starting GDB, so the patch adjusts accordingly.

Change-Id: I90267c132f942f63426f46dbca0b77dbfdf9d2ef
Approved-By: Tom Tromey <tom@tromey.com>
2024-04-26 21:22:48 +01:00

204 lines
8.1 KiB
Plaintext

# Copyright 2008-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/>. */
# This file is part of the GDB testsuite. It tests reverse stepping.
# Lots of code borrowed from "step-test.exp".
# The reverse finish command should return from a function and stop on
# the first instruction of the source line where the function call is made.
# Specifically, the behavior should match doing a reverse next from the
# first instruction in the function. GDB should only take one reverse step
# or next statement to reach the previous source code line.
# This testcase verifies the reverse-finish command stops at the first
# instruction in the source code line where the function was called. There
# are two scenarios that must be checked:
# 1) gdb is at the entry point instruction for the function
# 2) gdb is in the body of the function.
# This test verifies the fix for gdb bugzilla:
# https://sourceware.org/bugzilla/show_bug.cgi?id=29927
# PowerPC supports two entry points to a function. The normal entry point
# is called the local entry point (LEP). The alternate entry point is called
# the global entry point (GEP). A function call via a function pointer
# will entry via the GEP. A normal function call will enter via the LEP.
#
# This test has been expanded to include tests to verify the reverse-finish
# command works properly if the function is called via the GEP. The original
# test only verified the reverse-finish command for a normal call that used
# the LEP.
if ![supports_reverse] {
return
}
standard_testfile
if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
return -1
}
runto_main
if [supports_process_record] {
# Activate process record/replay.
gdb_test_no_output "record" "turn on process record for test1"
}
### TEST 1: reverse finish from the entry point instruction (LEP) in
### function1 when called using the normal entry point (LEP).
# Set breakpoint at call to function1 in main.
set bp_LEP_test [gdb_get_line_number "CALL VIA LEP" $srcfile]
gdb_breakpoint $srcfile:$bp_LEP_test temporary
# Continue to break point at function1 call in main.
gdb_continue_to_breakpoint \
"stopped at function1 entry point instruction to stepi into function" \
".*$srcfile:$bp_LEP_test\r\n.*"
# stepi until we see "{" indicating we entered function1
repeat_cmd_until "stepi" "CALL VIA LEP" "{" "stepi into function1 call" "100"
# The reverse-finish command should stop on the function call instruction
# which is the last instruction in the source code line. Another reverse-next
# instruction stops at the previous source code line.
gdb_test "reverse-finish" ".*function1 \\(a, b\\); // CALL VIA LEP.*" \
"reverse-finish function1 LEP call from LEP "
gdb_test "reverse-next" ".*b = 5;.*" "reverse next 2, at b = 5, call from LEP"
gdb_test "reverse-continue" ".*" "setup for test 2"
# Turn off record to clear logs and turn on again
gdb_test "record stop" "Process record is stopped.*" \
"turn off process record for test1"
gdb_test_no_output "record" "turn on process record for test2"
### TEST 2: reverse finish from the body of function1.
# Set breakpoint at call to function1 in main.
gdb_breakpoint $srcfile:$bp_LEP_test temporary
# Continue to break point at function1 call in main.
gdb_continue_to_breakpoint \
"at function1 entry point instruction to step to body of function" \
".*$srcfile:$bp_LEP_test\r\n.*"
# do a step instruction to get to the body of the function
gdb_test "step" ".*int ret = 0;.*" "step test 1"
# The reverse-finish command should stop on the function call instruction
# which is the last instruction in the source code line. Another reverse-next
# instruction stops at the previous source code line.
gdb_test "reverse-finish" ".*function1 \\(a, b\\); // CALL VIA LEP.*" \
"reverse-finish function1 LEP call from function body"
gdb_test "reverse-next" ".*b = 5;.*" \
"reverse next 2 at b = 5, from function body"
gdb_test "reverse-continue" ".*" "setup for test 3"
# Turn off record to clear logs and turn on again
gdb_test "record stop" "Process record is stopped.*" \
"turn off process record for test2"
gdb_test_no_output "record" "turn on process record for test3"
### TEST 3: reverse finish from the alternate entry point instruction (GEP) in
### function1 when called using the alternate entry point (GEP).
# Set breakpoint at call to funp in main.
set bp_GEP_test [gdb_get_line_number "CALL VIA GEP" $srcfile]
gdb_breakpoint $srcfile:$bp_GEP_test temporary
# Continue to break point at funp call in main.
gdb_continue_to_breakpoint \
"stopped at function1 entry point instruction to stepi into funp" \
".*$srcfile:$bp_GEP_test\r\n.*"
# stepi until we see "{" indicating we entered function.
repeat_cmd_until "stepi" "CALL VIA GEP" "{" "stepi into funp call"
# The reverse-finish command should stop on the function call instruction
# which is the last instruction in the source code line. Another reverse-next
# instruction stops at the previous source code line.
gdb_test "reverse-finish" ".*funp \\(a, b\\);.*" \
"function1 GEP call call from GEP"
gdb_test "reverse-next" ".*b = 50;.*" "reverse next 2 at b = 50, call from GEP"
gdb_test "reverse-continue" ".*" "setup for test 4"
# Turn off record to clear logs and turn on again
gdb_test "record stop" "Process record is stopped.*" \
"turn off process record for test3"
gdb_test_no_output "record" "turn on process record for test4"
### TEST 4: reverse finish from between the GEP and LEP in
### function1 when called using the alternate entry point (GEP).
# Set breakpoint at call to funp in main.
set bp_GEP_test [gdb_get_line_number "CALL VIA GEP" $srcfile]
gdb_breakpoint $srcfile:$bp_GEP_test temporary
# Continue to break point at funp call in main.
gdb_continue_to_breakpoint \
"stopped at function1 entry point instruction to stepi into funp again" \
".*$srcfile:$bp_GEP_test\r\n.*"
# stepi until we see "{" indicating we entered function.
repeat_cmd_until "stepi" "CALL VIA GEP" "{" "stepi into funp call again"
# do one more stepi so we are between the GEP and LEP.
gdb_test "stepi" "{" "stepi to between GEP and LEP"
# The reverse-finish command should stop on the function call instruction
# which is the last instruction in the source code line. Another reverse-next
# instruction stops at the previous source code line.
gdb_test "reverse-finish" ".*funp \\(a, b\\);.*" \
"function1 GEP call call from GEP again"
gdb_test "reverse-next" ".*b = 50;.*" \
"reverse next 2 at b = 50, call from GEP again"
gdb_test "reverse-continue" ".*" "setup for test 5"
# Turn off record to clear logs and turn on again
gdb_test "record stop" "Process record is stopped.*" \
"turn off process record for test4"
gdb_test_no_output "record" "turn on process record for test5"
### TEST 5: reverse finish from the body of function 1 when calling using the
### alternate entrypoint (GEP).
gdb_breakpoint $srcfile:$bp_GEP_test temporary
# Continue to break point at funp call.
gdb_continue_to_breakpoint \
"at function1 entry point instruction to step to body of funp call" \
".*$srcfile:$bp_GEP_test\r\n.*"
# Step into body of funp, called via GEP.
gdb_test "step" ".*int ret = 0;.*" "step test 2"
# The reverse-finish command should stop on the function call instruction
# which is the last instruction in the source code line. Another reverse-next
# instruction stops at the previous source code line.
gdb_test "reverse-finish" ".*funp \\(a, b\\);.*" \
"reverse-finish function1 GEP call, from function body "
gdb_test "reverse-next" ".*b = 50;.*" \
"reverse next 2 at b = 50 from function body"