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/testsuite/gdb.arch/arm-disp-step.exp | |
parent | 621c6d5b11309e6f9759fde43ee85961cc45e0da (diff) | |
download | fsf-binutils-gdb-2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4.zip fsf-binutils-gdb-2a20745c6f5dcf86417ebaabbfdb4b1c56e2c9c4.tar.gz fsf-binutils-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/testsuite/gdb.arch/arm-disp-step.exp')
-rw-r--r-- | gdb/testsuite/gdb.arch/arm-disp-step.exp | 172 |
1 files changed, 172 insertions, 0 deletions
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" |