--- /dev/null
+# Copyright 2009\r
+# Free Software Foundation, Inc.\r
+\r
+# This program is free software; you can redistribute it and/or modify\r
+# it under the terms of the GNU General Public License as published by\r
+# the Free Software Foundation; either version 3 of the License, or\r
+# (at your option) any later version.\r
+#\r
+# This program is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+# GNU General Public License for more details.\r
+#\r
+# You should have received a copy of the GNU General Public License\r
+# along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+\r
+# Test Machine interface (MI) operations\r
+# Verify that, using the MI, we can run a simple program in both forward\r
+# and reverse directions with the following execution commands:\r
+# - exec-continue\r
+# - exec-finish\r
+# - exec-next\r
+# - exec-step\r
+# - exec-next-instruction\r
+# - exec-step-instruction\r
+\r
+# The goal is not to test gdb functionality, which is done by other tests,\r
+# but to verify the correct output response to MI operations.\r
+#\r
+\r
+if ![target_info exists gdb,can_reverse] {\r
+ return\r
+}\r
+\r
+load_lib mi-support.exp\r
+set MIFLAGS "-i=mi"\r
+\r
+gdb_exit\r
+if [mi_gdb_start] {\r
+ continue\r
+}\r
+\r
+set testfile "basics"\r
+set srcfile ${testfile}.c\r
+set binfile ${objdir}/${subdir}/mi2-reverse\r
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {\r
+ untested mi2-reverse.exp\r
+ return -1\r
+}\r
+\r
+mi_run_to_main\r
+\r
+if [target_info exists gdb,use_precord] {\r
+ # Activate process record/replay\r
+ if [mi_gdb_test "-interpreter-exec console record" \\r
+ {\^done} "Turn on process record"] {\r
+ warning "Fail to activate process record/replay, tests in this group will not be performed.\n";\r
+ return -1\r
+ }\r
+}\r
+\r
+# Locate line numbers in basics.c.\r
+set line_callee4_head [gdb_get_line_number "callee4 ("]\r
+set line_callee4_body [expr $line_callee4_head + 2]\r
+set line_callee3_head [gdb_get_line_number "callee3 ("]\r
+set line_callee3_body [expr $line_callee3_head + 2]\r
+set line_callee3_close [expr $line_callee3_head + 3]\r
+set line_callee2_head [gdb_get_line_number "callee2 ("]\r
+set line_callee2_body [expr $line_callee2_head + 2]\r
+set line_callee2_close [expr $line_callee2_head + 3]\r
+set line_callee1_head [gdb_get_line_number "callee1 ("]\r
+set line_callee1_body [expr $line_callee1_head + 2]\r
+set line_callee1_close [expr $line_callee1_head + 3]\r
+set line_callme_head [gdb_get_line_number "callme"]\r
+set line_callme_body [expr $line_callme_head + 2]\r
+set line_main_head [gdb_get_line_number "main ("]\r
+set line_main_body [expr $line_main_head + 2]\r
+set line_main_hello [gdb_get_line_number "Hello, World!"]\r
+set line_main_callme_1 [gdb_get_line_number "callme (1"]\r
+\r
+# Forward execute to the callme() function, so that we can\r
+# execute backward from there.\r
+mi_continue_to callme\r
+mi_delete_breakpoints\r
+\r
+proc test_controlled_execution_reverse {} {\r
+ global mi_gdb_prompt\r
+ global srcfile\r
+ global hex\r
+\r
+ global line_callee4_head line_callee4_body\r
+ global line_callee3_head line_callee3_body line_callee3_close\r
+ global line_callee2_head line_callee2_body line_callee2_close\r
+ global line_callee1_head line_callee1_body line_callee1_close\r
+ global line_main_head line_main_body\r
+ global line_main_hello line_main_callme_1\r
+\r
+ # Test exec-reverse-finish\r
+\r
+ mi_execute_to "exec-finish --reverse" \\r
+ "end-stepping-range" "main" "" \\r
+ "basics.c" $line_main_callme_1 "" \\r
+ "reverse finish from callme"\r
+\r
+ # Test exec-reverse-next\r
+ # It takes two steps to get back to the previous line,\r
+ # as the first step moves us to the start of the current line,\r
+ # and the one after that moves back to the previous line.\r
+\r
+ mi_execute_to "exec-next --reverse 2" \\r
+ "end-stepping-range" "main" "" \\r
+ "basics.c" $line_main_hello "" \\r
+ "reverse next to get over the call to do_nothing"\r
+\r
+ # Test exec-reverse-step\r
+\r
+ mi_execute_to "exec-step --reverse" \\r
+ "end-stepping-range" "callee1" \\r
+ "\{name=\"intarg\",value=\"2\"\},\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\},\{name=\"fltarg\",value=\"3.5\"\}" \\r
+ "basics.c" $line_callee1_close "" \\r
+ "reverse step to callee1"\r
+\r
+ mi_execute_to "exec-step --reverse" \\r
+ "end-stepping-range" "callee2" \\r
+ "\{name=\"intarg\",value=\"2\"\},\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \\r
+ "basics.c" $line_callee2_close "" \\r
+ "reverse step to callee2"\r
+\r
+ mi_execute_to "exec-step --reverse" \\r
+ "end-stepping-range" "callee3" \\r
+ "\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \\r
+ "basics.c" $line_callee3_close "" \\r
+ "reverse step to callee3"\r
+\r
+ mi_execute_to "exec-step --reverse" \\r
+ "end-stepping-range" "callee4" "" \\r
+ "basics.c" "\[0-9\]+" "" \\r
+ "reverse step to callee4"\r
+\r
+ # Test exec-reverse-[step|next]-instruction\r
+\r
+ mi_execute_to "exec-step-instruction --reverse" \\r
+ "end-stepping-range" "callee4" "" \\r
+ "basics.c" "\[0-9\]+" "" \\r
+ "reverse-step-instruction at callee4"\r
+\r
+ mi_execute_to "exec-next-instruction --reverse" \\r
+ "end-stepping-range" "callee4" "" \\r
+ "basics.c" "\[0-9\]+" "" \\r
+ "reverse-next-instruction at callee4"\r
+\r
+ # Test exec-reverse-continue\r
+\r
+ mi_create_breakpoint "-t basics.c:$line_callee3_head" \\r
+ 3 del callee3 ".*basics.c" $line_callee3_head $hex \\r
+ "insert temp breakpoint at basics.c:$line_callee3_head"\r
+\r
+ mi_execute_to "exec-continue --reverse" \\r
+ "breakpoint-hit" "callee3" \\r
+ "\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \\r
+ "basics.c" "\[0-9\]+" \\r
+ { "" "disp=\"del\""} \\r
+ "reverse-continue at callee3"\r
+\r
+ mi_execute_to "exec-continue --reverse" \\r
+ "" "main" "" \\r
+ "basics.c" $line_main_body "" \\r
+ "reverse-continue at main"\r
+}\r
+\r
+test_controlled_execution_reverse\r
+\r
+mi_gdb_exit\r
+return 0\r