1 # Copyright
2004 Free Software Foundation
, Inc.
3 # This
program is free software
; you can redistribute it and
/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation
; either version
2 of the License
, or
6 #
(at your option
) any later version.
8 # This
program is distributed in the hope that it will be useful
,
9 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License
for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this
program; if not
, write to the Free Software
15 # Foundation
, Inc.
, 59 Temple Place
- Suite
330, Boston
, MA
02111-1307, USA.
17 # This test is to check that a frame
's "info frame", especially the
18 # saved registers list, doesn't change
while that frame isn
't current.
20 # It uses the program savedregs.c to construct a somewhat warped
21 # backtrace (contains both signal and dummy frames) and then, at each
22 # step checks that non-inner frames have consistent "info frame"
23 # output. Note that a frame's
"info frame" can only be captured after
24 # it is non
-current
(made a
call, interrupted
, ...
), this is because
25 # instructions executed to perform the
call may affect
"info frame"
28 if [target_info
exists gdb
,nosignals
] {
29 verbose
"Skipping savedregs.exp because of nosignals."
40 set testfile savedregs
41 set srcfile $
{testfile
}.c
42 set binfile $
{objdir
}/$
{subdir
}/$
{testfile
}
43 if { [gdb_compile
"${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
44 untested
"Couldn't compile ${module}.c"
51 gdb_reinitialize_dir $srcdir
/$subdir
55 if { ![runto_main
] } {
59 proc process_saved_regs
{ current inner outer
} {
64 # Skip the CURRENT frame.
68 # Run over the list of INNER frames capturing the
"info frame"
69 # output
for each. Both dummy and sigtramp frames need to be
70 # handled specially
: they
do not yet have correct function names
;
71 # and
for dummy frames won
't have saved registers. If there's a
72 # problem
, fail but capture the output anyway
, hopefully later
73 #
"info frame" requests for that same frame will at least fail in
74 # a consistent manner
(stops propogated fails
).
77 set saved_regs
($func
) "error"
78 set test
"Get $func info frame"
79 # Both dummy and sigtramp frames have problems.
82 # Dummy frame
's do not have saved registers, and do
84 set pat "Stack frame at .*"
87 # Sigtramp frames don't yet print
<signal trampoline
>.
88 set pat
"Stack frame at .* Saved registers:.*"
91 set pat
"Stack frame at .* in $func .* Saved registers:.*"
94 #
If the
"info frame" barf, capture the output anyway so that
95 # it does not cascade further failures.
96 gdb_test_multiple
"info frame $level" "$test" {
97 -re
"($pat)$gdb_prompt " {
98 set saved_regs
($func
) "$expect_out(1,string)"
101 -re
"(Stack frame at .*)$gdb_prompt " {
102 set saved_regs
($func
) "$expect_out(1,string)"
105 -re
"(Cannot access .*)$gdb_prompt " {
106 set saved_regs
($func
) "$expect_out(1,string)"
113 # Now iterate through the list of OUTER frames checking that the
114 #
"info frame" output from each still matches what was captured
115 # during an early query. To avoid cascading failures
, checking is
116 # abandoned after the first failure. The assumption is that
,
117 # since frames outer to the botched frame rely
on the botched
118 # frame
's info, those more outer frames are also botched. Besides
119 # we've got the failure we
're after.
122 foreach func $outer {
123 set test [concat "Check $func info frame; stack contains" \
124 $current $inner $outer]
127 set pat [string_to_regexp "$saved_regs($func)"]
128 gdb_test_multiple "info frame $level" "$test" {
129 -re "$pat$gdb_prompt " {
135 pass "$test (skipped)"
142 # Continue to the signal thrower, capture main's saved
-reg
info.
143 gdb_test
"advance thrower" "thrower .* at .*"
144 process_saved_regs thrower
{ main
} { }
146 #
Continue to the
signal catcher
, check main
's saved-reg info, capture
147 # catcher's saved
-reg
info.
148 gdb_test
"handle SIGSEGV pass print nostop"
149 gdb_test
"advance catcher" "catcher .* at .*"
150 process_saved_regs catcher
{ sigtramp thrower
} { main
}
152 # Breakpoint at and
call the caller function
, saved
-regs of main and
153 # catcher
, capture caller
's registers.
154 gdb_test "break caller"
155 gdb_test "call caller (1,2,3,4,5,6,7,8)"
156 process_saved_regs caller { dummy catcher } { sigtramp thrower main }
158 # Run to callee, again check everything.
159 gdb_test "advance callee" "callee .* at .*"
160 process_saved_regs callee { caller } { dummy catcher sigtramp thrower main }