# Copyright 2018-2020 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 file is part of the gdb testsuite.

# This test was added to test GDB's ability to backtrace over a large
# stack frame for which there is no debug information.  This should
# test the non-DWARF stack unwinder.
#
# The test was originally added for Risc-V where this case caused a
# problem at one point, however, there's nothing Risc-V specific in
# the test.

proc run_test { opt_level } {
    global srcfile srcfile2 binfile hex

    standard_testfile large-frame-1.c large-frame-2.c

    if {[prepare_for_testing_full "failed to prepare" \
	     [list ${binfile}-${opt_level} debug \
		  $srcfile [list debug] \
		  $srcfile2 [list nodebug optimize=-$opt_level]]]} {
	return
    }

    if { ![runto_main] } then {
	unsupported "runto main"
	return
    }

    gdb_breakpoint "blah"
    gdb_continue_to_breakpoint "blah"

    gdb_test "backtrace" [multi_line \
			      "#0  blah \[^\n\r\]+" \
			      "#1  $hex in func \[^\n\r\]+" \
			      "#2  $hex in main \[^\n\r\]+"]
}

foreach opt { O0 O1 O2 } {
    with_test_prefix "optimize=-$opt" {
	run_test $opt
    }
}

