diff options
Diffstat (limited to 'gdb/testsuite/gdb.base/restore.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/restore.exp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/restore.exp b/gdb/testsuite/gdb.base/restore.exp new file mode 100644 index 00000000000..64b714bd1b6 --- /dev/null +++ b/gdb/testsuite/gdb.base/restore.exp @@ -0,0 +1,111 @@ +# Copyright (C) 1998 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 + + # Set breakpoints at each of the `caller' functions. + for {set c 1} {$c <= $limit} {incr c} { + gdb_test "break caller$c" "Breakpoint.*\[0-9\]*\\." "break caller$c" + } + + # Set breakpoints at each of the `callee' functions. + for {set c 1} {$c <= $limit} {incr c} { + gdb_test "break callee$c" "Breakpoint.*\[0-9\]*\\." "break caller$c" + } + + # 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} { + + # 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 " 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 0xfeeb + $var] + gdb_test "print l$var" " = $expected" \ + "caller$c called callee$e; variable l$var restored" + } + } + } + + send_gdb "continue\n" + + gdb_expect { + -re "exiting" { + pass "run to completion" + } + timeout { + fail "(timeout) run to completion" + } + } +} + + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +set timeout 30 +restore_tests |