# Copyright 2008-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/>.  */

# 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 ![supports_process_record] {
    return
}

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

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

runto main

if [supports_process_record] {
    # Activate process record/replay
    gdb_test_no_output "record" "Turn on process record"
}

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

gdb_test_no_output "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_no_output "set exec-dir forward" "set forward execution"
# gdb_continue_to_end "step-reverse.exp"

