# 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 } {
    global software_step

    set line [gdb_get_line_number "@ Break ${ndx}"]

    if { ! [gdb_breakpoint "${line}"] } {
	unresolved "continue to breakpoint: test ${ndx}"
	return
    }

    if { $software_step } {
	gdb_continue_to_breakpoint "test ${ndx}" ".*@ Location ${ndx}.*"
    } else {
	gdb_continue_to_breakpoint "test ${ndx}" ".*@ Break ${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}
}
