# Copyright 2006-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 PowerPC(64le) prologue analyzer.

# Do not run on AIX (where we won't be able to build the tests without
# some surgery) or on PowerPC64 (ditto, dot symbols).
if {[istarget *-*-aix*] || ![istarget "powerpc*-*-*"]} then {
    verbose "Skipping PowerPC prologue tests."
    return
}

standard_testfile .c

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

if { [prepare_for_testing "failed to prepare" $testfile "$srcfile" \
      {}] } {
    return -1
}

# Run to `main' where we begin our tests.
if ![runto_main] then {
    return 0
}

# Testcase for PIC prologue.
gdb_breakpoint "gdb2029_marker"
gdb_test "continue" "Breakpoint $decimal, $hex in gdb2029_marker \\(\\).*" \
	"continue to PIC"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in gdb2029_marker.*\r\n#1\[ \t\]*$hex in gdb2029.*\r\n#2\[ \t\]*$hex in main.*" \
	"backtrace in PIC marker"

gdb_test "finish" ".*$hex in gdb2029 .*" "finish from PIC"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in gdb2029 .*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in PIC"

gdb_test "info frame" \
	".*Saved registers:.*r31 at.*pc at.*lr at.*" \
	"saved registers in PIC"

# Testcase for scheduled prologue.
gdb_breakpoint "optimized_1_marker"
gdb_test "continue" "Breakpoint $decimal, $hex in optimized_1_marker \\(\\).*" \
	"continue to optimized"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in optimized_1_marker.*\r\n#1\[ \t\]*$hex in optimized_1.*\r\n#2\[ \t\]*$hex in main.*" \
	"backtrace in optimized marker"

gdb_test "finish" ".*$hex in optimized_1 .*" "finish from optimized"

gdb_test "backtrace 10" \
	"#0\[ \t\]*$hex in optimized_1 .*\r\n#1\[ \t\]*$hex in main.*" \
	"backtrace in optimized"

gdb_test "info frame" \
	".*Saved registers:.*r30 at.*pc at.*lr at.*" \
	"saved registers in optimized"

