# Copyright 2006-2017 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 ARM/Thumb prologue analyzer.

if {![is_aarch32_target]} then {
    verbose "Skipping ARM prologue tests."
    return
}

standard_testfile

# Don't use "debug", so that we don't have line information for the assembly
# fragments.
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {"additional_flags=-mthumb"}] != "" } {
    untested "ARM prologue tests"
    return -1
}


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

#
# Run to `main' where we begin our tests.
#

if ![runto_main] then {
    untested "ARM prologue tests"
    return -1
}

# Testcase for TPCS prologue.

gdb_breakpoint "* *(int *)tpcs_offset + (int) &tpcs_frame_1"
gdb_test "continue" "Breakpoint .*, $hex in tpcs_frame_1 \\(\\)" \
    "continue to TPCS"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in tpcs_frame_1 .*\r\n#1\[ \t\]*$hex in tpcs_frame .*\r\n#2\[ \t\]*$hex in main.*" \
	"backtrace in TPCS"

gdb_test "info frame" \
	".*Saved registers:.*r7 at.*r10 at.*r11 at.*lr at.*" \
	"saved registers in TPCS"


# Testcase for "switching" the stack to the same stack in the prologue.

gdb_breakpoint "switch_stack_to_same"

gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_same \\(\\)" \
	"continue to switch_stack_to_same"

gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, sp"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_same .*\r\n#2\[ \t\]*$hex in main.*" \
	"backtrace in write_sp"

# Testcase for switching to another stack in the prologue.

gdb_breakpoint "switch_stack_to_other"

gdb_test "continue" "Breakpoint .*, $hex in switch_stack_to_other \\(\\)" \
	"continue to switch_stack_to_other"

gdb_test "stepi 2" "in write_sp \\(\\)" "stepi over mov sp, 128"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in write_sp .*\r\n#1\[ \t\]*$hex in switch_stack_to_other .*\r\n#2\[ \t\]*$hex in main.*" \
	"backtrace in write_sp"
