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