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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

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 ${binfile}] {
    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}] != "" } {
     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
