# Copyright 2008, 2009, 2010 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.  It tests reverse stepping.
# Lots of code borrowed from "step-test.exp".

#
# Test step and next with a reloaded process record file.
#

# This test suitable only for process record-replay
if ![target_info exists gdb,use_precord] {
    return
}

set testfile "step-reverse"
set srcfile  ${testfile}.c

if { [prepare_for_testing $testfile.exp $testfile $srcfile] } {
    return -1
}

runto main

if [target_info exists gdb,use_precord] {
    # Activate process record/replay
    gdb_test "record" "" "Turn on process record"
    # FIXME: command ought to acknowledge, so we can test if it succeeded.
}

set end_of_main [gdb_get_line_number "end of main" ]
gdb_test "break $end_of_main" \
    "Breakpoint $decimal at .*/$srcfile, line $end_of_main\." \
    "BP at end of main"

gdb_test "continue" "Breakpoint .* end of main .*" "run to end of main"

gdb_test "record save step.precsave" \
    "Saved core file step.precsave with execution log\."  \
    "save process recfile"

gdb_test "kill" "" "Kill process, prepare to debug log file" \
    "Kill the program being debugged\\? \\(y or n\\) " "y"

gdb_test "record restore step.precsave" \
    "Program terminated with signal .*" \
    "reload core file"

# plain vanilla step/next (no count)

gdb_test "next" ".*NEXT TEST 1.*" "next test 1"
gdb_test "step" ".*STEP TEST 1.*" "step test 1"

# step/next with count

gdb_test "next 2" ".*NEXT TEST 2.*" "next test 2"
gdb_test "step 3" ".*STEP TEST 2.*" "step test 2"

# step over call

gdb_test "step" ".*NEXT OVER THIS CALL.*" "step up to call"
gdb_test "next" ".*STEP INTO THIS CALL.*" "next over call"

# step into call

gdb_test "step" ".*ARRIVED IN CALLEE.*" "step into call"

# finish out of call

set test_message "finish out of fn call"
gdb_test_multiple "finish" "$test_message" {
    -re "FINISH TEST.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "STEP INTO THIS CALL.*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
}

# stepi over flat code (no calls)

set test_message "simple stepi"
gdb_test_multiple "stepi" "$test_message" {
    -re "STEPI TEST.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "FINISH TEST.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "NEXTI TEST.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
}

# stepi into a function call

set test_message "stepi into function call"
gdb_test_multiple "stepi" "$test_message" {
    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "NEXTI TEST.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
    -re "ENTER CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "STEPI TEST.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
}

# stepi thru return of a function call

set test_message "stepi back from function call"
gdb_test_multiple "stepi" "$test_message" {
    -re "NEXTI TEST.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "STEPI TEST.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "ENTER CALLEE.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
}

###
###
###

# Set reverse execution direction
# FIXME: command needs to acknowledge, so we can test if it succeeded.

gdb_test "set exec-dir reverse" "" "set reverse execution"

# stepi backward thru return and into a function

set stepi_location  [gdb_get_line_number "ARRIVED IN CALLEE" "$srcfile"]
set test_message "reverse stepi thru function return"
gdb_test_multiple "stepi" "$test_message" {
    -re "NEXTI TEST.*$gdb_prompt $" {
	fail "$test_message (start statement)"
    }
    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "$hex\[ \t\]*$stepi_location.*ARRIVED IN CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "ENTER CALLEE.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
    -re "STEPI TEST.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
}

# stepi backward out of a function call

set stepi_location  [gdb_get_line_number "STEPI TEST" "$srcfile"]
set test_message "reverse stepi from a function call"
gdb_test_multiple "stepi" "$test_message" {
    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
	fail "$test_message (start statement)"
    }
    -re "ENTER CALLEE.*$gdb_prompt $" {
	send_gdb "stepi\n" 
	exp_continue
    }
    -re "${hex} in main .*:$stepi_location.*STEPI TEST.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "STEPI TEST.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "STEP INTO THIS CALL.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
}

# stepi backward over flat code (no calls)

set stepi_location  [gdb_get_line_number "FINISH TEST" "$srcfile"]
set test_message "simple reverse stepi"
gdb_test_multiple "stepi" "$test_message" {
    -re "STEPI TEST.*$gdb_prompt $" {
	fail "$test_message (start statement)"
    }
    -re "$hex\[ \t\]*$stepi_location.* FINISH TEST.*$gdb_prompt $" {
	send_gdb "stepi\n"
	exp_continue
    }
    -re "$stepi_location.* FINISH TEST.*$gdb_prompt $" {
	pass "$test_message"
    }
    -re "STEP INTO THIS CALL.*$gdb_prompt $" {
	fail "$test_message (too far)"
    }
}

# step backward into function (thru return)

set test_message "reverse step into fn call"
gdb_test_multiple "step" "$test_message" {
    -re "RETURN FROM CALLEE.*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re "ARRIVED IN CALLEE.*$gdb_prompt $" {
	pass "$test_message"
    }
}

# step backward out of called function (thru call)

gdb_test "step" ".*STEP INTO THIS CALL.*" "reverse step out of called fn"

# next backward over call

gdb_test "next" ".*NEXT OVER THIS CALL.*" "reverse next over call"

# step/next backward with count

gdb_test "step 3" ".*REVERSE STEP TEST 1.*" "reverse step test 1"
gdb_test "next 2" ".*REVERSE NEXT TEST 1.*" "reverse next test 1"

# step/next backward without count

gdb_test "step" ".*STEP TEST 1.*" "reverse step test 2"
gdb_test "next" ".*NEXT TEST 1.*" "reverse next test 2"



# Finish test by running forward to the end.
# FIXME return to this later...
# gdb_test "set exec-dir forward" "" "set forward execution"
# gdb_continue_to_end "step-reverse.exp"

