From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22833 invoked by alias); 24 Mar 2011 14:05:46 -0000 Received: (qmail 22821 invoked by uid 22791); 24 Mar 2011 14:05:44 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,TW_CB,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 24 Mar 2011 14:05:38 +0000 Received: (qmail 13717 invoked from network); 24 Mar 2011 14:05:36 -0000 Received: from unknown (HELO ?192.168.0.102?) (yao@127.0.0.2) by mail.codesourcery.com with ESMTPA; 24 Mar 2011 14:05:36 -0000 Message-ID: <4D8B4FAA.4000004@codesourcery.com> Date: Thu, 24 Mar 2011 14:11:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [try 2nd 7/8] Test case References: <4D15F9B8.5070705@codesourcery.com> <4D8B4947.1000000@codesourcery.com> In-Reply-To: <4D8B4947.1000000@codesourcery.com> Content-Type: multipart/mixed; boundary="------------090106070906000000080806" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-03/txt/msg01071.txt.bz2 This is a multi-part message in MIME format. --------------090106070906000000080806 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-length: 59 Test cases for Thumb displaced stepping. -- Yao (齐尧) --------------090106070906000000080806 Content-Type: text/x-patch; name="0007-test-cases.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0007-test-cases.patch" Content-length: 12328 2011-03-24 Yao Qi * gdb.arch/arm-disp-step.S: Test Thumb instructions. * gdb.arch/arm-disp-step.exp: Likewse. --- gdb/testsuite/gdb.arch/arm-disp-step.S | 164 ++++++++++++++++++++++- gdb/testsuite/gdb.arch/arm-disp-step.exp | 215 +++++++++++++++++++++++++++--- 2 files changed, 354 insertions(+), 25 deletions(-) diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.S b/gdb/testsuite/gdb.arch/arm-disp-step.S index fb76974..276047d 100644 --- a/gdb/testsuite/gdb.arch/arm-disp-step.S +++ b/gdb/testsuite/gdb.arch/arm-disp-step.S @@ -18,7 +18,7 @@ .syntax unified .text .type main,%function -#if defined (__thumb__) || defined (__thumb2__) +#if defined (__thumb__) .code 16 .thumb_func #endif @@ -43,11 +43,37 @@ test_ret_end: /* Test ldr from pc */ bl test_ldr_pc - /* Test ldm/stm only in ARM mode */ -#if !defined (__thumb__) && !defined (__thumb2__) + /* Test ldm/stm in ARM */ +#if !defined (__thumb__) bl test_ldm_stm_pc #endif + /* Test ldrX literal in ARM and Thumb-2 */ +#if !defined (__thumb__) || defined(__thumb2__) + bl test_ldr_literal +#endif + + /* Test ldr literal in Thumb */ +#if defined(__thumb__) + bl test_ldr_literal_16 +#endif + + /* Test cbnz/cbz in Thumb-2 */ +#if defined(__thumb2__) + bl test_cbz_cbnz +#endif + + /* Test adr in Thumb and Thumb-2 */ +#if defined(__thumb__) + bl test_adr +#endif + /* Test 32-bit adr in ARM and Thumb-2 */ +#if defined(__thumb2__) || !defined(__thumb__) + bl test_adr_32bit +#endif + + bl test_pop_pc + /* Test str in ARM mode and Thumb-2 */ #if !defined(__thumb__) bl test_str_pc @@ -60,7 +86,7 @@ test_ret_end: .size main, .-main .global test_call_subr -#if defined (__thumb__) || defined (__thumb2__) +#if defined (__thumb__) .code 16 .thumb_func #endif @@ -77,7 +103,7 @@ test_ret: .global test_branch -#if defined (__thumb__) || defined (__thumb2__) +#if defined (__thumb__) .code 16 .thumb_func #endif @@ -90,7 +116,7 @@ L_branch: .size test_branch, .-test_branch .global test_ldr_pc -#if defined (__thumb__) || defined (__thumb2__) +#if defined (__thumb__) .code 16 .thumb_func #endif @@ -103,7 +129,7 @@ test_ldr_pc_ret: bx lr .size test_ldr_pc, .-test_ldr_pc -#if !defined (__thumb__) && !defined (__thumb2__) +#if !defined (__thumb__) .global test_ldm_stm_pc .type test_ldm_stm_pc, %function test_ldm_stm_pc: @@ -122,6 +148,130 @@ test_ldm_stm_pc_ret: .word test_ldm_stm_pc_ret .size test_ldm_stm_pc, .-test_ldm_stm_pc #endif + +#if !defined (__thumb__) || defined(__thumb2__) + .global test_ldr_literal + .type test_ldr_literal, %function +test_ldr_literal: + ldrh r0, [pc] + .global test_ldrsb_literal +test_ldrsb_literal: + ldrsb r0, [pc] + .global test_ldrsh_literal +test_ldrsh_literal: + ldrsh r0, [pc] + .global test_ldr_literal_end +test_ldr_literal_end: + bx lr + .size test_ldr_literal, .-test_ldr_literal +#endif + +#if defined(__thumb__) + .global test_ldr_literal_16 + .code 16 + .thumb_func +test_ldr_literal_16: + ldr r0, .L2 + .global test_ldr_literal_16_end +test_ldr_literal_16_end: + bx lr + .align 2 +.L2: + .word test_ldr_literal_16 + .size test_ldr_literal_16, .-test_ldr_literal_16 +#endif + +#if defined(__thumb2__) + .global test_cbz_cbnz + .code 16 + .thumb_func +test_cbz_cbnz: + movs r0, #0 + .global test_zero_cbnz +test_zero_cbnz: + cbnz r0, .L3 + .global test_zero_cbz +test_zero_cbz: + cbz r0, .L3 +.L3: + movs r0, #1 + .global test_non_zero_cbz +test_non_zero_cbz: + cbz r0, .L4 + .global test_non_zero_cbnz +test_non_zero_cbnz: + cbnz r0, .L4 + nop +.L4: + .global test_cbz_cbnz_end +test_cbz_cbnz_end: + bx lr + .size test_cbz_cbnz, .-test_cbz_cbnz +#endif + +#if defined(__thumb__) + .global test_adr + .code 16 + .thumb_func +test_adr: + adr r0, .L8 + nop + nop + nop +.L8: + .global test_adr_end +test_adr_end: + bx lr + .size test_adr, .-test_adr +#endif + +#if defined(__thumb2__) || !defined(__thumb__) + .global test_adr_32bit +#if defined(__thumb2__) + .code 16 + .thumb_func +#endif +test_adr_32bit: + adr r0, .L6 + nop +.L6: + nop + .global test_adr_32bit_after +test_adr_32bit_after: + adr r0, .L6 + + .global test_adr_32bit_end +test_adr_32bit_end: + bx lr + .size test_adr_32bit, .-test_adr_32bit +#endif + + .global test_pop_pc + .type test_pop_pc, %function +#if defined(__thumb__) + .code 16 + .thumb_func +#endif + +test_pop_pc: + ldr r1, .L5 +#if defined(__thumb__) + movs r0, #1 + orrs r1, r0 +#endif + push {r1} + push {r1} + .global test_pop_pc_1 +test_pop_pc_1: + pop {r1, pc} + .global test_pop_pc_ret +test_pop_pc_ret: + bx lr + .align 2 +.L5: + .word test_pop_pc_ret + .size test_pop_pc, .-test_pop_pc + #if !defined(__thumb__) #if defined (__thumb2__) diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.exp b/gdb/testsuite/gdb.arch/arm-disp-step.exp index 3bea521..b337335 100644 --- a/gdb/testsuite/gdb.arch/arm-disp-step.exp +++ b/gdb/testsuite/gdb.arch/arm-disp-step.exp @@ -50,7 +50,11 @@ proc test_ldm_stm_pc {} { } -re "Function \"test_ldm_stm_pc\" not defined\..*Make breakpoint pending on future shared library load.*y or .n.. $" { gdb_test "n" "" "Test case is compiled in Thumb mode" - return + return 0 + } + -re "No symbol.*" { + pass "break test_ldm_stm_pc" + return 0 } } @@ -68,10 +72,81 @@ proc test_ldm_stm_pc {} { gdb_continue_to_breakpoint "continue to test_ldm_stm_pc_ret" \ ".*bx lr.*" } + +######################################### +# Test ldrX literal +proc test_ldr_literal {} { + global srcfile + # Try to set breakpoint on test_ldm_stm_pc. If symbol 'test_ldm_stm_pc' + # can't be resolved, test case is compiled in Thumb mode, skip it. + gdb_test_multiple "break *test_ldr_literal" "break test_ldr_literal" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + pass "break test_ldr_literal" + } + -re "Function \"test_ldr_literal\" not defined\..*Make breakpoint pending on future shared library load.*y or .n.. $" { + gdb_test "n" "" "Test case is compiled in Thumb mode" + return 0 + } + -re "No symbol.*" { + return 0 + } + } + + gdb_test "break *test_ldrsb_literal" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldrsb_literal" + gdb_test "break *test_ldrsh_literal" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldrsh_literal" + gdb_test "break *test_ldr_literal_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_test_ldr_literal_end" + + gdb_continue_to_breakpoint "continue to test_ldr_literal" \ + ".*ldrh.*r0\,.*\[pc\].*" + gdb_continue_to_breakpoint "continue to test_ldrsb_literal" \ + ".*ldrsb.*r0\,.*\[pc\].*" + gdb_continue_to_breakpoint "continue to test_ldrsh_literal" \ + ".*ldrsh.*r0\,.*\[pc\].*" + gdb_continue_to_breakpoint "continue to test_ldr_literal_ret" \ + ".*bx lr.*" +} + +proc test_ldr_literal_16 {} { + global srcfile + gdb_test_multiple "break *test_ldr_literal_16" "break test_ldr_literal_16" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + pass "break test_ldr_literal" + } + -re "Function \"test_ldr_literal_16\" not defined\..*Make breakpoint pending on future shared library load.*y or .n.. $" { + gdb_test "n" "" "skip" + return 0 + } + -re "No symbol.*" { + return 0 + } + } + + gdb_test "break *test_ldr_literal_16_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldr_literal_16_end" + + gdb_continue_to_breakpoint "continue to test_ldr_literal_16" \ + ".*ldr.*r0\,.*L2.*" + gdb_continue_to_breakpoint "continue to test_ldr_literal_16_end" \ + ".*bx lr.*" +} + ########################################## # Test call/ret. proc test_call_ret {} { global srcfile + global testfile + + gdb_test "break *test_call" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_call" + gdb_test "break *test_call_end" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "break test_call_end" @@ -82,9 +157,10 @@ proc test_call_ret {} { "Breakpoint.*at.* file .*$srcfile, line.*" \ "break test_ret_end" - gdb_continue_to_breakpoint "continue to test_call_end" \ + gdb_continue_to_breakpoint "test_call" ".*bl test_call_subr.*" + gdb_continue_to_breakpoint "test_call_end" \ ".*@ Location test_call_end.*" - gdb_continue_to_breakpoint "continue to test_ret" \ + gdb_continue_to_breakpoint "test_ret" \ ".*bx lr.*" gdb_continue_to_breakpoint "continue to test_ret_end" \ ".*@ Location test_ret_end.*" @@ -122,7 +198,111 @@ proc test_ldr_from_pc {} { gdb_continue_to_breakpoint "continue to test_ldr_pc" \ ".*ldr.*r1\,.*\[pc, #0\].*" - gdb_continue_to_breakpoint "continue to Lbranch" \ + gdb_continue_to_breakpoint "continue to test_ldr_pc_ret" \ + ".*bx lr.*" +} + +######################################### + +# Test cbz and cbnz +proc test_cbz_cbnz {} { + global srcfile + + gdb_test_multiple "break *test_zero_cbnz" "break test_zero_cbnz" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + pass "break test_ldr_literal" + } + -re "No symbol.*" { + return 0 + } + } + + gdb_test "break *test_zero_cbz" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_zero_cbz" + gdb_test "break *test_non_zero_cbnz" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_non_zero_cbnz" + gdb_test "break *test_non_zero_cbz" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_non_zero_cbz" + + gdb_continue_to_breakpoint "continue to test_zero_cbnz" \ + ".*cbnz.*r0\,.*\.L3.*" + gdb_continue_to_breakpoint "continue to test_zero_cbz" \ + ".*cbz.*r0\,.*\.L3.*" + gdb_continue_to_breakpoint "continue to test_non_zero_cbz" \ + ".*cbz.*r0\,.*\.L4.*" + gdb_continue_to_breakpoint "continue to test_non_zero_cbnz" \ + ".*cbnz.*r0\,.*\.L4.*" +} + +# Test adr + +proc test_adr {} { + global srcfile + + gdb_test_multiple "break *test_adr" "break test_adr" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + pass "break test_adr" + } + -re "No symbol.*" { + return 0 + } + } + + gdb_test "break *test_adr_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_adr_end" + + gdb_continue_to_breakpoint "test_adr" \ + ".*adr.*r0\,.*\.L8.*" + gdb_continue_to_breakpoint "test_adr_end" \ + ".*bx lr.*" +} + +proc test_adr_32bit {} { + global srcfile + + gdb_test_multiple "break *test_adr_32bit" "break test_adr_32bit" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + pass "break test_adr" + } + -re "No symbol.*" { + return 0 + } + } + + gdb_test "break *test_adr_32bit_after" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_adr_32bit_after" + + gdb_test "break *test_adr_32bit_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_adr_32bit_end" + + gdb_continue_to_breakpoint "test_adr_32bit" \ + ".*adr.*r0\,.*\.L6.*" + gdb_continue_to_breakpoint "test_adr_32bit_after" \ + ".*adr.*r0\,.*\.L6.*" + gdb_continue_to_breakpoint "test_adr_32bit_end" \ + ".*bx lr.*" +} + +######################################### +# Test pop to PC +proc test_pop_pc {} { + global srcfile + gdb_test "break *test_pop_pc_1" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc" + gdb_test "break *test_pop_pc_ret" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_ret" + + gdb_continue_to_breakpoint "continue to test_pop_pc" \ + ".*b.*\{r1\, pc\}.*" + gdb_continue_to_breakpoint "continue to test_pop_pc_ret" \ ".*bx lr.*" } @@ -179,20 +359,6 @@ if ![runto_main] then { gdb_test_no_output "set displaced-stepping on" gdb_test "show displaced-stepping" ".* displaced stepping .* is on.*" -gdb_test "break *test_call" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "break test_call" - -gdb_test_multiple "continue" "continue to test_call" { - -re ".*bl test_call_subr.*" { - pass "continue to test_call" - } - -re "Displaced stepping is only supported in" { - kfail "gdb/NNNN" $testfile - return - } - } - test_call_ret test_branch @@ -201,7 +367,20 @@ test_ldr_from_pc test_ldm_stm_pc +test_ldr_literal + +test_ldr_literal_16 + +test_cbz_cbnz + +test_adr + +test_adr_32bit + +test_pop_pc + test_str_pc + ########################################## # Done, run program to exit. -- 1.7.0.4 --------------090106070906000000080806--