# Copyright 2019-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/>.

# This tests GDB's ability to handle 6 and 8 byte instructions in the
# RISC-V prologue scanner.  These instruction should be ignored, but
# should not result in an error that interrupts the debug session.
#
# Each of the files riscv-unwind-long-insn-*.s include a function
# (func) that contains a fake long instruction (6 or 8 bytes) in the
# prologue.  We trick GDB into parsing the fake instruction by tail
# calling from a different function, 'bar' to the middle of 'func'.

if {![istarget "riscv*-*-*"]} {
    verbose "Skipping ${gdb_test_file_name}."
    return
}

foreach_with_prefix {insn_size} {6 8} {
    standard_testfile riscv-unwind-long-insn.c \
	riscv-unwind-long-insn-${insn_size}.s

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

    if ![runto_main] then {
	return 0
    }

    gdb_breakpoint "bar"
    gdb_continue_to_breakpoint "bar"

    # This next single instruction step takes us through a tail-call
    # from 'bar' into 'func'.
    gdb_test "si" "func \(\).*"

    # Now check that we have a sane backtrace.
    gdb_test "bt" \
	[multi_line \
	     "#0\[ \t\]*func \\\(\\\) at .*$srcfile2:\[0-9\]+" \
	     "#1\[ \t\]*$hex in main \\\(\\\) at .*$srcfile:\[0-9\]+"] \
	"Backtrace to the main frame"

    # Finally finish, and we should end up back in main.
    gdb_test "finish" "main \\\(\\\) at .*$srcfile:.*"
}
