diff options
Diffstat (limited to 'gdb/testsuite/gdb.reverse/finish-reverse.exp')
-rw-r--r-- | gdb/testsuite/gdb.reverse/finish-reverse.exp | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.reverse/finish-reverse.exp b/gdb/testsuite/gdb.reverse/finish-reverse.exp new file mode 100644 index 0000000..69d5df2 --- /dev/null +++ b/gdb/testsuite/gdb.reverse/finish-reverse.exp @@ -0,0 +1,260 @@ +# Copyright 2008, 2009 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 ![target_info exists gdb,can_reverse] { + return +} + +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 + +if [target_info exists gdb,use_precord] { + # Activate process record/replay + gdb_test "record" "" "Turn on process record" + # FIXME: command ought to acknowledge, so we can test if it succeeded. +} + +# 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 |