# 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 'finish' with
# reverse debugging.

if ![supports_reverse] {
    return
}

standard_testfile finish-reverse.c
set precsave [standard_output_file finish.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"
}

# Run until end, then save execution log. 

set breakloc [gdb_get_line_number "end of main" "$srcfile"]
if [using_clang] { setup_xfail "clang/14580" *-*-* }
if [gdb_test "break $breakloc" \
      "Breakpoint $decimal at .*/$srcfile, line $breakloc\." \
      "BP at end of main"] {
    set breakloc [expr $breakloc - 1]
    gdb_test "break $breakloc" \
        "Breakpoint $decimal at .*/$srcfile, line $breakloc\." \
        "BP at end of main"
    gdb_test "continue" "Breakpoint .* return 0;.*" "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"

# Test finish from void func

set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"]
gdb_test "break void_func" \
    "Breakpoint $decimal at .*/$srcfile, line $breakloc\." \
    "set breakpoint on void_func"
gdb_continue_to_breakpoint "void_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from void_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " call to void_func .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " void_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test finish from char func

set breakloc [gdb_get_line_number "CHAR FUNC" "$srcfile"]
gdb_test "break char_func" \
    "Breakpoint $decimal at .*/$srcfile, line $breakloc\." \
    "set breakpoint on char_func"
gdb_continue_to_breakpoint "char_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from char_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " void_checkpoint .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " char_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test finish from short func

set breakloc [gdb_get_line_number "SHORT FUNC" "$srcfile"]
gdb_test "break short_func" \
    "Breakpoint $decimal at .* line $breakloc\." \
    "set breakpoint on short_func"
gdb_continue_to_breakpoint "short_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from short_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " char_checkpoint .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " short_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test finish from int func

set breakloc [gdb_get_line_number "INT FUNC" "$srcfile"]
gdb_test "break int_func" \
    "Breakpoint $decimal at .* line $breakloc\." \
    "set breakpoint on int_func"
gdb_continue_to_breakpoint "int_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from int_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " short_checkpoint .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " int_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test finish from long func

set breakloc [gdb_get_line_number "LONG FUNC" "$srcfile"]
gdb_test "break long_func" \
    "Breakpoint $decimal at .* line $breakloc\." \
    "set breakpoint on long_func"
gdb_continue_to_breakpoint "long_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from long_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " int_checkpoint .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " long_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test finish from long long func

set breakloc [gdb_get_line_number "LONG LONG FUNC" "$srcfile"]
gdb_test "break long_long_func" \
    "Breakpoint $decimal at .* line $breakloc\." \
    "set breakpoint on long_long_func"
gdb_continue_to_breakpoint "long_long_func" ".*/$srcfile:$breakloc.*"

set test_msg "finish from long_long_func"
gdb_test_multiple "finish" "$test_msg" {
    -re " long_checkpoint .*$gdb_prompt $" {
	send_gdb "step\n"
	exp_continue
    }
    -re " long_long_checkpoint .*$gdb_prompt $" {
	pass "$test_msg"
    }
}


###
###
###

# Now switch to reverse
gdb_test_no_output "set exec-dir reverse" "set reverse execution"

# Test reverse finish from long long func

set breakloc [gdb_get_line_number "LONG LONG FUNC" "$srcfile"]
gdb_continue_to_breakpoint "long_long_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from long_long_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* long_checkpoint.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test reverse finish from long func

set breakloc [gdb_get_line_number "LONG FUNC" "$srcfile"]
gdb_continue_to_breakpoint "long_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from long_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* int_checkpoint.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test reverse finish from int func

set breakloc [gdb_get_line_number "INT FUNC" "$srcfile"]
gdb_continue_to_breakpoint "int_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from int_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* short_checkpoint.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test reverse finish from short func

set breakloc [gdb_get_line_number "SHORT FUNC" "$srcfile"]
gdb_continue_to_breakpoint "short_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from short_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* char_checkpoint.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test reverse finish from char func

set breakloc [gdb_get_line_number "CHAR FUNC" "$srcfile"]
gdb_continue_to_breakpoint "char_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from char_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* void_checkpoint.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

# Test reverse finish from void func

set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"]
gdb_continue_to_breakpoint "void_func" ".*/$srcfile:$breakloc.*"

set test_msg "reverse finish from void_func"
gdb_test_multiple "finish" "$test_msg" {
    -re ".* call to void_func.*$gdb_prompt $" {
	pass "$test_msg"
    }
}
