diff options
author | Yao Qi <yao@codesourcery.com> | 2010-12-23 15:10:24 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2010-12-23 15:10:24 +0000 |
commit | 2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4 (patch) | |
tree | 208a10643ae7ec86182f31c5ec940a21bc3a3d1a /gdb | |
parent | 621c6d5b11309e6f9759fde43ee85961cc45e0da (diff) | |
download | gdb-2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4.zip gdb-2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4.tar.gz gdb-2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4.tar.bz2 |
2010-12-23 Yao Qi <yao@codesourcery.com>
* gdb.arch/arm-disp-step.exp: New.
* gdb.arch/arm-disp-step.S: New.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/arm-disp-step.S | 120 | ||||
-rw-r--r-- | gdb/testsuite/gdb.arch/arm-disp-step.exp | 172 |
3 files changed, 297 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index df8e1fe..093442c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-23 Yao Qi <yao@codesourcery.com> + + * gdb.arch/arm-disp-step.exp: New. + * gdb.arch/arm-disp-step.S: New. + 2010-12-21 Tom Tromey <tromey@redhat.com> * gdb.threads/execl.exp: Update. diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.S b/gdb/testsuite/gdb.arch/arm-disp-step.S new file mode 100644 index 0000000..d748718 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-disp-step.S @@ -0,0 +1,120 @@ +/* Copyright 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + + .syntax unified + .text + .type main,%function +#if defined (__thumb__) || defined (__thumb2__) + .code 16 + .thumb_func +#endif + .globl main +main: + push {r7, lr} + add sp, sp, #4 + mov r7, sp + + + /* Test call and return */ + .global test_call +test_call: + bl test_call_subr + .global test_ret_end +test_ret_end: + nop @ Location test_ret_end + + /* Test branch */ + bl test_branch + + /* Test ldr from pc */ + bl test_ldr_pc + + /* Test ldm/stm only in ARM mode */ +#if !defined (__thumb__) && !defined (__thumb2__) + bl test_ldm_stm_pc +#endif + + /* Return */ + mov sp, r7 + sub sp, sp, #4 + movs r0, #0 + pop {r7, pc} + .size main, .-main + + .global test_call_subr +#if defined (__thumb__) || defined (__thumb2__) + .code 16 + .thumb_func +#endif + .type test_call_subr, %function +test_call_subr: + nop + .global test_call_end +test_call_end: + nop @ Location test_call_end + .global test_ret +test_ret: + bx lr + .size test_call_subr, .-test_call_subr + + + .global test_branch +#if defined (__thumb__) || defined (__thumb2__) + .code 16 + .thumb_func +#endif + .type test_branch, %function +test_branch: + b L_branch + .global +L_branch: + bx lr + .size test_branch, .-test_branch + + .global test_ldr_pc +#if defined (__thumb__) || defined (__thumb2__) + .code 16 + .thumb_func +#endif + .type test_ldr_pc, %function +test_ldr_pc: + ldr r1, [pc, #0] + + .global +test_ldr_pc_ret: + bx lr + .size test_ldr_pc, .-test_ldr_pc + +#if !defined (__thumb__) && !defined (__thumb2__) + .global test_ldm_stm_pc + .type test_ldm_stm_pc, %function +test_ldm_stm_pc: + stmdb sp!, {lr, pc} + ldmia sp!, {r0, r1} + ldr r0, .L1 + stmdb sp!, {r0} + .global +test_ldm_pc: + ldmia sp!, {pc} + .global +test_ldm_stm_pc_ret: + bx lr + .align 2 +.L1: + .word test_ldm_stm_pc_ret + .size test_ldm_stm_pc, .-test_ldm_stm_pc +#endif diff --git a/gdb/testsuite/gdb.arch/arm-disp-step.exp b/gdb/testsuite/gdb.arch/arm-disp-step.exp new file mode 100644 index 0000000..826f728 --- /dev/null +++ b/gdb/testsuite/gdb.arch/arm-disp-step.exp @@ -0,0 +1,172 @@ +# Copyright 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# This file is part of the gdb testsuite. + +# Test arm displaced stepping. + +if $tracelevel { + strace $tracelevel +} + +if {![istarget "arm*-*-*"]} then { + verbose "Skipping arm displaced stepping tests." + return +} + +set testfile "arm-disp-step" +set srcfile ${testfile}.S +set binfile ${objdir}/${subdir}/${testfile} + +set additional_flags "-Wa,-g" + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $additional_flags]] != "" } { + untested arm-disp-step.exp + return -1 +} + + +######################################### +# Test ldm/stm related to PC. +proc test_ldm_stm_pc {} { + 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_ldm_stm_pc" "break test_ldm_stm_pc" { + -re "Breakpoint.*at.* file .*$srcfile, line.*" { + 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 + } + } + + gdb_test "break *test_ldm_pc" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldm_pc" + gdb_test "break *test_ldm_stm_pc_ret" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldm_stm_pc_ret" + + gdb_continue_to_breakpoint "continue to test_ldm_stm_pc" \ + ".*stmdb.*sp\!\,.*\{lr\, pc\}.*" + gdb_continue_to_breakpoint "continue to test_ldm_pc" \ + ".*ldmia.*sp\!\,.*\{pc\}.*" + gdb_continue_to_breakpoint "continue to test_ldm_stm_pc_ret" \ + ".*bx lr.*" +} +########################################## +# Test call/ret. +proc test_call_ret {} { + global srcfile + gdb_test "break *test_call_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_call_end" + gdb_test "break *test_ret" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ret" + gdb_test "break *test_ret_end" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ret_end" + + gdb_continue_to_breakpoint "continue to test_call_end" \ + ".*@ Location test_call_end.*" + gdb_continue_to_breakpoint "continue to test_ret" \ + ".*bx lr.*" + gdb_continue_to_breakpoint "continue to test_ret_end" \ + ".*@ Location test_ret_end.*" +} + + +######################################### +# Test branch +proc test_branch {} { + global srcfile + gdb_test "break *test_branch" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_branch" + gdb_test "break *L_branch" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break Lbranch" + + gdb_continue_to_breakpoint "continue to test_branch" \ + ".*b.*L_branch.*" + gdb_continue_to_breakpoint "continue to Lbranch" \ + ".*bx lr.*" +} + +######################################### + +# Test ldr from pc +proc test_ldr_from_pc {} { + global srcfile + gdb_test "break *test_ldr_pc" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldr_pc" + gdb_test "break test_ldr_pc_ret" \ + "Breakpoint.*at.* file .*$srcfile, line.*" \ + "break test_ldr_pc_ret" + + gdb_continue_to_breakpoint "continue to test_ldr_pc" \ + ".*ldr.*r1\,.*\[pc, #0\].*" + gdb_continue_to_breakpoint "continue to Lbranch" \ + ".*bx lr.*" +} + +# Get things started. + +clean_restart ${testfile} + +# Turn displaced stepping off before runto main. When displaced stepping +# is on, and we type 'run', GDB will first try to single step on _dl_debug_state, +# which is in library might be compiled in Thumb. +gdb_test_no_output "set displaced-stepping off" + +if ![runto_main] then { + fail "Can't run to main" + return 0 +} + +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 + +test_ldr_from_pc + +test_ldm_stm_pc + +########################################## + +# Done, run program to exit. + +gdb_continue_to_end "arm-disp-step" |