# Copyright 2009, 2011-2012 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/>.

# Test Machine interface (MI) operations
# Verify that, using the MI, we can run a simple program in both forward
# and reverse directions with the following execution commands:
# - exec-continue
# - exec-finish
# - exec-next
# - exec-step
# - exec-next-instruction
# - exec-step-instruction

# The goal is not to test gdb functionality, which is done by other tests,
# but to verify the correct output response to MI operations.
#

if ![supports_reverse] {
    return
}

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile basics.c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested ${testfile}.exp
     return -1
}

mi_run_to_main

if [supports_process_record] {
    # Activate process record/replay
    if [mi_gdb_test "-interpreter-exec console record" \
	{\^done} "Turn on process record"] {
	warning "Fail to activate process record/replay, tests in this group will not be performed.\n";
	return -1
    }
}

# Locate line numbers in basics.c.
set line_callee4_head  [gdb_get_line_number "callee4 ("]
set line_callee4_body  [expr $line_callee4_head + 2]
set line_callee3_head  [gdb_get_line_number "callee3 ("]
set line_callee3_body  [expr $line_callee3_head + 2]
set line_callee3_close [expr $line_callee3_head + 3]
set line_callee2_head  [gdb_get_line_number "callee2 ("]
set line_callee2_body  [expr $line_callee2_head + 2]
set line_callee2_close [expr $line_callee2_head + 3]
set line_callee1_head  [gdb_get_line_number "callee1 ("]
set line_callee1_body  [expr $line_callee1_head + 2]
set line_callee1_close [expr $line_callee1_head + 3]
set line_callme_head   [gdb_get_line_number "callme"]
set line_callme_body   [expr $line_callme_head + 2]
set line_main_head     [gdb_get_line_number "main ("]
set line_main_body     [expr $line_main_head + 2]
set line_main_hello    [gdb_get_line_number "Hello, World!"]
set line_main_callme_1 [gdb_get_line_number "callme (return_1"]

# Forward execute to the callme() function, so that we can
# execute backward from there.
mi_continue_to callme
mi_delete_breakpoints

proc test_controlled_execution_reverse {} {
    global mi_gdb_prompt
    global srcfile
    global hex

    global line_callee4_head line_callee4_body
    global line_callee3_head line_callee3_body line_callee3_close
    global line_callee2_head line_callee2_body line_callee2_close
    global line_callee1_head line_callee1_body line_callee1_close
    global line_main_head    line_main_body
    global line_main_hello   line_main_callme_1

    # Test exec-reverse-finish

    mi_execute_to "exec-finish --reverse" \
	"end-stepping-range" "main" "" \
	"basics.c" $line_main_callme_1 "" \
	"reverse finish from callme"

    # Test exec-reverse-next
    #   It takes two steps to get back to the previous line,
    #   as the first step moves us to the start of the current line,
    #   and the one after that moves back to the previous line.

    mi_execute_to "exec-next --reverse 2" \
 	"end-stepping-range" "main" "" \
 	"basics.c" $line_main_hello "" \
 	"reverse next to get over the call to do_nothing"

    # Test exec-reverse-step

    mi_execute_to "exec-step --reverse" \
 	"end-stepping-range" "callee1" \
	"\{name=\"intarg\",value=\"2\"\},\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\},\{name=\"fltarg\",value=\"3.5\"\}" \
 	"basics.c" $line_callee1_close "" \
 	"reverse step to callee1"

    mi_execute_to "exec-step --reverse" \
 	"end-stepping-range" "callee2" \
	"\{name=\"intarg\",value=\"2\"\},\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \
 	"basics.c" $line_callee2_close "" \
 	"reverse step to callee2"

    mi_execute_to "exec-step --reverse" \
 	"end-stepping-range" "callee3" \
	"\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \
 	"basics.c" $line_callee3_close "" \
 	"reverse step to callee3"

    mi_execute_to "exec-step --reverse" \
 	"end-stepping-range" "callee4" "" \
 	"basics.c" "\[0-9\]+" "" \
 	"reverse step to callee4"

    # Test exec-reverse-[step|next]-instruction

    mi_execute_to "exec-step-instruction --reverse" \
        "end-stepping-range" "callee4" "" \
        "basics.c" "\[0-9\]+" "" \
        "reverse-step-instruction at callee4"

    mi_execute_to "exec-next-instruction --reverse" \
        "end-stepping-range" "callee4" "" \
        "basics.c" "\[0-9\]+" "" \
        "reverse-next-instruction at callee4"

    # Test exec-reverse-continue

    mi_create_breakpoint "-t basics.c:$line_callee3_head" \
	3 del callee3 ".*basics.c" $line_callee3_head $hex \
	"insert temp breakpoint at basics.c:$line_callee3_head"

    mi_execute_to "exec-continue --reverse" \
        "breakpoint-hit" "callee3" \
	"\{name=\"strarg\",value=\"$hex \\\\\"A string argument\.\\\\\"\"\}" \
        "basics.c" "\[0-9\]+" \
	{ "" "disp=\"del\""} \
        "reverse-continue at callee3"

    mi_execute_to "exec-continue --reverse" \
        "" "main" "" \
        "basics.c" $line_main_body "" \
        "reverse-continue at main"
}

test_controlled_execution_reverse

mi_gdb_exit
return 0
