# 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 $testfile.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"

