#   Copyright 2008, 2009 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.

if ![target_info exists gdb,can_reverse] {
    return
}

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

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 [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.
}

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_test "break $end_location" \
    "Breakpoint $decimal at .* line $end_location\." \
    set breakpoint at end of main"

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

# FIXME 'set exec-dir' command should give some output so we can test.
gdb_test "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 "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"
    }
}
