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