mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-07-10 17:41:23 +08:00
Refactor gdb.base/disp-step-syscall.exp for general step over test
This patch moves some code out of disp_step_cross_syscall to a new proc check_pc_after_cross_syscall and setup. Procedure setup is to start a fresh GDB and compute the syscall instruction address. gdb/testsuite: 2016-03-03 Yao Qi <yao.qi@linaro.org> * gdb.base/disp-step-syscall.exp (check_pc_after_cross_syscall): New proc. (setup): New proc. (disp_step_cross_syscall): Move code to check_pc_after_cross_syscall and setup.
This commit is contained in:
gdb/testsuite
@ -1,3 +1,11 @@
|
|||||||
|
2016-03-03 Yao Qi <yao.qi@linaro.org>
|
||||||
|
|
||||||
|
* gdb.base/disp-step-syscall.exp (check_pc_after_cross_syscall): New
|
||||||
|
proc.
|
||||||
|
(setup): New proc.
|
||||||
|
(disp_step_cross_syscall): Move code to check_pc_after_cross_syscall
|
||||||
|
and setup.
|
||||||
|
|
||||||
2016-03-02 Bernhard Heckel <bernhard.heckel@intel.com>
|
2016-03-02 Bernhard Heckel <bernhard.heckel@intel.com>
|
||||||
|
|
||||||
* gdb.fortran/vla-history.exp: Remove breakpoint.
|
* gdb.fortran/vla-history.exp: Remove breakpoint.
|
||||||
|
@ -32,6 +32,86 @@ if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
proc check_pc_after_cross_syscall { syscall syscall_insn_next_addr } {
|
||||||
|
set syscall_insn_next_addr_found [get_hexadecimal_valueof "\$pc" "0"]
|
||||||
|
|
||||||
|
set test "single step over $syscall final pc"
|
||||||
|
if {$syscall_insn_next_addr != 0
|
||||||
|
&& $syscall_insn_next_addr == $syscall_insn_next_addr_found} {
|
||||||
|
pass $test
|
||||||
|
} else {
|
||||||
|
fail $test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restart GDB and set up the test. Return a list in which the first one
|
||||||
|
# is the address of syscall instruction and the second one is the address
|
||||||
|
# of the next instruction address of syscall instruction. If anything
|
||||||
|
# wrong, the two elements of list are -1.
|
||||||
|
|
||||||
|
proc setup { syscall } {
|
||||||
|
global gdb_prompt syscall_insn
|
||||||
|
|
||||||
|
set testfile "disp-step-$syscall"
|
||||||
|
|
||||||
|
clean_restart $testfile
|
||||||
|
|
||||||
|
if { ![runto main] } then {
|
||||||
|
fail "run to main ($syscall)"
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete the breakpoint on main.
|
||||||
|
gdb_test_no_output "delete break 1"
|
||||||
|
|
||||||
|
gdb_test_no_output "set displaced-stepping off"
|
||||||
|
|
||||||
|
gdb_test "break $syscall" "Breakpoint \[0-9\]* at .*"
|
||||||
|
|
||||||
|
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||||
|
"continue to $syscall (1st time)"
|
||||||
|
# Hit the breakpoint on $syscall for the first time. In this time,
|
||||||
|
# we will let PLT resolution done, and the number single steps we will
|
||||||
|
# do later will be reduced.
|
||||||
|
|
||||||
|
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||||
|
"continue to $syscall (2nd time)"
|
||||||
|
# Hit the breakpoint on $syscall for the second time. In this time,
|
||||||
|
# the address of syscall insn and next insn of syscall are recorded.
|
||||||
|
|
||||||
|
gdb_test "display/i \$pc" ".*"
|
||||||
|
|
||||||
|
# Single step until we see a syscall insn or we reach the
|
||||||
|
# upper bound of loop iterations.
|
||||||
|
set msg "find syscall insn in $syscall"
|
||||||
|
set steps 0
|
||||||
|
set max_steps 1000
|
||||||
|
gdb_test_multiple "stepi" $msg {
|
||||||
|
-re ".*$syscall_insn.*$gdb_prompt $" {
|
||||||
|
pass $msg
|
||||||
|
}
|
||||||
|
-re "x/i .*=>.*\r\n$gdb_prompt $" {
|
||||||
|
incr steps
|
||||||
|
if {$steps == $max_steps} {
|
||||||
|
fail $msg
|
||||||
|
} else {
|
||||||
|
send_gdb "stepi\n"
|
||||||
|
exp_continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if {$steps == $max_steps} {
|
||||||
|
return { -1, -1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
|
||||||
|
if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
|
||||||
|
return { -1, -1 }
|
||||||
|
}
|
||||||
|
return [list $syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]]
|
||||||
|
}
|
||||||
|
|
||||||
proc disp_step_cross_syscall { syscall } {
|
proc disp_step_cross_syscall { syscall } {
|
||||||
with_test_prefix "$syscall" {
|
with_test_prefix "$syscall" {
|
||||||
global syscall_insn
|
global syscall_insn
|
||||||
@ -39,74 +119,19 @@ proc disp_step_cross_syscall { syscall } {
|
|||||||
|
|
||||||
set testfile "disp-step-$syscall"
|
set testfile "disp-step-$syscall"
|
||||||
|
|
||||||
if [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
|
if [build_executable ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
|
||||||
untested ${testfile}.exp
|
untested ${testfile}.exp
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
if { ![runto main] } then {
|
set ret [setup $syscall]
|
||||||
fail "run to main ($syscall)"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
# Delete the breakpoint on main.
|
set syscall_insn_addr [lindex $ret 0]
|
||||||
gdb_test_no_output "delete break 1"
|
set syscall_insn_next_addr [lindex $ret 1]
|
||||||
|
if { $syscall_insn_addr == -1 } {
|
||||||
gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
|
|
||||||
gdb_test_no_output "set displaced-stepping off"
|
|
||||||
|
|
||||||
set syscall_bp 0
|
|
||||||
gdb_test_multiple "break $syscall" "break $syscall" {
|
|
||||||
-re "Breakpoint (\[0-9\]*) at .*$gdb_prompt $" {
|
|
||||||
set syscall_bp $expect_out(1,string)
|
|
||||||
pass "break $syscall"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
|
||||||
"continue to $syscall (1st time)"
|
|
||||||
# Hit the breakpoint on $syscall for the first time. In this time, we will let PLT
|
|
||||||
# resolution done, and the number single steps we will do later will be
|
|
||||||
# reduced.
|
|
||||||
|
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
|
||||||
"continue to $syscall (2nd time)"
|
|
||||||
# Hit the breakpoint on $syscall for the second time. In this time, the address
|
|
||||||
# of syscall insn and next insn of syscall are recorded.
|
|
||||||
|
|
||||||
gdb_test "display/i \$pc" ".*"
|
|
||||||
|
|
||||||
|
|
||||||
# Single step until we see a syscall insn or we reach the
|
|
||||||
# upper bound of loop iterations.
|
|
||||||
set msg "find syscall insn in $syscall"
|
|
||||||
set steps 0
|
|
||||||
set max_steps 1000
|
|
||||||
gdb_test_multiple "stepi" $msg {
|
|
||||||
-re ".*$syscall_insn.*$gdb_prompt $" {
|
|
||||||
pass $msg
|
|
||||||
}
|
|
||||||
-re "x/i .*=>.*\r\n$gdb_prompt $" {
|
|
||||||
incr steps
|
|
||||||
if {$steps == $max_steps} {
|
|
||||||
fail $msg
|
|
||||||
} else {
|
|
||||||
send_gdb "stepi\n"
|
|
||||||
exp_continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if {$steps == $max_steps} {
|
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
|
|
||||||
if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
set syscall_insn_next_addr [get_hexadecimal_valueof "\$pc" "0"]
|
|
||||||
|
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||||
"continue to $syscall (3rd time)"
|
"continue to $syscall (3rd time)"
|
||||||
|
|
||||||
@ -120,7 +145,6 @@ proc disp_step_cross_syscall { syscall } {
|
|||||||
pass "break on syscall insns"
|
pass "break on syscall insns"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gdb_test_no_output "delete $syscall_bp" "delete break $syscall"
|
|
||||||
|
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, .*" \
|
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, .*" \
|
||||||
"continue to syscall insn $syscall"
|
"continue to syscall insn $syscall"
|
||||||
@ -132,19 +156,12 @@ proc disp_step_cross_syscall { syscall } {
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
set syscall_insn_next_addr_found [get_hexadecimal_valueof "\$pc" "0"]
|
check_pc_after_cross_syscall $syscall $syscall_insn_next_addr
|
||||||
|
|
||||||
set test "single step over $syscall final pc"
|
|
||||||
if {$syscall_insn_next_addr != 0
|
|
||||||
&& $syscall_insn_next_addr == $syscall_insn_next_addr_found} {
|
|
||||||
pass $test
|
|
||||||
} else {
|
|
||||||
fail $test
|
|
||||||
}
|
|
||||||
|
|
||||||
# Delete breakpoint syscall insns to avoid interference to other syscalls.
|
# Delete breakpoint syscall insns to avoid interference to other syscalls.
|
||||||
gdb_test_no_output "delete $syscall_insn_bp" "delete break $syscall insn"
|
delete_breakpoints
|
||||||
|
|
||||||
|
gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \
|
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker \\(\\) at.*" \
|
||||||
"continue to marker ($syscall)"
|
"continue to marker ($syscall)"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user