# Copyright 2018-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 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 {
	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
    }
}

