This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Refactor gdb.base/disp-step-syscall.exp for general step over test


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0b47da9f176aa73854f1ff8ae00afda11a4f338a

commit 0b47da9f176aa73854f1ff8ae00afda11a4f338a
Author: Yao Qi <yao.qi@linaro.org>
Date:   Thu Mar 3 09:17:44 2016 +0000

    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.

Diff:
---
 gdb/testsuite/ChangeLog                      |   8 ++
 gdb/testsuite/gdb.base/disp-step-syscall.exp | 149 +++++++++++++++------------
 2 files changed, 91 insertions(+), 66 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ec153e2..a8b958f 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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>
 
 	* gdb.fortran/vla-history.exp: Remove breakpoint.
diff --git a/gdb/testsuite/gdb.base/disp-step-syscall.exp b/gdb/testsuite/gdb.base/disp-step-syscall.exp
index 80cdc3b..a1af3b4 100644
--- a/gdb/testsuite/gdb.base/disp-step-syscall.exp
+++ b/gdb/testsuite/gdb.base/disp-step-syscall.exp
@@ -32,80 +32,105 @@ if { [istarget "i\[34567\]86-*-linux*"] || [istarget "x86_64-*-linux*"] } {
     return -1
 }
 
-proc disp_step_cross_syscall { syscall } {
-    with_test_prefix "$syscall" {
-	global syscall_insn
-	global gdb_prompt
+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
+    }
+}
 
-	set testfile "disp-step-$syscall"
+# 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.
 
-	if [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
-	    untested ${testfile}.exp
-	    return -1
-	}
+proc setup { syscall } {
+    global gdb_prompt syscall_insn
 
-	if { ![runto main] } then {
-	    fail "run to main ($syscall)"
-	    return
-	}
+    set testfile "disp-step-$syscall"
 
-	# Delete the breakpoint on main.
-	gdb_test_no_output "delete break 1"
+    clean_restart $testfile
 
-	gdb_test "break marker" "Breakpoint.*at.* file .*${testfile}.c, line.*"
-	gdb_test_no_output "set displaced-stepping off"
+    if { ![runto main] } then {
+	fail "run to main ($syscall)"
+	return -1
+    }
 
-	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"
-	    }
-	}
+    # Delete the breakpoint on main.
+    gdb_test_no_output "delete break 1"
 
-	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_no_output "set displaced-stepping off"
 
-	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 "break $syscall" "Breakpoint \[0-9\]* at .*"
 
-	gdb_test "display/i \$pc" ".*"
+    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.
 
-	# 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
-		}
+    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"]]
+}
 
-	if {$steps == $max_steps} {
+proc disp_step_cross_syscall { syscall } {
+    with_test_prefix "$syscall" {
+	global syscall_insn
+	global gdb_prompt
+
+	set testfile "disp-step-$syscall"
+
+	if [build_executable ${testfile}.exp ${testfile} ${testfile}.c {debug}] {
+	    untested ${testfile}.exp
 	    return -1
 	}
 
-	set syscall_insn_addr [get_hexadecimal_valueof "\$pc" "0"]
-	if {[gdb_test "stepi" "x/i .*=>.*" "stepi $syscall insn"] != 0} {
+	set ret [setup $syscall]
+
+	set syscall_insn_addr [lindex $ret 0]
+	set syscall_insn_next_addr [lindex $ret 1]
+	if { $syscall_insn_addr == -1 } {
 	    return -1
 	}
-	set syscall_insn_next_addr [get_hexadecimal_valueof "\$pc" "0"]
 
 	gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
 	    "continue to $syscall (3rd time)"
@@ -120,7 +145,6 @@ proc disp_step_cross_syscall { syscall } {
 		pass "break on syscall insns"
 	    }
 	}
-	gdb_test_no_output "delete $syscall_bp" "delete break $syscall"
 
 	gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, .*" \
 	    "continue to syscall insn $syscall"
@@ -132,19 +156,12 @@ proc disp_step_cross_syscall { syscall } {
 	    return -1
 	}
 
-	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
-	}
+	check_pc_after_cross_syscall $syscall $syscall_insn_next_addr
 
 	# 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.*" \
 	    "continue to marker ($syscall)"
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]