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] Tweak gdb.reverse/step-precsave.exp and gdb.reverse/step-reverse.exp


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

commit 4a7e075c3fdb862d1a9632fc3500c6e5111013fc
Author: Yao Qi <yao.qi@linaro.org>
Date:   Fri Apr 22 12:14:40 2016 +0100

    Tweak gdb.reverse/step-precsave.exp and gdb.reverse/step-reverse.exp
    
    I see the following test fail in arm-linux with -marm and -fomit-frame-pointer,
    
     step
     callee () at /home/yao/SourceCode/gnu/gdb/git/gdb/testsuite/gdb.reverse/step-reverse.c:27
     27      }                       /* RETURN FROM CALLEE */
     (gdb) step
     main () at /home/yao/SourceCode/gnu/gdb/git/gdb/testsuite/gdb.reverse/step-reverse.c:58
     58         callee();    /* STEP INTO THIS CALL */
     (gdb) FAIL: gdb.reverse/step-precsave.exp: reverse step into fn call
    
    As we can see, the "step" has already stepped into the function callee,
    but in the last line.  The second "step" attempts to step to function
    body, but it goes out of callee, which isn't expected.
    
    The program is compiled with -marm and -fomit-frame-pointer, the
    function callee is prologue-less, because nothing needs to be saved
    on stack,
    
    (gdb) disassemble callee
    Dump of assembler code for function callee:
       0x00010680 <+0>:	movw	r3, #2364	; 0x93c
       0x00010684 <+4>:	movt	r3, #2
       0x00010688 <+8>:	ldr	r3, [r3]
       0x0001068c <+12>:	add	r2, r3, #1
       0x00010690 <+16>:	movw	r3, #2364	; 0x93c
       0x00010694 <+20>:	movt	r3, #2
       0x00010698 <+24>:	str	r2, [r3]
       0x0001069c <+28>:	mov	r3, #0
       0x000106a0 <+32>:	mov	r0, r3
       0x000106a4 <+36>:	bx	lr
    
    program stops at the 0x106a0 (passed the epilogue) after the first
    "step".  When second "step" is executed, the stepping range is
    [0x10680-0x106a0], which starts from the first instruction of function
    callee (because it doesn't have prologue).
    
    infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=0, current thread [LWP 2461] at 0x1069c^M
    infrun: prepare_to_wait^M
    infrun: target_wait (-1.0.0, status) =^M
    infrun:   2461.2461.0 [LWP 2461],^M
    infrun:   status->kind = stopped, signal = GDB_SIGNAL_TRAP^M
    infrun: TARGET_WAITKIND_STOPPED^M
    infrun: stop_pc = 0x10698^M
    infrun: stepping inside range [0x10680-0x106a0]
    
    When program goes out of the range, it stops at the caller of callee,
    and test fails.  IOW, if function callee has prologue, the stepping
    range won't start from the first instruction of the function, and
    program stops at the prologue and test passes.
    
    IMO, GDB does nothing wrong, but test shouldn't expect the program
    stops in callee after the second "step".  I decide to fix test rather
    than GDB.  In this patch, I change to test to do one "step", and check
    the program is still in callee, then, do multiple "step" until program
    goes out of the callee.
    
    gdb/testsuite:
    
    2016-04-22  Yao Qi  <yao.qi@linaro.org>
    
    	* gdb.reverse/step-precsave.exp: Do one step and test program
    	stops in "callee" and do multiple steps until program goes out
    	of "callee".
    	* gdb.reverse/step-reverse.exp: Likewise.

Diff:
---
 gdb/testsuite/ChangeLog                     |  7 +++++++
 gdb/testsuite/gdb.reverse/step-precsave.exp | 21 +++++++++++++--------
 gdb/testsuite/gdb.reverse/step-reverse.exp  | 21 +++++++++++++--------
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 249cbc0..5866051 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,12 @@
 2016-04-22  Yao Qi  <yao.qi@linaro.org>
 
+	* gdb.reverse/step-precsave.exp: Do one step and test program
+	stops in "callee" and do multiple steps until program goes out
+	of "callee".
+	* gdb.reverse/step-reverse.exp: Likewise.
+
+2016-04-22  Yao Qi  <yao.qi@linaro.org>
+
 	* gdb.trace/signal.exp: Also pass if
 	$tracepoint_hits($i) > $iterations.
 
diff --git a/gdb/testsuite/gdb.reverse/step-precsave.exp b/gdb/testsuite/gdb.reverse/step-precsave.exp
index a15bc2d..92574b6 100644
--- a/gdb/testsuite/gdb.reverse/step-precsave.exp
+++ b/gdb/testsuite/gdb.reverse/step-precsave.exp
@@ -240,21 +240,26 @@ gdb_test_multiple "stepi" "$test_message" {
 
 # step backward into function (thru return)
 
-set test_message "reverse step into fn call"
+gdb_test "step" "(RETURN FROM CALLEE|ARRIVED IN CALLEE).*" \
+    "reverse step into fn call"
+
+# step backward out of called function (thru call)
+
+set test_message "reverse step out of called fn"
 gdb_test_multiple "step" "$test_message" {
-    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
+    -re "STEP INTO THIS CALL.*.*$gdb_prompt $" {
+	pass "$test_message"
+    }
+    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
 	send_gdb "step\n"
 	exp_continue
     }
-    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
-	pass "$test_message"
+    -re "ENTER CALLEE.*$gdb_prompt $" {
+	send_gdb "step\n"
+	exp_continue
     }
 }
 
-# step backward out of called function (thru call)
-
-gdb_test "step" ".*STEP INTO THIS CALL.*" "reverse step out of called fn"
-
 # next backward over call
 
 gdb_test "next" ".*NEXT OVER THIS CALL.*" "reverse next over call"
diff --git a/gdb/testsuite/gdb.reverse/step-reverse.exp b/gdb/testsuite/gdb.reverse/step-reverse.exp
index fbf41e8..6f1e8b6 100644
--- a/gdb/testsuite/gdb.reverse/step-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/step-reverse.exp
@@ -213,21 +213,26 @@ gdb_test_multiple "stepi" "$test_message" {
 
 # step backward into function (thru return)
 
-set test_message "reverse step into fn call"
+gdb_test "step" "(RETURN FROM CALLEE|ARRIVED IN CALLEE).*" \
+    "reverse step into fn call"
+
+# step backward out of called function (thru call)
+
+set test_message "reverse step out of called fn"
 gdb_test_multiple "step" "$test_message" {
-    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
+    -re "STEP INTO THIS CALL.*.*$gdb_prompt $" {
+	pass "$test_message"
+    }
+    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
 	send_gdb "step\n"
 	exp_continue
     }
-    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
-	pass "$test_message"
+    -re "ENTER CALLEE.*$gdb_prompt $" {
+	send_gdb "step\n"
+	exp_continue
     }
 }
 
-# step backward out of called function (thru call)
-
-gdb_test "step" ".*STEP INTO THIS CALL.*" "reverse step out of called fn"
-
 # next backward over call
 
 gdb_test "next" ".*NEXT OVER THIS CALL.*" "reverse next over call"


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