]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.reverse/step-reverse.exp
2009-06-27 Michael Snyder <msnyder@vmware.com>
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.reverse / step-reverse.exp
1 # Copyright 2008, 2009 Free Software Foundation, Inc.
2
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 3 of the License, or
6 # (at your option) any later version.
7 #
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.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>. */
15
16 # This file is part of the GDB testsuite. It tests reverse stepping.
17 # Lots of code borrowed from "step-test.exp".
18
19 #
20 # Test step and next in reverse
21 #
22
23 if ![target_info exists gdb,can_reverse] {
24 return
25 }
26
27 set testfile "step-reverse"
28 set srcfile ${testfile}.c
29
30 if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
31 return -1
32 }
33
34 runto main
35
36 if [target_info exists gdb,use_precord] {
37 # Activate process record/replay
38 gdb_test "record" "" "Turn on process record"
39 # FIXME: command ought to acknowledge, so we can test if it succeeded.
40 }
41
42 # plain vanilla step/next (no count)
43
44 gdb_test "next" ".*NEXT TEST 1.*" "next test 1"
45 gdb_test "step" ".*STEP TEST 1.*" "step test 1"
46
47 # step/next with count
48
49 gdb_test "next 2" ".*NEXT TEST 2.*" "next test 2"
50 gdb_test "step 3" ".*STEP TEST 2.*" "step test 2"
51
52 # step over call
53
54 gdb_test "step" ".*NEXT OVER THIS CALL.*" "step up to call"
55 gdb_test "next" ".*STEP INTO THIS CALL.*" "next over call"
56
57 # step into call
58
59 gdb_test "step" ".*ARRIVED IN CALLEE.*" "step into call"
60
61 # finish out of call
62
63 set test_message "finish out of fn call"
64 gdb_test_multiple "finish" "$test_message" {
65 -re "FINISH TEST.*$gdb_prompt $" {
66 pass "$test_message"
67 }
68 -re "STEP INTO THIS CALL.*$gdb_prompt $" {
69 send_gdb "step\n"
70 exp_continue
71 }
72 }
73
74 # stepi over flat code (no calls)
75
76 set test_message "simple stepi"
77 gdb_test_multiple "stepi" "$test_message" {
78 -re "STEPI TEST.*$gdb_prompt $" {
79 pass "$test_message"
80 }
81 -re "FINISH TEST.*$gdb_prompt $" {
82 send_gdb "stepi\n"
83 exp_continue
84 }
85 -re "NEXTI TEST.*$gdb_prompt $" {
86 fail "$test_message (too far)"
87 }
88 }
89
90 # stepi into a function call
91
92 set test_message "stepi into function call"
93 gdb_test_multiple "stepi" "$test_message" {
94 -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
95 pass "$test_message"
96 }
97 -re "NEXTI TEST.*$gdb_prompt $" {
98 fail "$test_message (too far)"
99 }
100 -re "RETURN FROM CALLEE.*$gdb_prompt $" {
101 fail "$test_message (too far)"
102 }
103 -re "ENTER CALLEE.*$gdb_prompt $" {
104 send_gdb "stepi\n"
105 exp_continue
106 }
107 }
108
109 # stepi thru return of a function call
110
111 set test_message "stepi back from function call"
112 gdb_test_multiple "stepi" "$test_message" {
113 -re "NEXTI TEST.*$gdb_prompt $" {
114 pass "$test_message"
115 }
116 -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
117 send_gdb "stepi\n"
118 exp_continue
119 }
120 -re "RETURN FROM CALLEE.*$gdb_prompt $" {
121 send_gdb "stepi\n"
122 exp_continue
123 }
124 -re "STEPI TEST.*$gdb_prompt $" {
125 send_gdb "stepi\n"
126 exp_continue
127 }
128 -re "ENTER CALLEE.*$gdb_prompt $" {
129 fail "$test_message (too far)"
130 }
131 }
132
133 ###
134 ###
135 ###
136
137 # Set reverse execution direction
138 # FIXME: command needs to acknowledge, so we can test if it succeeded.
139
140 gdb_test "set exec-dir reverse" "" "set reverse execution"
141
142 # stepi backward thru return and into a function
143
144 set stepi_location [gdb_get_line_number "ARRIVED IN CALLEE" "$srcfile"]
145 set test_message "reverse stepi thru function return"
146 gdb_test_multiple "stepi" "$test_message" {
147 -re "NEXTI TEST.*$gdb_prompt $" {
148 fail "$test_message (start statement)"
149 }
150 -re "RETURN FROM CALLEE.*$gdb_prompt $" {
151 send_gdb "stepi\n"
152 exp_continue
153 }
154 -re "$hex\[ \t\]*$stepi_location.*ARRIVED IN CALLEE.*$gdb_prompt $" {
155 send_gdb "stepi\n"
156 exp_continue
157 }
158 -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
159 pass "$test_message"
160 }
161 -re "ENTER CALLEE.*$gdb_prompt $" {
162 fail "$test_message (too far)"
163 }
164 -re "STEPI TEST.*$gdb_prompt $" {
165 fail "$test_message (too far)"
166 }
167 }
168
169 # stepi backward out of a function call
170
171 set stepi_location [gdb_get_line_number "FINISH TEST" "$srcfile"]
172 set test_message "reverse stepi from a function call"
173 gdb_test_multiple "stepi" "$test_message" {
174 -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
175 fail "$test_message (start statement)"
176 }
177 -re "ENTER CALLEE.*$gdb_prompt $" {
178 send_gdb "stepi\n"
179 exp_continue
180 }
181 -re "${hex}\[ \t\]*$stepi_location.*STEPI TEST.*$gdb_prompt $" {
182 send_gdb "stepi\n"
183 exp_continue
184 }
185 -re "STEPI TEST.*$gdb_prompt $" {
186 pass "$test_message"
187 }
188 -re "STEP INTO THIS CALL.*$gdb_prompt $" {
189 fail "$test_message (too far)"
190 }
191 }
192
193 # stepi backward over flat code (no calls)
194
195 set stepi_location [gdb_get_line_number "FINISH TEST" "$srcfile"]
196 set test_message "simple reverse stepi"
197 gdb_test_multiple "stepi" "$test_message" {
198 -re "STEPI TEST.*$gdb_prompt $" {
199 fail "$test_message (start statement)"
200 }
201 -re "$hex\[ \t\]*$stepi_location.* FINISH TEST.*$gdb_prompt $" {
202 send_gdb "stepi\n"
203 exp_continue
204 }
205 -re "$stepi_location.* FINISH TEST.*$gdb_prompt $" {
206 pass "$test_message"
207 }
208 -re "STEP INTO THIS CALL.*$gdb_prompt $" {
209 fail "$test_message (too far)"
210 }
211 }
212
213 # step backward into function (thru return)
214
215 set test_message "reverse step into fn call"
216 gdb_test_multiple "step" "$test_message" {
217 -re "RETURN FROM CALLEE.*$gdb_prompt $" {
218 send_gdb "step\n"
219 exp_continue
220 }
221 -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
222 pass "$test_message"
223 }
224 }
225
226 # step backward out of called function (thru call)
227
228 gdb_test "step" ".*STEP INTO THIS CALL.*" "reverse step out of called fn"
229
230 # next backward over call
231
232 gdb_test "next" ".*NEXT OVER THIS CALL.*" "reverse next over call"
233
234 # step/next backward with count
235
236 gdb_test "step 3" ".*REVERSE STEP TEST 1.*" "reverse step test 1"
237 gdb_test "next 2" ".*REVERSE NEXT TEST 1.*" "reverse next test 1"
238
239 # step/next backward without count
240
241 gdb_test "step" ".*STEP TEST 1.*" "reverse step test 2"
242 gdb_test "next" ".*NEXT TEST 1.*" "reverse next test 2"
243
244
245
246 # Finish test by running forward to the end.
247 # FIXME return to this later...
248 # gdb_test "set exec-dir forward" "" "set forward execution"
249 # gdb_continue_to_end "step-reverse.exp"
250
251 return 0