]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.reverse/machinestate-precsave.exp
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.reverse / machinestate-precsave.exp
1 # Copyright 2008-2024 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.
17 # This test tests the restoration of various kinds of machine state
18 # to their original values with a process record log. We will execute
19 # the program forward while it changes various types of data, and
20 # then execute it backward to see if their values get restored.
21 #
22 # The types of machine state (data) that are tested are:
23 # register variable
24 # auto variable
25 # function static variable
26 # module static variable
27 # module global variable
28 #
29 # TODO:
30 # various, possibly including...
31 # .bss variable, .data variable, ...
32 # shared library variable
33 # heap variable (pointer)...
34 # overlay variables...
35 # Test forward replay
36 #
37
38 # This test suitable only for process record-replay
39 require supports_process_record
40
41 standard_testfile machinestate.c ms1.c
42 set precsave [standard_output_file machinestate.precsave]
43
44 if { [prepare_for_testing "failed to prepare" $testfile \
45 [list $srcfile $srcfile2]] } {
46 return -1
47 }
48
49 set newline "\[\r\n\]+"
50
51 set beginmain [gdb_get_line_number " begin main " $srcfile]
52 set endmain [gdb_get_line_number " end main " $srcfile]
53
54 # Test begins
55
56 runto_main
57
58 # Activate process record/replay
59 gdb_test_no_output "record" "turn on process record"
60
61 gdb_test "break $endmain" \
62 "Breakpoint $decimal at .*$srcfile, line $endmain\." \
63 "breakpoint at end of main"
64
65 gdb_test "continue" "Breakpoint .* end main .*" "run to end of main"
66
67 gdb_test "record save $precsave" \
68 "Saved core file $precsave with execution log\." \
69 "save process recfile"
70
71 gdb_test "kill" "" "kill process, prepare to debug log file" \
72 "Kill the program being debugged\\? \\(y or n\\) " "y"
73
74 gdb_test "record restore $precsave" \
75 "Restored records from core file .*" \
76 "reload prec save file"
77
78 # Proceed to end of main
79
80 gdb_test "break $endmain" \
81 "Breakpoint.* file .*$srcfile, line $endmain.*" \
82 "break at end of main"
83
84 gdb_test_multiple "continue" "go to end of main forward" {
85 -re ".*Breakpoint $decimal,.*$srcfile:$endmain.*$gdb_prompt $" {
86 pass "go to end of main forward"
87 }
88 -re "No more reverse-execution history.* end main .*$gdb_prompt $" {
89 pass "go to end of main forward"
90 }
91 }
92
93 ###
94 ###
95 ###
96
97 # Now run backward to each of several points where data is changed.
98 #
99
100 # Module global variable, reverse
101 with_test_prefix "module global variable, reverse" {
102 set breakloc [gdb_get_line_number \
103 "module_global_state: set breakpoint here" $srcfile]
104
105 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
106 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
107
108 gdb_test "print aglobal" " = 0" "module global reverse-breakpoint"
109 gdb_test "step" " module global post-change .*"
110 gdb_test "print aglobal" " = 1" "module global forward past bp"
111 gdb_test "reverse-step" "$newline$breakloc.*"
112 gdb_test "print aglobal" " = 0" "module global reverse-step to bp"
113 }
114
115 # Module static variable, reverse
116 with_test_prefix "module static variable, reverse" {
117 set breakloc [gdb_get_line_number \
118 "module_static_state: set breakpoint here" $srcfile]
119
120 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
121 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
122
123 gdb_test "print astatic" " = 0" "module static reverse-breakpoint"
124 gdb_test "step" " module static post-change .*"
125 gdb_test "print astatic" " = 1" "module static forward"
126 gdb_test "reverse-step" "$newline$breakloc.*"
127 gdb_test "print astatic" " = 0" "module static reverse-step"
128 }
129
130 # Function static variable, reverse
131 with_test_prefix "function static variable, reverse" {
132 set breakloc [gdb_get_line_number \
133 "function_static_state: set breakpoint here" $srcfile]
134
135 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
136 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
137
138 gdb_test "print a" " = 0" "function static reverse-breakpoint"
139 gdb_test "step" " function static post-change .*"
140 gdb_test "print a" " = 1" "function static forward"
141 gdb_test "reverse-step" "$newline$breakloc.*"
142 gdb_test "print a" " = 0" "function static reverse-step"
143 }
144
145 # Auto variable, reverse
146 with_test_prefix "auto variable, reverse" {
147 set breakloc [gdb_get_line_number \
148 "auto_state: set breakpoint here" $srcfile]
149
150 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
151 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
152
153 gdb_test "print a" " = 0" "auto var reverse-breakpoint"
154 gdb_test "step" " auto post-change .*"
155 gdb_test "print a" " = 1" "auto var forward"
156 gdb_test "reverse-step" "$newline$breakloc.*"
157 gdb_test "print a" " = 0" "auto var reverse-step"
158 }
159
160 # Register variable, reverse
161 with_test_prefix "register variable, reverse" {
162 set breakloc [gdb_get_line_number \
163 "register_state: set breakpoint here" $srcfile]
164
165 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
166 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
167
168 gdb_test "print a" " = 0" "register var reverse-breakpoint"
169 gdb_test "step" " register post-change .*"
170 gdb_test "print a" " = 1" \
171 "register var step post-change, first time"
172 gdb_test "reverse-step" "$newline$breakloc.*"
173 gdb_test "print a" " = 0" "register var reverse step-to"
174 }
175
176 # Proceed to beginning of main
177
178 gdb_test "tbreak $beginmain" ".*$srcfile, line $beginmain.*" \
179 "tbreak at beginning of main"
180 gdb_test "reverse-continue" ".*$srcfile:$beginmain.*" "reverse to main"
181
182 # Now repeat tests while replaying forward.
183
184 # Register variable, forward
185 with_test_prefix "register variable, forward" {
186 set breakloc [gdb_get_line_number \
187 "register_state: set breakpoint here" $srcfile]
188
189 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
190 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
191
192 gdb_test "print a" " = 0" "register var forward-breakpoint"
193 gdb_test "reverse-step" "hide.*"
194 gdb_test "step" "$newline$breakloc.*" "step, 1"
195 gdb_test "print a" " = 0" "register var forward step-to"
196 gdb_test "step" " register post-change .*" "step, 2"
197 gdb_test "print a" " = 1" \
198 "register var step post-change, second time"
199 }
200
201 # Auto variable, forward
202 with_test_prefix "auto variable, forward" {
203 set breakloc [gdb_get_line_number \
204 "auto_state: set breakpoint here" $srcfile]
205
206 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
207 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
208
209 gdb_test "print a" " = 0" "auto var forward-breakpoint"
210 gdb_test "reverse-step" "hide.*"
211 gdb_test "step" "$newline$breakloc.*" "step, 1"
212 gdb_test "print a" " = 0" "auto var forward step-to"
213 gdb_test "step" " auto post-change .*" "step, 2"
214 gdb_test "print a" " = 1" "auto var step post-change"
215 }
216
217 # Function static variable, forward
218 with_test_prefix "function static variable, forward" {
219 set breakloc [gdb_get_line_number \
220 "function_static_state: set breakpoint here" $srcfile]
221
222 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
223 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
224
225 gdb_test "print a" " = 0" "function static forward-breakpoint"
226 gdb_test "reverse-step" "hide.*"
227 gdb_test "step" "$newline$breakloc.*" "step, 1"
228 gdb_test "print a" " = 0" "function static forward step-to"
229 gdb_test "step" " function static post-change .*" "step, 2"
230 gdb_test "print a" " = 1" "function static step post-change"
231 }
232
233 # Module static variable, forward
234 with_test_prefix "module static variable, forward" {
235 set breakloc [gdb_get_line_number \
236 "module_static_state: set breakpoint here" $srcfile]
237
238 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
239 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
240
241 gdb_test "print astatic" " = 0" "module static forward-breakpoint"
242 gdb_test "reverse-step" "hide.*"
243 gdb_test "step" "$newline$breakloc.*" "step, 1"
244 gdb_test "print astatic" " = 0" "module static forward step-to"
245 gdb_test "step" " module static post-change .*" "step, 2"
246 gdb_test "print astatic" " = 1" "module static step post-change"
247 }
248
249 # Module global variable, forward
250 with_test_prefix "module global variable, forward" {
251 set breakloc [gdb_get_line_number \
252 "module_global_state: set breakpoint here" $srcfile]
253
254 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
255 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
256
257 gdb_test "print aglobal" " = 0" "module global forward-breakpoint"
258 gdb_test "reverse-step" "hide.*"
259 gdb_test "step" "$newline$breakloc.*" "step, 1"
260 gdb_test "print aglobal" " = 0" "module global forward step-to"
261 gdb_test "step" " module global post-change .*" "step, 2"
262 gdb_test "print aglobal" " = 1" "module global step post-change"
263 }
264