# Copyright 2010-2021 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
}

standard_testfile .S

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
    untested "failed to compile"
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    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 "skipping tests due to lack of Thumb-2"
	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 (int) ${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 (int) it_breakpoints()" "Breakpoint.*"
for { set i 1 } { $i <= 7 } { incr i } {
    test_it_break ${i}
}
