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