Automatic date update in version.in
[binutils-gdb.git] / gdb / testsuite / gdb.reverse / machinestate.exp
blobb4edfa0e954939e5105493103648896c80e0b65e
1 # Copyright 2008-2024 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 3 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, see <http://www.gnu.org/licenses/>.
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.
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
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
38 require supports_reverse
40 standard_testfile .c ms1.c
42 if { [prepare_for_testing "failed to prepare" $testfile \
43           [list $srcfile $srcfile2]] } {
44     return -1
47 set newline "\[\r\n\]+"
49 set beginmain [gdb_get_line_number " begin main " $srcfile]
50 set endmain   [gdb_get_line_number " end main "   $srcfile]
52 # Test begins
54 runto_main
56 if [supports_process_record] {
57     # Activate process record/replay
58     gdb_test_no_output "record" "turn on process record"
61 # Proceed to end of main
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.*"
68 ###
69 ###
70 ###
72 # Now run backward to each of several points where data is changed.
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]
80     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
81     gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
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"
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]
95     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
96     gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
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"
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]
110     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
111     gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
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"
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]
125     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
126     gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
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"
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]
140     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
141     gdb_test "reverse-continue" "$srcfile:$breakloc.*" "reverse to $breakloc"
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"
151 # Proceed to beginning of main
153 gdb_test "tbreak $beginmain" "$srcfile, line $beginmain.*"
154 gdb_test "reverse-continue"  "$srcfile:$beginmain.*" "reverse to main"
156 # Now repeat tests while replaying forward.
158 # Register variable, forward
160 with_test_prefix "register variable, forward" {
161     set breakloc [gdb_get_line_number \
162                       "register_state: set breakpoint here" $srcfile]
164     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
165     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc"
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"
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]
181     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
182     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc"
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"
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]
197     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
198     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc"
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"
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]
213     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
214     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc"
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"
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]
229     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*"
230     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc"
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"