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