#   Copyright 2008, 2009, 2010, 2011 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 ![supports_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 [supports_process_record] {
    # Activate process record/replay
    gdb_test_no_output "record" "Turn on process record"
}

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.*"

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"
    }
}
