1# Copyright 2008-2017 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" "register var reverse step-to" 146 147# Proceed to beginning of main 148 149gdb_test "tbreak $beginmain" ".*$srcfile, line $beginmain.*" "" 150gdb_test "reverse-continue" ".*$srcfile:$beginmain.*" "reverse to main" 151 152# Now repeat tests while replaying forward. 153 154# Register variable, forward 155 156set breakloc [gdb_get_line_number \ 157 "register_state: set breakpoint here" $srcfile] 158 159gdb_test "tbreak $breakloc" ".*$srcfile, line $breakloc.*" "" 160gdb_test "continue" ".*$srcfile:$breakloc.*" "forward to $breakloc" 161 162gdb_test "print a" ".* = 0$newline" "register var forward-breakpoint" 163gdb_test "reverse-step" ".*hide.*" "" 164gdb_test "step" ".*$newline$breakloc.*" "" 165gdb_test "print a" ".* = 0$newline" "register var forward step-to" 166gdb_test "step" ".* register post-change .*" "" 167gdb_test "print a" ".* = 1$newline" "register var step post-change" 168 169# Auto variable, forward 170 171set breakloc [gdb_get_line_number \ 172 "auto_state: set breakpoint here" $srcfile] 173 174gdb_test "tbreak $breakloc" ".*$srcfile, line $breakloc.*" "" 175gdb_test "continue" ".*$srcfile:$breakloc.*" "forward to $breakloc" 176 177gdb_test "print a" ".* = 0$newline" "auto var forward-breakpoint" 178gdb_test "reverse-step" ".*hide.*" "" 179gdb_test "step" ".*$newline$breakloc.*" "" 180gdb_test "print a" ".* = 0$newline" "auto var forward step-to" 181gdb_test "step" ".* auto post-change .*" "" 182gdb_test "print a" ".* = 1$newline" "auto var step post-change" 183 184# Function static variable, forward 185 186set breakloc [gdb_get_line_number \ 187 "function_static_state: set breakpoint here" $srcfile] 188 189gdb_test "tbreak $breakloc" ".*$srcfile, line $breakloc.*" "" 190gdb_test "continue" ".*$srcfile:$breakloc.*" "forward to $breakloc" 191 192gdb_test "print a" ".* = 0$newline" "function static forward-breakpoint" 193gdb_test "reverse-step" ".*hide.*" "" 194gdb_test "step" ".*$newline$breakloc.*" "" 195gdb_test "print a" ".* = 0$newline" "function static forward step-to" 196gdb_test "step" ".* function static post-change .*" "" 197gdb_test "print a" ".* = 1$newline" "function static step post-change" 198 199# Module static variable, forward 200 201set breakloc [gdb_get_line_number \ 202 "module_static_state: set breakpoint here" $srcfile] 203 204gdb_test "tbreak $breakloc" ".*$srcfile, line $breakloc.*" "" 205gdb_test "continue" ".*$srcfile:$breakloc.*" "forward to $breakloc" 206 207gdb_test "print astatic" ".* = 0$newline" "module static forward-breakpoint" 208gdb_test "reverse-step" ".*hide.*" "" 209gdb_test "step" ".*$newline$breakloc.*" "" 210gdb_test "print astatic" ".* = 0$newline" "module static forward step-to" 211gdb_test "step" ".* module static post-change .*" "" 212gdb_test "print astatic" ".* = 1$newline" "module static step post-change" 213 214# Module global variable, forward 215 216set breakloc [gdb_get_line_number \ 217 "module_global_state: set breakpoint here" $srcfile] 218 219gdb_test "tbreak $breakloc" ".*$srcfile, line $breakloc.*" "" 220gdb_test "continue" ".*$srcfile:$breakloc.*" "forward to $breakloc" 221 222gdb_test "print aglobal" ".* = 0$newline" "module global forward-breakpoint" 223gdb_test "reverse-step" ".*hide.*" "" 224gdb_test "step" ".*$newline$breakloc.*" "" 225gdb_test "print aglobal" ".* = 0$newline" "module global forward step-to" 226gdb_test "step" ".* module global post-change .*" "" 227gdb_test "print aglobal" ".* = 1$newline" "module global step post-change" 228 229