New testcase arm-disp-step.exp

Yao Qi
2010-12-21T13:48:26Z

[-- Attachment #1: Type: text/plain, Size: 606 bytes --]

Displaced stepping on ARM has been supported for a while, but there is
no testcase for it.

arm-disp-step.S can be compiled in both Thumb and ARM, so it can be used
for thumb displaced stepping when Thumb displaced stepping is supported
in the future.

arm-disp-step.exp will xfail when arm-disp-step.S is compiled in Thumb
mode. Once GDB supports Thumb displaced stepping, we can remove it.

Run arm-disp-step.exp with
\{-mthumb,-marm\}\{-march=armv5t,-march=armv7-a\}, get result like this,
=== gdb Summary ===

# of expected passes 60
# of expected failures 2

OK to apply?

--
Yao (é½å°§)

[-- Attachment #2: arm_disp_step_test.patch --]
[-- Type: text/x-patch, Size: 8280 bytes --]

testsuite/

* gdb.arch/arm-disp-step.exp: New.
* gdb.arch/arm-disp-step.S: New.

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..34a8fa8
--- /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
\ No newline at end of file
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..facf882
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/arm-disp-step.exp
@@ -0,0 +1,175 @@
+# 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.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+# 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 "set displaced-stepping off" ""
+
+if ![runto_main] then {
+ fail "Can't run to main"
+ return 0
+}
+
+gdb_test "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" {
+ xfail $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"