old-cross-binutils/gdb/testsuite/gdb.arch/thumb2-it.exp
Daniel Jacobowitz f9d67f435f * arm-tdep.c (arm_find_mapping_symbol): New function, from
arm_pc_is_thumb.
	(arm_pc_is_thumb): Use arm_find_mapping_symbol.
	(extend_buffer_earlier): New function.
	(MAX_IT_BLOCK_PREFIX, IT_SCAN_THRESHOLD): New constants.
	(arm_adjust_breakpoint_address): New function.
	(arm_gdbarch_init): Register arm_adjust_breakpoint_address.

	testsuite/
	* gdb.arch/thumb2-it.S (it_breakpoints): New function.
	* gdb.arch/thumb2-it.exp (test_it_break): New function.
	(Top level): Call it.
2010-02-01 16:16:30 +00:00

157 lines
3.9 KiB
Text

# 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/>.
# Test single stepping over Thumb-2 IT blocks.
if {![istarget arm*-*eabi*]} then {
verbose "Skipping Thumb-2 tests."
return
}
set testfile "thumb2-it"
set srcfile ${testfile}.S
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
untested thumb2-it.exp
return -1
}
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
if ![runto_main] then {
untested thumb2-it.exp
return -1
}
# Make sure that the compiler options allow Thumb-2.
gdb_test_multiple "list" "list main" {
-re ".*@ No Thumb-2.*$gdb_prompt $" {
pass "list main"
untested thumb2-it.exp
return -1
}
-re ".*@ Thumb-2 OK.*$gdb_prompt $" {
pass "list main"
}
}
proc test_it_block { func } {
global gdb_prompt
global software_step
if { ! [gdb_breakpoint "*${func}"] } {
unresolved "$func, IT block tests"
return
}
gdb_test "call ${func}()" "Breakpoint.*@ Setup.*" "$func, call"
set expected 0
set reached 0
set steps 0
set ok 1
while { $ok } {
set ok 0
set msg "$func, stepi $steps"
gdb_test_multiple "stepi" "$msg" {
-re ".*@ Setup.*$gdb_prompt $" {
pass "$msg"
set ok 1
}
-re ".*@ IT instruction, Expected == (\[0-9\]*)\r\n$gdb_prompt $" {
set expected $expect_out(1,string)
pass "$msg"
set ok 1
}
-re ".*@ Reached.*$gdb_prompt $" {
incr reached
pass "$msg"
set ok 1
if { [regexp {@ Reached, Set ([^\r\n]*)\r\n} $expect_out(0,string) dummy change] } {
gdb_test "set $change" "" "$func, set $change"
}
}
-re ".*@ Not reached.*$gdb_prompt $" {
# An instruction in an IT block whose predicate is false when
# we reach it. If using software single step, we should not
# stop here.
if { $software_step } {
fail "$msg"
} else {
pass "$msg"
set ok 1
}
}
-re ".*@ Never reached.*$gdb_prompt $" {
# An instruction that should be branched over.
fail "$msg"
}
-re ".*@ Done.*$gdb_prompt $" {
pass "$msg"
if { $reached == $expected } {
pass "$func, correct instructions reached"
} else {
fail "$func, correct instructions reached"
}
if { [regexp {@ Done, Check ([^\r\n]*)\r\n} $expect_out(0,string) dummy check] } {
gdb_test "print $check" ".* = 1" "$func, $check"
}
}
}
if { ! $ok } {
break
}
incr steps
continue
}
gdb_test "continue" "" "$func, continue"
return
}
proc test_it_break { ndx } {
set line [gdb_get_line_number "@ Break ${ndx}"]
if { ! [gdb_breakpoint "${line}"] } {
unresolved "continue to breakpoint: test ${ndx}"
return
}
gdb_continue_to_breakpoint "test ${ndx}" ".*@ Location ${ndx}.*"
}
# If we are using software single-stepping in GDB, then GDB will not
# stop at conditional instructions with a false predicate during stepi.
# If we are using a simulator or debug interface with hardware single
# step, then GDB will stop at such instructions.
if { [istarget arm*-linux*] } {
set software_step 1
} else {
set software_step 0
}
for { set i 1 } { $i <= 8 } { incr i } {
test_it_block it_${i}
}
gdb_breakpoint "*it_breakpoints"
gdb_test "call it_breakpoints()" "Breakpoint.*"
for { set i 1 } { $i <= 7 } { incr i } {
test_it_break ${i}
}