mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
5fec7411a2
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>
204 lines
8.1 KiB
Plaintext
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"
|