From patchwork Fri Apr 15 11:43:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 11750 Received: (qmail 1375 invoked by alias); 15 Apr 2016 11:43:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 1068 invoked by uid 89); 15 Apr 2016 11:43:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=OVER, RETURN, ARRIVED X-HELO: mail-pf0-f179.google.com Received: from mail-pf0-f179.google.com (HELO mail-pf0-f179.google.com) (209.85.192.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 15 Apr 2016 11:43:32 +0000 Received: by mail-pf0-f179.google.com with SMTP id e128so56140594pfe.3 for ; Fri, 15 Apr 2016 04:43:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=4uXVpaMNR0Ta+e3n5xRNrr8WeR09MnYcD9A24cXRM6Q=; b=HITTI1MyYHI8jhqO+nRHRhWketTlMNOzNNKDxZNzbw7n7ZQYxgspAPq00P/9b8Her2 OvBZvuRwQlIS1dlOdlZVApXn2U1qSVF/9s3s7irUe7dt32GmdFqtql5/CZmR9igVK/27 qUaTVHWvcg/BoXSpoxEHY+eVDuf67b2u763HI7D7bfSAnIsMK95A4hXUvIx5YxADG0ok c4CJP3vWAvsxwAeOQhFSf68Q4xaEA1u3mkJSs3J2oZe9lfbmJMgZIyDsm1jYIn6FO2cw n9QofUQLq0xPK6k6CDPOUJJkzvYZeLn3U6PgBtt6I99vuVMckf1+fh7wgBfrS2qkStef lbzw== X-Gm-Message-State: AOPr4FVFpG1EE6KotmveE6YFg1MQdVoSrcQfbg1rx3oDtl0N88rOQXo9FK1Q0BrGvZU7ag== X-Received: by 10.98.89.91 with SMTP id n88mr16517819pfb.12.1460720610446; Fri, 15 Apr 2016 04:43:30 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id wi5sm37579681pab.8.2016.04.15.04.43.28 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 15 Apr 2016 04:43:29 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH] Tweak gdb.reverse/step-precsave.exp and gdb.reverse/step-reverse.exp Date: Fri, 15 Apr 2016 12:43:13 +0100 Message-Id: <1460720593-1782-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes 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-15 Yao Qi * 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. --- gdb/testsuite/gdb.reverse/step-precsave.exp | 21 +++++++++++++-------- gdb/testsuite/gdb.reverse/step-reverse.exp | 21 +++++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) 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"