Move step_until procedure

Procedure step_until from test gdb.reverse/step-indirect-call-thunk.exp
is moved to lib/gdb.exp and renamed repeat_cmd_until.  The existing procedure
gdb_step_until in lib/gdb.exp is simpler variant of the new repeat_cmd_until
procedure.  The existing procedure gdb_step_until is changed to just call
the new repeat_cmd_until procedure with the command set to "step" and an
optional CURRENT string.  The default CURRENT string is set to "\}" to work
with the existing uses of procedure gdb_step_until.
This commit is contained in:
Carl Love
2023-03-01 11:45:43 -05:00
parent 1b046c8eb9
commit 334d405c2a
2 changed files with 41 additions and 55 deletions

View File

@@ -38,39 +38,6 @@ if { ![runto_main] } {
return -1
}
# Do repeated stepping COMMANDs in order to reach TARGET from CURRENT
#
# COMMAND is a stepping command
# CURRENT is a string matching the current location
# TARGET is a string matching the target location
# TEST is the test name
#
# The function issues repeated COMMANDs as long as the location matches
# CURRENT up to a maximum of 100 steps.
#
# TEST passes if the resulting location matches TARGET and fails
# otherwise.
#
proc step_until { command current target test } {
global gdb_prompt
set count 0
gdb_test_multiple "$command" "$test" {
-re "$current.*$gdb_prompt $" {
incr count
if { $count < 100 } {
send_gdb "$command\n"
exp_continue
} else {
fail "$test"
}
}
-re "$target.*$gdb_prompt $" {
pass "$test"
}
}
}
gdb_test_no_output "record"
gdb_test "next" ".*" "record trace"
@@ -90,20 +57,20 @@ gdb_test "reverse-next" "apply\.2.*" \
"reverse-step through thunks and over inc"
# We can use instruction stepping to step into thunks.
step_until "stepi" "apply\.2" "indirect_thunk" "stepi into call thunk"
step_until "stepi" "indirect_thunk" "inc" \
repeat_cmd_until "stepi" "apply\.2" "indirect_thunk" "stepi into call thunk"
repeat_cmd_until "stepi" "indirect_thunk" "inc" \
"stepi out of call thunk into inc"
set alphanum_re "\[a-zA-Z0-9\]"
set pic_thunk_re "__$alphanum_re*\\.get_pc_thunk\\.$alphanum_re* \\(\\)"
step_until "stepi" "(inc|$pic_thunk_re)" "return_thunk" "stepi into return thunk"
step_until "stepi" "return_thunk" "apply" \
repeat_cmd_until "stepi" "(inc|$pic_thunk_re)" "return_thunk" "stepi into return thunk"
repeat_cmd_until "stepi" "return_thunk" "apply" \
"stepi out of return thunk back into apply"
step_until "reverse-stepi" "apply" "return_thunk" \
repeat_cmd_until "reverse-stepi" "apply" "return_thunk" \
"reverse-stepi into return thunk"
step_until "reverse-stepi" "return_thunk" "inc" \
repeat_cmd_until "reverse-stepi" "return_thunk" "inc" \
"reverse-stepi out of return thunk into inc"
step_until "reverse-stepi" "(inc|$pic_thunk_re)" "indirect_thunk" \
repeat_cmd_until "reverse-stepi" "(inc|$pic_thunk_re)" "indirect_thunk" \
"reverse-stepi into call thunk"
step_until "reverse-stepi" "indirect_thunk" "apply" \
repeat_cmd_until "reverse-stepi" "indirect_thunk" "apply" \
"reverse-stepi out of call thunk into apply"

View File

@@ -9347,31 +9347,50 @@ gdb_caching_proc arm_cc_for_target {} {
# Step until the pattern REGEXP is found. Step at most
# MAX_STEPS times, but stop stepping once REGEXP is found.
#
# CURRENT matches current location
# If REGEXP is found then a single pass is emitted, otherwise, after
# MAX_STEPS steps, a single fail is emitted.
#
# TEST_NAME is the name used in the pass/fail calls.
proc gdb_step_until { regexp {test_name ""} {max_steps 10} } {
if { $test_name == "" } {
set test_name "stepping until regexp"
}
proc gdb_step_until { regexp {test_name "stepping until regexp"} \
{current "\}"} { max_steps 10 } } {
repeat_cmd_until "step" $current $regexp $test_name "10"
}
# Do repeated stepping COMMANDs in order to reach TARGET from CURRENT
#
# COMMAND is a stepping command
# CURRENT is a string matching the current location
# TARGET is a string matching the target location
# TEST_NAME is the test name
# MAX_STEPS is number of steps attempted before fail is emitted
#
# The function issues repeated COMMANDs as long as the location matches
# CURRENT up to a maximum of MAX_STEPS.
#
# TEST_NAME passes if the resulting location matches TARGET and fails
# otherwise.
proc repeat_cmd_until { command current target \
{test_name "stepping until regexp"} \
{max_steps 100} } {
global gdb_prompt
set count 0
gdb_test_multiple "step" "$test_name" {
-re "$regexp\r\n$::gdb_prompt $" {
pass $test_name
}
-re ".*$::gdb_prompt $" {
if {$count < $max_steps} {
incr count
send_gdb "step\n"
gdb_test_multiple "$command" "$test_name" {
-re "$current.*$gdb_prompt $" {
incr count
if { $count < $max_steps } {
send_gdb "$command\n"
exp_continue
} else {
fail $test_name
fail "$test_name"
}
}
-re "$target.*$gdb_prompt $" {
pass "$test_name"
}
}
}