# Copyright 1997, 1999-2001, 2003, 2007-2012 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/>.


set testfile mips_pro
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info] {
    return -1;
}


# This test must be compiled with -O2 if using gcc.

if { [test_compiler_info gcc-*-*] } then {
    if  { [gdb_compile "${srcdir}/$subdir/${srcfile}" "${binfile}" \
	    executable {debug additional_flags=-O2 additional_flags=-fno-inline}] != "" } {
     untested mips_pro.exp
     return -1
    }
} else {
    if  { [gdb_compile "${srcdir}/$subdir/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested mips_pro.exp
     return -1
    }
}

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

if [runto middle] then {
    # PR 3016
    #   warning: Hit heuristic-fence-post without finding
    #   warning: enclosing function for pc 0x1006ead0
    if { [test_compiler_info gcc-*-*] } then {
	setup_xfail "mips*-sgi-irix4*" "mips64*-*-elf"
    }
    # The call chain is main -> top -> middle.  But gcc can optimize a tail
    # call to a jump, so the stack may contain either main -> top -> middle
    # or main -> middle.
    gdb_test "backtrace" "#0.*middle.*#\[12\].*main.*"
}
return 0
