From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4091 invoked by alias); 11 May 2011 13:15:03 -0000 Received: (qmail 3636 invoked by uid 22791); 11 May 2011 13:15:00 -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; Wed, 11 May 2011 13:14:43 +0000 Received: (qmail 21146 invoked from network); 11 May 2011 13:14:40 -0000 Received: from unknown (HELO ?192.168.0.102?) (yao@127.0.0.2) by mail.codesourcery.com with ESMTPA; 11 May 2011 13:14:40 -0000 Message-ID: <4DCA8BA6.3090402@codesourcery.com> Date: Wed, 11 May 2011 13:15: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: V3 References: <4D15F9B8.5070705@codesourcery.com> <4D8B4947.1000000@codesourcery.com> <4D8B4FAA.4000004@codesourcery.com> <4DC2A552.6080008@codesourcery.com> In-Reply-To: <4DC2A552.6080008@codesourcery.com> Content-Type: multipart/mixed; boundary="------------080408030802050803080304" 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-05/txt/msg00282.txt.bz2 This is a multi-part message in MIME format. --------------080408030802050803080304 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-length: 263 As one problem pointed out by Ulrich in the patch review, http://sourceware.org/ml/gdb-patches/2011-05/msg00240.html test case is updated to test 16-bit Thumb pop instruction more carefully, checking the PC value after each POP instruction. -- Yao (齐尧) --------------080408030802050803080304 Content-Type: text/x-patch; name="0003-test-case.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0003-test-case.patch" Content-length: 14467 gdb/testsuite/ * gdb.arch/arm-disp-step.S (test_ldr_literal): Test for Thumb instructions. (test_adr_32bit, test_pop_pc): Likewise. (test_ldr_literal_16, test_cbz_cbnz, test_adr): New test for Thumb instructions. * gdb.arch/arm-disp-step.exp (test_ldm_stm_pc): Match $gdb_prompt in gdb_test_multiple. (test_ldr_literal_16, test_cbz_cbnz, test_adr): New --- gdb/testsuite/gdb.arch/arm-disp-step.S | 166 +++++++++++++++++++++-- gdb/testsuite/gdb.arch/arm-disp-step.exp | 210 ++++++++++++++++++++++++------ 2 files changed, 319 insertions(+), 57 deletions(-) diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.S b/gdb/testsuite/gdb.arch/arm-disp-step.S index fa69e31..1da7191 100644 --- a/gdb/testsuite/gdb.arch/arm-disp-step.S +++ b/gdb/testsuite/gdb.arch/arm-disp-step.S @@ -48,20 +48,32 @@ test_ret_end: bl test_ldm_stm_pc #endif - /* Test ldrX literal in ARM */ -#if !defined (__thumb__) + /* Test ldrX literal in ARM and Thumb-2 */ +#if !defined (__thumb__) || defined(__thumb2__) bl test_ldr_literal #endif - /* Test 32-bit adr in ARM */ -#if !defined(__thumb__) - bl test_adr_32bit + /* Test ldr literal in Thumb */ +#if defined(__thumb__) + bl test_ldr_literal_16 #endif -#if !defined(__thumb__) - bl test_pop_pc + /* 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 @@ -136,8 +148,8 @@ test_ldm_stm_pc_ret: .word test_ldm_stm_pc_ret .size test_ldm_stm_pc, .-test_ldm_stm_pc #endif - -#if !defined (__thumb__) + +#if !defined (__thumb__) || defined(__thumb2__) .global test_ldr_literal .type test_ldr_literal, %function test_ldr_literal: @@ -154,8 +166,66 @@ test_ldr_literal_end: .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(__thumb__) +#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 @@ -184,22 +254,90 @@ test_adr_32bit_end: #endif test_pop_pc: - ldr r1, .L5 + ldr r1, .L1_right + ldr r2, .L1_wrong #if defined(__thumb__) movs r0, #1 orrs r1, r0 + orrs r2, r0 #endif push {r1} - push {r1} + push {r2} .global test_pop_pc_1 test_pop_pc_1: pop {r1, pc} + +test_pop_pc_2_start: + ldr r1, .L2_right +#if defined(__thumb__) + movs r0, #1 + orrs r1, r0 +#endif + push {r1} + .global test_pop_pc_2 +test_pop_pc_2: + pop {pc} + + /* Test pop instruction with full register list. */ +test_pop_pc_3_start: + ldr r1, .L3_right + ldr r2, .L3_wrong +#if defined(__thumb__) + movs r0, #1 + orrs r1, r0 + orrs r2, r0 +#endif + push {r7} + push {r1} /* Push the right address so that PC will get it. */ + /* Push the wrong address so r0-r7 will get the wrong a ddress. If PC + is set from any of them, we can get a FAIL. */ + push {r2} + push {r2} + push {r2} + push {r2} + push {r2} + push {r2} + push {r2} + push {r2} +test_pop_pc_3: + pop {r0,r1,r2,r3,r4,r5,r6,r7,pc} .global test_pop_pc_ret test_pop_pc_ret: + pop {r7} bx lr + + .global test_pop_pc_1_right +test_pop_pc_1_right: + b test_pop_pc_2_start /* right */ + .global test_pop_pc_1_wrong +test_pop_pc_1_wrong: + b test_pop_pc_2_start /* wrong */ + .global test_pop_pc_2_right +test_pop_pc_2_right: + b test_pop_pc_3_start /* right */ + .global test_pop_pc_2_wrong +test_pop_pc_2_wrong: + b test_pop_pc_3_start /* wrong */ + .global test_pop_pc_3_right +test_pop_pc_3_right: + b test_pop_pc_ret /* right */ + .global test_pop_pc_3_wrong +test_pop_pc_3_wrong: + b test_pop_pc_ret /* wrong */ + .align 2 -.L5: - .word test_pop_pc_ret +.L1_right: + .word test_pop_pc_1_right +.L1_wrong: + .word test_pop_pc_1_wrong +.L2_right: + .word test_pop_pc_2_right +.L2_wrong: + .word test_pop_pc_2_wrong +.L3_right: + .word test_pop_pc_3_right +.L3_wrong: + .word test_pop_pc_3_wrong .size test_pop_pc, .-test_pop_pc #if !defined(__thumb__) diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.exp b/gdb/testsuite/gdb.arch/arm-disp-step.exp index 0427a04..994f08e 100644 --- a/gdb/testsuite/gdb.arch/arm-disp-step.exp +++ b/gdb/testsuite/gdb.arch/arm-disp-step.exp @@ -42,15 +42,17 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list # Test ldm/stm related to PC. proc test_ldm_stm_pc {} { global srcfile + global gdb_prompt + # 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_ldm_stm_pc" "break test_ldm_stm_pc" { - -re "Breakpoint.*at.* file .*$srcfile, line.*" { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { pass "break 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 + -re "No symbol.*\r\n$gdb_prompt $" { + pass "break test_ldm_stm_pc" + return 0 } } @@ -104,10 +106,38 @@ proc test_ldr_literal {} { ".*bx lr.*" } +proc test_ldr_literal_16 {} { + global srcfile + global gdb_prompt + + gdb_test_multiple "break *test_ldr_literal_16" "break test_ldr_literal_16" { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { + pass "break test_ldr_literal" + } + -re "No symbol.*\r\n$gdb_prompt $" { + 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" @@ -118,9 +148,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.*" @@ -158,7 +189,68 @@ 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 + global gdb_prompt + + gdb_test_multiple "break *test_zero_cbnz" "break test_zero_cbnz" { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { + pass "break test_ldr_literal" + } + -re "No symbol.*\r\n$gdb_prompt $" { + 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 + global gdb_prompt + + gdb_test_multiple "break *test_adr" "break test_adr" { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { + pass "break test_adr" + } + -re "No symbol.*\r\n$gdb_prompt $" { + 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.*" } @@ -167,28 +259,28 @@ proc test_adr_32bit {} { global gdb_prompt gdb_test_multiple "break *test_adr_32bit" "break test_adr_32bit" { - -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { - pass "break test_adr" - } - -re "No symbol.*\r\n$gdb_prompt $" { - return 0 - } + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { + pass "break test_adr" + } + -re "No symbol.*\r\n$gdb_prompt $" { + return 0 + } } gdb_test "break *test_adr_32bit_after" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "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" + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_adr_32bit_end" gdb_continue_to_breakpoint "test_adr_32bit" \ - ".*adr.*r0\,.*\.L6.*" + ".*adr.*r0\,.*\.L6.*" gdb_continue_to_breakpoint "test_adr_32bit_after" \ - ".*adr.*r0\,.*\.L6.*" + ".*adr.*r0\,.*\.L6.*" gdb_continue_to_breakpoint "test_adr_32bit_end" \ - ".*bx lr.*" + ".*bx lr.*" } ######################################### @@ -196,27 +288,66 @@ proc test_adr_32bit {} { proc test_pop_pc {} { global srcfile gdb_test "break *test_pop_pc_1" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "break test_pop_pc" + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_1" + gdb_test "break *test_pop_pc_2" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_2" + gdb_test "break *test_pop_pc_3" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_3" + gdb_test "break *test_pop_pc_ret" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ - "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_test "break *test_pop_pc_1_right" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_1_right" + gdb_test "break *test_pop_pc_1_wrong" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_1_wrong" + gdb_test "break *test_pop_pc_2_right" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_2_right" + gdb_test "break *test_pop_pc_2_wrong" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_2_wrong" + gdb_test "break *test_pop_pc_3_right" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_3_right" + gdb_test "break *test_pop_pc_3_wrong" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_pop_pc_1_wrong" + + gdb_continue_to_breakpoint "continue to test_pop_pc_1" \ + ".*b.*\{r1\, pc\}.*" + gdb_continue_to_breakpoint "continue to test_pop_pc_1_check" \ + ".*b.*right.*" + + gdb_continue_to_breakpoint "continue to test_pop_pc_2" \ + ".*\{pc\}.*" + gdb_continue_to_breakpoint "continue to test_pop_pc_2_check" \ + ".*b.*right.*" + gdb_continue_to_breakpoint "continue to test_pop_pc_3" \ + ".*\{r0\,r1\,r2\,r3\,r4\,r5\,r6\,r7\,pc\}.*" + gdb_continue_to_breakpoint "continue to test_pop_pc_3_check" \ + ".*b.*right.*" gdb_continue_to_breakpoint "continue to test_pop_pc_ret" \ - ".*bx lr.*" + ".*r7.*" } ########################################### proc test_str_pc {} { global srcfile + global gdb_prompt + gdb_test_multiple "break *test_str_pc" "break test_str_pc" { - -re "Breakpoint.*at.* file .*$srcfile, line.*" { + -re "Breakpoint.*at.* file .*$srcfile, line.*\r\n$gdb_prompt $" { pass "break test_str_pc" } - -re "No symbol.*" { + -re "No symbol.*\r\n$gdb_prompt $" { pass "break test_str_pc" return } @@ -261,20 +392,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 @@ -285,11 +402,18 @@ 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 --------------080408030802050803080304--