#   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 debugging
# with breakpoints in a process record logfile.

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

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

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

set foo_location  [gdb_get_line_number "break in foo" ]
set bar_location  [gdb_get_line_number "break in bar" ]
set main_location [gdb_get_line_number "break in main"]
set end_location  [gdb_get_line_number "end of main"  ]

runto main

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

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_test "break foo" \
    "Breakpoint $decimal at .* line $foo_location\." \
    "set breakpoint on foo"

gdb_test "break bar" \
    "Breakpoint $decimal at .* line $bar_location\." \
    "set breakpoint on bar"

gdb_continue_to_breakpoint "foo" ".*/$srcfile:$foo_location.*"
gdb_continue_to_breakpoint "bar" ".*/$srcfile:$bar_location.*"
gdb_test_multiple "continue" "go to end of main forward" {
    -re ".*Breakpoint $decimal,.*/$srcfile:$end_location.*$gdb_prompt $"  {
	pass "go to end of main forward"
    }
    -re "No more reverse-execution history.* end of main .*$gdb_prompt $" {
	pass "go to end of main forward"
    }
}

gdb_test_no_output "set exec-direction reverse" "set reverse"

gdb_continue_to_breakpoint "bar backward"  ".*/$srcfile:$bar_location.*"
gdb_continue_to_breakpoint "foo backward"  ".*/$srcfile:$foo_location.*"

gdb_test_multiple "continue" "main backward" {
    -re ".*Breakpoint $decimal,.*/$srcfile:$main_location.*$gdb_prompt $" {
	pass "main backward"
    }
    -re "No more reverse-execution history.* break in main .*$gdb_prompt $" {
	pass "main backward"
    }
}

gdb_test_no_output "set exec-direction forward" "set forward"

gdb_continue_to_breakpoint "foo" ".*/$srcfile:$foo_location.*"
gdb_continue_to_breakpoint "bar" ".*/$srcfile:$bar_location.*"

gdb_test_multiple "continue" "end of record log" {
    -re ".*Breakpoint $decimal,.*/$srcfile:$end_location.*$gdb_prompt $" {
	pass "end of record log"
    }
    -re "No more reverse-execution history.* end of main .*$gdb_prompt $" {
	pass "end of record log"
    }
}
