summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.twreverse/machinestate.exp
blob: 0a9d145969f3951bb5e806ea0245dffb5eb5d607 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# Copyright 2008 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

#
# This test tests the restoration of various kinds of machine state
# to their original values by reverse execution.  We will execute
# the program forward while it changes various types of data, and
# then execute it backward to see if their values get restored.
#
# The types of machine state (data) that are tested are:
#   register variable
#   auto variable
#   function static variable
#   module static variable
#   module global variable
#
# TODO:
# various, possibly including...
#   .bss variable, .data variable, ...
#   shared library variable
#   heap variable (pointer)...
#   overlay variables...
#


set testfile "machinestate"
set srcfile  ${testfile}.c
set srcfile1 ${testfile}1.c

if { [prepare_for_testing machinestate.exp $testfile {machinestate.c machinestate1.c} ] } {
    return -1
}

set newline "\[\r\n\]+"

set beginmain [gdb_get_line_number " begin main " $srcfile]
set endmain   [gdb_get_line_number " end main "   $srcfile]

# Test begins

runto main

# FIXME 'record' command should say something so we know it's working.
gdb_test "record" "" "start recording"

# Proceed to end of main

gdb_test "break $endmain" \
    "Breakpoint.* file .*/$srcfile, line $endmain.*" ""
gdb_continue_to_breakpoint "end of main" ".*/$srcfile:$endmain.*"

###
###
###

# Now run backward to each of several points where data is changed.
#

# Module global variable

set breakloc [gdb_get_line_number \
		  "module_global_state: set breakpoint here" $srcfile]

gdb_test "tbreak $breakloc" ".*/$srcfile, line $breakloc.*" ""
gdb_test "reverse-continue" ".*/$srcfile:$breakloc.*" "reverse to $breakloc"

gdb_test "print aglobal" ".* = 0$newline"  "module global reverse-breakpoint"
gdb_test "step"          ".* module global post-change .*" ""
gdb_test "print aglobal" ".* = 1$newline"  "module global forward"
gdb_test "reverse-step"  ".*$newline$breakloc.*" ""
gdb_test "print aglobal" ".* = 0$newline"  "module global reverse-step"


# Module static variable

set breakloc [gdb_get_line_number \
		  "module_static_state: set breakpoint here" $srcfile]

gdb_test "tbreak $breakloc" ".*/$srcfile, line $breakloc.*" ""
gdb_test "reverse-continue" ".*/$srcfile:$breakloc.*" "reverse to $breakloc"

gdb_test "print astatic" ".* = 0$newline"  "module static reverse-breakpoint"
gdb_test "step"          ".* module static post-change .*" ""
gdb_test "print astatic" ".* = 1$newline"  "module static forward"
gdb_test "reverse-step"  ".*$newline$breakloc.*" ""
gdb_test "print astatic" ".* = 0$newline"  "module static reverse-step"

# Function static variable

set breakloc [gdb_get_line_number \
		  "function_static_state: set breakpoint here" $srcfile]

gdb_test "tbreak $breakloc" ".*/$srcfile, line $breakloc.*" ""
gdb_test "reverse-continue" ".*/$srcfile:$breakloc.*" "reverse to $breakloc"

gdb_test "print a"      ".* = 0$newline"  "function static reverse-breakpoint"
gdb_test "step"         ".* function static post-change .*" ""
gdb_test "print a"      ".* = 1$newline"  "function static forward"
gdb_test "reverse-step" ".*$newline$breakloc.*" ""
gdb_test "print a"      ".* = 0$newline"  "function static reverse-step"

# Auto variable

set breakloc [gdb_get_line_number \
		  "auto_state: set breakpoint here" $srcfile]

gdb_test "tbreak $breakloc" ".*/$srcfile, line $breakloc.*" ""
gdb_test "reverse-continue" ".*/$srcfile:$breakloc.*" "reverse to $breakloc"

gdb_test "print a"      ".* = 0$newline"  "auto var reverse-breakpoint"
gdb_test "step"         ".* auto post-change .*" ""
gdb_test "print a"      ".* = 1$newline"  "auto var forward"
gdb_test "reverse-step" ".*$newline$breakloc.*" ""
gdb_test "print a"      ".* = 0$newline"  "auto var reverse-step"

# Register variable

set breakloc [gdb_get_line_number \
		  "register_state: set breakpoint here" $srcfile]

gdb_test "tbreak $breakloc" ".*/$srcfile, line $breakloc.*" ""
gdb_test "reverse-continue" ".*/$srcfile:$breakloc.*" "reverse to $breakloc"

gdb_test "print a"      ".* = 0$newline"  "register var reverse-breakpoint"
gdb_test "step"         ".* register post-change .*" ""
gdb_test "print a"      ".* = 1$newline"  "register var forward"
gdb_test "reverse-step" ".*$newline$breakloc.*" ""
gdb_test "print a"      ".* = 0$newline"  "register var reverse-step"