Remove path name from test case
[binutils-gdb.git] / gdb / testsuite / gdb.reverse / machinestate.exp
1 # Copyright 2008-2023 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 by reverse execution. 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 require supports_reverse
39
40 standard_testfile .c ms1.c
41
42 if { [prepare_for_testing "failed to prepare" $testfile \
43 [list $srcfile $srcfile2]] } {
44 return -1
45 }
46
47 set newline "\[\r\n\]+"
48
49 set beginmain [gdb_get_line_number " begin main " $srcfile]
50 set endmain [gdb_get_line_number " end main " $srcfile]
51
52 # Test begins
53
54 runto_main
55
56 if [supports_process_record] {
57 # Activate process record/replay
58 gdb_test_no_output "record" "turn on process record"
59 }
60
61 # Proceed to end of main
62
63 gdb_test "break $endmain" \
64 "Breakpoint.* file .*$srcfile, line $endmain.*" \
65 "break at end of main"
66 gdb_continue_to_breakpoint "end of main" ".*$srcfile:$endmain.*"
67
68 ###
69 ###
70 ###
71
72 # Now run backward to each of several points where data is changed.
73 #
74
75 # Module global variable, reverse
76 with_test_prefix "module global variable, reverse" {
77 set breakloc [gdb_get_line_number \
78 "module_global_state: set breakpoint here" $srcfile]
79
80 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
81 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
82
83 gdb_test "print aglobal" " = 0" "module global reverse-breakpoint"
84 gdb_test "step" " module global post-change .*"
85 gdb_test "print aglobal" " = 1" "module global forward past bp"
86 gdb_test "reverse-step" "$newline$breakloc.*"
87 gdb_test "print aglobal" " = 0" "module global reverse-step to bp"
88 }
89
90 # Module static variable, reverse
91 with_test_prefix "module static variable, reverse" {
92 set breakloc [gdb_get_line_number \
93 "module_static_state: set breakpoint here" $srcfile]
94
95 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
96 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
97
98 gdb_test "print astatic" " = 0" "module static reverse-breakpoint"
99 gdb_test "step" " module static post-change .*"
100 gdb_test "print astatic" " = 1" "module static forward"
101 gdb_test "reverse-step" "$newline$breakloc.*"
102 gdb_test "print astatic" " = 0" "module static reverse-step"
103 }
104
105 # Function static variable, reverse
106 with_test_prefix "function static variable, reverse" {
107 set breakloc [gdb_get_line_number \
108 "function_static_state: set breakpoint here" $srcfile]
109
110 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
111 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
112
113 gdb_test "print a" " = 0" "function static reverse-breakpoint"
114 gdb_test "step" " function static post-change .*"
115 gdb_test "print a" " = 1" "function static forward"
116 gdb_test "reverse-step" "$newline$breakloc.*"
117 gdb_test "print a" " = 0" "function static reverse-step"
118 }
119
120 # Auto variable, reverse
121 with_test_prefix "auto variable, reverse" {
122 set breakloc [gdb_get_line_number \
123 "auto_state: set breakpoint here" $srcfile]
124
125 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
126 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
127
128 gdb_test "print a" " = 0" "auto var reverse-breakpoint"
129 gdb_test "step" " auto post-change .*"
130 gdb_test "print a" " = 1" "auto var forward"
131 gdb_test "reverse-step" "$newline$breakloc.*"
132 gdb_test "print a" " = 0" "auto var reverse-step"
133 }
134
135 # Register variable, reverse
136 with_test_prefix "register variable, reverse" {
137 set breakloc [gdb_get_line_number \
138 "register_state: set breakpoint here" $srcfile]
139
140 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
141 gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
142
143 gdb_test "print a" " = 0" "register var reverse-breakpoint"
144 gdb_test "step" " register post-change .*"
145 gdb_test "print a" " = 1" "register var step post-change"
146 gdb_test "reverse-step" "$newline$breakloc.*"
147 gdb_test "print a" " = 0" \
148 "register var reverse step-to, first time"
149 }
150
151 # Proceed to beginning of main
152
153 gdb_test "tbreak $beginmain" "$srcfile, line $beginmain.*"
154 gdb_test "reverse-continue" "$srcfile:$beginmain.*" "reverse to main"
155
156 # Now repeat tests while replaying forward.
157
158 # Register variable, forward
159
160 with_test_prefix "register variable, forward" {
161 set breakloc [gdb_get_line_number \
162 "register_state: set breakpoint here" $srcfile]
163
164 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
165 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
166
167 gdb_test "print a" " = 0" "register var forward-breakpoint"
168 gdb_test "reverse-step" "hide.*"
169 gdb_test "step" "$newline$breakloc.*" "step, 1"
170 gdb_test "print a" " = 0" "register var forward step-to"
171 gdb_test "step" " register post-change .*" "step, 2"
172 gdb_test "print a" " = 1" \
173 "register var step post-change, second time"
174 }
175
176 # Auto variable, forward
177 with_test_prefix "auto variable, forward" {
178 set breakloc [gdb_get_line_number \
179 "auto_state: set breakpoint here" $srcfile]
180
181 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
182 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
183
184 gdb_test "print a" " = 0" "auto var forward-breakpoint"
185 gdb_test "reverse-step" "hide.*"
186 gdb_test "step" "$newline$breakloc.*" "step, 1"
187 gdb_test "print a" " = 0" "auto var forward step-to"
188 gdb_test "step" " auto post-change .*" "step, 2"
189 gdb_test "print a" " = 1" "auto var step post-change"
190 }
191
192 # Function static variable, forward
193 with_test_prefix "function static variable, forward" {
194 set breakloc [gdb_get_line_number \
195 "function_static_state: set breakpoint here" $srcfile]
196
197 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
198 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
199
200 gdb_test "print a" " = 0" "function static forward-breakpoint"
201 gdb_test "reverse-step" "hide.*"
202 gdb_test "step" "$newline$breakloc.*" "step, 1"
203 gdb_test "print a" " = 0" "function static forward step-to"
204 gdb_test "step" " function static post-change .*" "step, 2"
205 gdb_test "print a" " = 1" "function static step post-change"
206 }
207
208 # Module static variable, forward
209 with_test_prefix "module static variable, forward" {
210 set breakloc [gdb_get_line_number \
211 "module_static_state: set breakpoint here" $srcfile]
212
213 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
214 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
215
216 gdb_test "print astatic" " = 0" "module static forward-breakpoint"
217 gdb_test "reverse-step" "hide.*"
218 gdb_test "step" "$newline$breakloc.*" "step, 1"
219 gdb_test "print astatic" " = 0" "module static forward step-to"
220 gdb_test "step" " module static post-change .*" "step, 2"
221 gdb_test "print astatic" " = 1" "module static step post-change"
222 }
223
224 # Module global variable, forward
225 with_test_prefix "module global variable, forward" {
226 set breakloc [gdb_get_line_number \
227 "module_global_state: set breakpoint here" $srcfile]
228
229 gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
230 gdb_test "continue" "$srcfile:$breakloc.*" "forward to $breakloc"
231
232 gdb_test "print aglobal" " = 0" "module global forward-breakpoint"
233 gdb_test "reverse-step" "hide.*"
234 gdb_test "step" "$newline$breakloc.*" "step, 1"
235 gdb_test "print aglobal" " = 0" "module global forward step-to"
236 gdb_test "step" " module global post-change .*" "step, 2"
237 gdb_test "print aglobal" " = 1" "module global step post-change"
238 }