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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

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

if { [prepare_for_testing $testfile.exp "$testfile" $srcfile] } {
    return -1
}

proc test_start_of_line { line_text test_msg } {
    global gdb_prompt
    global decimal
    global hex

    send_gdb "info line\n"
    gdb_expect {
	-re "Line $decimal of .* starts at address ($hex) .*$gdb_prompt $" {
	    set line_begin $expect_out(1,string)
	}
	default {
	    fail "Get line address in test_start_of_line"
	}
    }
    send_gdb "info reg pc\n"
    gdb_expect {
	-re ".*: ($hex)\r\n*$gdb_prompt $" {
	    set stop_pc $expect_out(1,string)
	}
	default {
	    fail"Get stop pc in test_start_of_line"
	}
    }
    gdb_test "print $line_begin == $stop_pc" \
	" = 1\[\r\n\]*" \
	"test_start_of_line, $test_msg"
}

runto main

# FIXME 'record' command should say something so we know it's working.
gdb_test "record" "" "start recording"

# 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 "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 $" {
	test_start_of_line "long_checkpoint" "$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 $" {
	test_start_of_line "int_checkpoint" "$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 $" {
	test_start_of_line "short_checkpoint" "$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 $" {
	test_start_of_line "char_checkpoint" "$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 $" {
	test_start_of_line "void_checkpoint" "$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 $" {
	test_start_of_line "call to void_func" "$test_msg"
    }
}

return 0
