# Copyright 1998, 1999, 2000 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

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

# Test GDB's ability to restore saved registers from stack frames
# when using the `return' command.
#
# This file was written by Jim Blandy <jimb@cygnus.com>, with
# fragments borrowed from return.exp.

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "restore"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

proc restore_tests { } {
    global gdb_prompt

    if { ! [ runto driver ] } then { return 0 }

    set limit 5

    # For each caller function,
    #   call each of the callee functions,
    #   force a return from the callee, and
    #   make sure that the local variables still have the right values.
    for {set c 1} {$c <= $limit} {incr c} {

        # Set a breakpoint at the next caller function.
        gdb_test "tbreak caller$c" "Breakpoint.*\[0-9\]*\\." "tbreak caller$c"

	# Continue to the next caller function.
	gdb_test "continue" ".*/\\* caller$c \\*/" "run to caller$c"

	# Do each callee function.
        for {set e 1} {$e <= $limit} {incr e} {

            gdb_test "tbreak callee$e" "Breakpoint.*\[0-9\]*\\." \
                    "tbreak callee$e"
            
  	    gdb_test "continue" ".*/\\* callee$e \\*/" "run to callee$e"

            # Do a forced return from the callee.
	    send_gdb "return 0\n"
	    gdb_expect {
		-re "Make .* return now.*y or n. $" {
		    send_gdb "y\n"
		    exp_continue
		}
		-re "$gdb_prompt $" { }
            }

            # Check that the values of the local variables are what
	    # they should be.
            for {set var 1} {$var <= $c} {incr var} {
                set expected [expr 0x7eeb + $var]
	        gdb_test "print l$var" " = $expected" \
                         "caller$c called callee$e; variable l$var restored to $expected"
            }
        }
    }

    if ![gdb_skip_stdio_test "run to completion"] {
	send_gdb "continue\n"

	gdb_expect {
	    -re "exiting" {
		pass "run to completion"
	    }
	    timeout { 
		fail "(timeout) run to completion"
	    }
	}
    } else {
	gdb_test "continue" "" ""
    }
}



# Start with a fresh gdb.

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

set timeout 30
restore_tests
