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

if [using_clang] { setup_xfail "clang/14580" *-*-* }
if [gdb_test "break $end_location" \
      "Breakpoint $decimal at .*/$srcfile, line $end_location\." \
      "BP at end of main"] {
    set end_location [expr $end_location - 1]
    gdb_test "break $end_location" \
        "Breakpoint $decimal at .*/$srcfile, line $end_location\." \
        "BP at end of main"
    gdb_test "continue" "Breakpoint .* return .*;.*" "run to end of main"
} else {
    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 "continue" ".*No more reverse-execution history\..*main .* at .*/$srcfile:$end_location.*" "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 "continue" ".*No more reverse-execution history\..*main .* at .*/$srcfile:$end_location.*" "end of record log"
