# 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 'until' and 
# 'advance' in reverse debugging.

if ![supports_reverse] {
    return
}

set testfile "until-reverse"
set srcfile ${testfile}.c
set srcfile1 ur1.c

if { [prepare_for_testing $testfile.exp $testfile {until-reverse.c ur1.c} ] } {
    return -1
}

set bp_location1  [gdb_get_line_number "set breakpoint 1 here"]
set bp_location7  [gdb_get_line_number "set breakpoint 7 here"]
set bp_location9  [gdb_get_line_number "set breakpoint 9 here" "$srcfile1"]
set bp_location19 [gdb_get_line_number "set breakpoint 19 here"]
set bp_location20 [gdb_get_line_number "set breakpoint 20 here"]
set bp_location21 [gdb_get_line_number "set breakpoint 21 here"]

runto main

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

# Verify that plain vanilla "until <location>" works.
#
gdb_test "until $bp_location1" \
    "main .* at .*:$bp_location1.*" \
    "until line number"

# Advance up to factorial, outer invocation
#
gdb_test "advance factorial" \
    "factorial .value=6..*$srcfile:$bp_location7.*" \
    "advance to factorial"

# At this point, 'until' should continue the inferior up to when all the
# inner invocations of factorial() are completed and we are back at this
# frame.
#
gdb_test "until $bp_location19" \
    "factorial .value=720.*${srcfile}:$bp_location19.*" \
    "until factorial, recursive function"

# Finish out to main scope
#
gdb_test "finish" \
    " in main .*$srcfile:$bp_location1.*" \
    "finish to main"

# Advance to a function called by main (marker2)
#
gdb_test "advance marker2" \
    "marker2 .a=43.*$srcfile1:$bp_location9.*" \
    "advance to marker2"

# Now issue an until with another function, not called by the current
# frame, as argument. This should not work, i.e. the program should
# stop at main, the caller, where we put the 'guard' breakpoint.
#
set test_msg "until func, not called by current frame"
gdb_test_multiple "until marker3" "$test_msg" {
    -re "main .*at .*${srcfile}:$bp_location20.*$gdb_prompt $" {
	pass "$test_msg"
    }
    -re "main .*at .*${srcfile}:$bp_location21.*$gdb_prompt $" {
	pass "$test_msg"
    }
}

###
###
###

# Set reverse execution direction

gdb_test_no_output "set exec-dir reverse" "set reverse execution"

#
# We should now be at main, after the return from marker2.
# "Advance" backward into marker2.
#

gdb_test "advance marker2" \
    "marker2 .a=43.*$srcfile1:$bp_location9.*" \
    "reverse-advance to marker2"

# Finish out to main scope (backward)

gdb_test "finish" \
    " in main .*$srcfile:$bp_location20.*" \
    "reverse-finish from marker2"

# Advance backward to last line of factorial (outer invocation)

gdb_test "advance $bp_location19" \
    "factorial .value=720.*${srcfile}:$bp_location19.*" \
    "reverse-advance to final return of factorial"

# Now do "until" across the recursive calls, 
# ending up in the same frame where we are now.

gdb_test "until $bp_location7" \
    "factorial .value=6..*$srcfile:$bp_location7.*" \
    "reverse-until to entry of factorial"
