| # Copyright 2008-2022 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/>. | 
 |  | 
 | # This file is part of the GDB testsuite.   | 
 | # 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... | 
 | #   Test forward replay | 
 | # | 
 |  | 
 | if ![supports_reverse] { | 
 |     return | 
 | } | 
 |  | 
 | standard_testfile .c ms1.c | 
 |  | 
 | if { [prepare_for_testing "failed to prepare" $testfile \ | 
 | 	  [list $srcfile $srcfile2]] } { | 
 |     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 | 
 |  | 
 | if [supports_process_record] { | 
 |     # Activate process record/replay | 
 |     gdb_test_no_output "record" "turn on process record" | 
 | } | 
 |  | 
 | # Proceed to end of main | 
 |  | 
 | gdb_test "break $endmain" \ | 
 |     "Breakpoint.* file .*$srcfile, line $endmain.*" \ | 
 |     "break at end of main" | 
 | gdb_continue_to_breakpoint "end of main" ".*$srcfile:$endmain.*" | 
 |  | 
 | ### | 
 | ### | 
 | ### | 
 |  | 
 | # Now run backward to each of several points where data is changed. | 
 | # | 
 |  | 
 | # Module global variable, reverse | 
 | with_test_prefix "module global variable, reverse" { | 
 |     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 past bp" | 
 |     gdb_test "reverse-step"  "$newline$breakloc.*" | 
 |     gdb_test "print aglobal" " = 0$newline"  "module global reverse-step to bp" | 
 | } | 
 |  | 
 | # Module static variable, reverse | 
 | with_test_prefix "module static variable, reverse" { | 
 |     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, reverse | 
 | with_test_prefix "function static variable, reverse" { | 
 |     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, reverse | 
 | with_test_prefix "auto variable, reverse" { | 
 |     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, reverse | 
 | with_test_prefix "register variable, reverse" { | 
 |     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 step post-change" | 
 |     gdb_test "reverse-step" "$newline$breakloc.*" | 
 |     gdb_test "print a"      " = 0$newline" \ | 
 | 	"register var reverse step-to, first time" | 
 | } | 
 |  | 
 | # Proceed to beginning of main | 
 |  | 
 | gdb_test "tbreak $beginmain" "$srcfile, line $beginmain.*" | 
 | gdb_test "reverse-continue"  "$srcfile:$beginmain.*" "reverse to main" | 
 |  | 
 | # Now repeat tests while replaying forward. | 
 |  | 
 | # Register variable, forward | 
 |  | 
 | with_test_prefix "register variable, forward" { | 
 |     set breakloc [gdb_get_line_number \ | 
 | 		      "register_state: set breakpoint here" $srcfile] | 
 |  | 
 |     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*" | 
 |     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc" | 
 |  | 
 |     gdb_test "print a"      " = 0$newline"  "register var forward-breakpoint" | 
 |     gdb_test "reverse-step" "hide.*" | 
 |     gdb_test "step"         "$newline$breakloc.*" "step, 1" | 
 |     gdb_test "print a"      " = 0$newline"  "register var forward step-to" | 
 |     gdb_test "step"         " register post-change .*" "step, 2" | 
 |     gdb_test "print a"      " = 1$newline" \ | 
 | 	"register var step post-change, second time" | 
 | } | 
 |  | 
 | # Auto variable, forward | 
 | with_test_prefix "auto variable, forward" { | 
 |     set breakloc [gdb_get_line_number \ | 
 | 		      "auto_state: set breakpoint here" $srcfile] | 
 |  | 
 |     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*" | 
 |     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc" | 
 |  | 
 |     gdb_test "print a"      " = 0$newline"  "auto var forward-breakpoint" | 
 |     gdb_test "reverse-step" "hide.*" | 
 |     gdb_test "step"         "$newline$breakloc.*" "step, 1" | 
 |     gdb_test "print a"      " = 0$newline"  "auto var forward step-to" | 
 |     gdb_test "step"         " auto post-change .*" "step, 2" | 
 |     gdb_test "print a"      " = 1$newline"  "auto var step post-change" | 
 | } | 
 |  | 
 | # Function static variable, forward | 
 | with_test_prefix "function static variable, forward" { | 
 |     set breakloc [gdb_get_line_number \ | 
 | 		      "function_static_state: set breakpoint here" $srcfile] | 
 |  | 
 |     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*" | 
 |     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc" | 
 |  | 
 |     gdb_test "print a"      " = 0$newline"  "function static forward-breakpoint" | 
 |     gdb_test "reverse-step" "hide.*" | 
 |     gdb_test "step"         "$newline$breakloc.*" "step, 1" | 
 |     gdb_test "print a"      " = 0$newline"  "function static forward step-to" | 
 |     gdb_test "step"         " function static post-change .*" "step, 2" | 
 |     gdb_test "print a"      " = 1$newline"  "function static step post-change" | 
 | } | 
 |  | 
 | # Module static variable, forward | 
 | with_test_prefix "module static variable, forward" { | 
 |     set breakloc [gdb_get_line_number \ | 
 | 		      "module_static_state: set breakpoint here" $srcfile] | 
 |  | 
 |     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*" | 
 |     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc" | 
 |  | 
 |     gdb_test "print astatic" " = 0$newline"  "module static forward-breakpoint" | 
 |     gdb_test "reverse-step"  "hide.*" | 
 |     gdb_test "step"          "$newline$breakloc.*" "step, 1" | 
 |     gdb_test "print astatic" " = 0$newline"  "module static forward step-to" | 
 |     gdb_test "step"          " module static post-change .*" "step, 2" | 
 |     gdb_test "print astatic" " = 1$newline"  "module static step post-change" | 
 | } | 
 |  | 
 | # Module global variable, forward | 
 | with_test_prefix "module global variable, forward" { | 
 |     set breakloc [gdb_get_line_number \ | 
 | 		      "module_global_state: set breakpoint here" $srcfile] | 
 |  | 
 |     gdb_test "tbreak $breakloc" "$srcfile, line $breakloc.*" | 
 |     gdb_test "continue"         "$srcfile:$breakloc.*" "forward to $breakloc" | 
 |  | 
 |     gdb_test "print aglobal" " = 0$newline"  "module global forward-breakpoint" | 
 |     gdb_test "reverse-step"  "hide.*" | 
 |     gdb_test "step"          "$newline$breakloc.*" "step, 1" | 
 |     gdb_test "print aglobal" " = 0$newline"  "module global forward step-to" | 
 |     gdb_test "step"          " module global post-change .*" "step, 2" | 
 |     gdb_test "print aglobal" " = 1$newline"  "module global step post-change" | 
 | } |