#   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 stepping over
# consecutive instructions in a process record logfile.

# This test suitable only for process record-replay
if ![supports_process_record] {
    return
}

standard_testfile consecutive-reverse.c
set precsave [standard_output_file consecutive.precsave]

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_location  [gdb_get_line_number "end of main"  ]
gdb_test "break $end_location" \
    "Breakpoint $decimal at .*/$srcfile, line $end_location\." \
    "BP at end of main"

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

gdb_test "record save $precsave" \
    "Saved core file $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 $precsave" \
    "Program terminated with signal .*" \
    "reload precord save file"

gdb_breakpoint foo
gdb_test "continue" "Breakpoint $decimal, foo .*" \
	"continue to breakpoint in foo"

set foo1_addr 0
set foo2_addr 0
set stop_addr 0

gdb_test_multiple "x /2i \$pc" "get breakpoint address for foo" {
    global hex
    global foo1_addr
    global foo2_addr
    global gdb_prompt

    -re "=> ($hex).*\[\r\n\]+   ($hex).*$gdb_prompt $" {
	set foo1_addr $expect_out(1,string)
	set foo2_addr $expect_out(2,string)
	pass "get breakpoint address for foo"
    }
}

gdb_test "break \*$foo2_addr" "Breakpoint $decimal at $foo2_addr: file .*" \
	"set bp, 2nd instr"

set testmsg "stopped at bp, 2nd instr"
gdb_test_multiple "step" $testmsg {
    -re "Breakpoint $decimal, ($hex) in foo.*$gdb_prompt $" {
	set stop_addr $expect_out(1,string)
	if [eval expr "$foo2_addr == $stop_addr"] then {
	    pass "stopped at bp, 2nd instr"
	} else {
	    fail "stopped at bp, 2nd instr (wrong address)"
	}
    }
}

###
###
###

# Set reverse execution direction

gdb_test_no_output "set exec-dir reverse" "set reverse execution"

# Now step backward and hope to hit the first breakpoint.

set test_msg "stopped at bp in reverse, 1st instr"
gdb_test_multiple "step" "$test_msg" {
    -re "Breakpoint $decimal, ($hex) in foo.*$gdb_prompt $" {
	set stop_addr $expect_out(1,string)
	if [eval expr "$foo1_addr == $stop_addr"] then {
	    pass "$test_msg"
	} else {
	    fail "$test_msg (wrong address)"
	}
    }
    -re "Breakpoint $decimal, foo.*$gdb_prompt $" {
	gdb_test "print \$pc == $foo1_addr" \
	    "$decimal = 1" \
	    "$test_msg"
    }
}
