forked from Imagelibrary/binutils-gdb
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:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user