# 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 . # 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 return2-reverse.exp "$testfile" $srcfile] } { untested finish-reverse.exp return -1 } global hex global decimal 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