1# Copyright 2008-2020 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file is part of the GDB testsuite. It tests 'finish' with 17# reverse debugging. 18 19if ![supports_reverse] { 20 return 21} 22 23standard_testfile 24 25if { [prepare_for_testing "failed to prepare" "$testfile" $srcfile] } { 26 return -1 27} 28 29runto main 30 31if [supports_process_record] { 32 # Activate process record/replay 33 gdb_test_no_output "record" "turn on process record" 34} 35 36# Test finish from void func 37 38set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"] 39gdb_test "break void_func" \ 40 "Breakpoint $decimal at .*$srcfile, line $breakloc\." \ 41 "set breakpoint on void_func" 42gdb_continue_to_breakpoint "void_func" ".*$srcfile:$breakloc.*" 43 44set test_msg "finish from void_func" 45gdb_test_multiple "finish" "$test_msg" { 46 -re " call to void_func .*$gdb_prompt $" { 47 send_gdb "step\n" 48 exp_continue 49 } 50 -re " void_checkpoint .*$gdb_prompt $" { 51 pass "$test_msg" 52 } 53} 54 55# Test finish from char func 56 57set breakloc [gdb_get_line_number "CHAR FUNC" "$srcfile"] 58gdb_test "break char_func" \ 59 "Breakpoint $decimal at .*$srcfile, line $breakloc\." \ 60 "set breakpoint on char_func" 61gdb_continue_to_breakpoint "char_func" ".*$srcfile:$breakloc.*" 62 63set test_msg "finish from char_func" 64gdb_test_multiple "finish" "$test_msg" { 65 -re " void_checkpoint .*$gdb_prompt $" { 66 send_gdb "step\n" 67 exp_continue 68 } 69 -re " char_checkpoint .*$gdb_prompt $" { 70 pass "$test_msg" 71 } 72} 73 74# Test finish from short func 75 76set breakloc [gdb_get_line_number "SHORT FUNC" "$srcfile"] 77gdb_test "break short_func" \ 78 "Breakpoint $decimal at .* line $breakloc\." \ 79 "set breakpoint on short_func" 80gdb_continue_to_breakpoint "short_func" ".*$srcfile:$breakloc.*" 81 82set test_msg "finish from short_func" 83gdb_test_multiple "finish" "$test_msg" { 84 -re " char_checkpoint .*$gdb_prompt $" { 85 send_gdb "step\n" 86 exp_continue 87 } 88 -re " short_checkpoint .*$gdb_prompt $" { 89 pass "$test_msg" 90 } 91} 92 93# Test finish from int func 94 95set breakloc [gdb_get_line_number "INT FUNC" "$srcfile"] 96gdb_test "break int_func" \ 97 "Breakpoint $decimal at .* line $breakloc\." \ 98 "set breakpoint on int_func" 99gdb_continue_to_breakpoint "int_func" ".*$srcfile:$breakloc.*" 100 101set test_msg "finish from int_func" 102gdb_test_multiple "finish" "$test_msg" { 103 -re " short_checkpoint .*$gdb_prompt $" { 104 send_gdb "step\n" 105 exp_continue 106 } 107 -re " int_checkpoint .*$gdb_prompt $" { 108 pass "$test_msg" 109 } 110} 111 112# Test finish from long func 113 114set breakloc [gdb_get_line_number "LONG FUNC" "$srcfile"] 115gdb_test "break long_func" \ 116 "Breakpoint $decimal at .* line $breakloc\." \ 117 "set breakpoint on long_func" 118gdb_continue_to_breakpoint "long_func" ".*$srcfile:$breakloc.*" 119 120set test_msg "finish from long_func" 121gdb_test_multiple "finish" "$test_msg" { 122 -re " int_checkpoint .*$gdb_prompt $" { 123 send_gdb "step\n" 124 exp_continue 125 } 126 -re " long_checkpoint .*$gdb_prompt $" { 127 pass "$test_msg" 128 } 129} 130 131# Test finish from long long func 132 133set breakloc [gdb_get_line_number "LONG LONG FUNC" "$srcfile"] 134gdb_test "break long_long_func" \ 135 "Breakpoint $decimal at .* line $breakloc\." \ 136 "set breakpoint on long_long_func" 137gdb_continue_to_breakpoint "long_long_func" ".*$srcfile:$breakloc.*" 138 139set test_msg "finish from long_long_func" 140gdb_test_multiple "finish" "$test_msg" { 141 -re " long_checkpoint .*$gdb_prompt $" { 142 send_gdb "step\n" 143 exp_continue 144 } 145 -re " long_long_checkpoint .*$gdb_prompt $" { 146 pass "$test_msg" 147 } 148} 149 150 151### 152### 153### 154 155# Now switch to reverse 156gdb_test_no_output "set exec-dir reverse" "set reverse execution" 157 158# Test reverse finish from long long func 159 160set breakloc [gdb_get_line_number "LONG LONG FUNC" "$srcfile"] 161gdb_continue_to_breakpoint "long_long_func backward" \ 162 ".*$srcfile:$breakloc.*" 163 164set test_msg "reverse finish from long_long_func" 165gdb_test_multiple "finish" "$test_msg" { 166 -re ".* long_checkpoint.*$gdb_prompt $" { 167 pass "$test_msg" 168 } 169} 170 171# Test reverse finish from long func 172 173set breakloc [gdb_get_line_number "LONG FUNC" "$srcfile"] 174gdb_continue_to_breakpoint "long_func backward" \ 175 ".*$srcfile:$breakloc.*" 176 177set test_msg "reverse finish from long_func" 178gdb_test_multiple "finish" "$test_msg" { 179 -re ".* int_checkpoint.*$gdb_prompt $" { 180 pass "$test_msg" 181 } 182} 183 184# Test reverse finish from int func 185 186set breakloc [gdb_get_line_number "INT FUNC" "$srcfile"] 187gdb_continue_to_breakpoint "int_func backward" \ 188 ".*$srcfile:$breakloc.*" 189 190set test_msg "reverse finish from int_func" 191gdb_test_multiple "finish" "$test_msg" { 192 -re ".* short_checkpoint.*$gdb_prompt $" { 193 pass "$test_msg" 194 } 195} 196 197# Test reverse finish from short func 198 199set breakloc [gdb_get_line_number "SHORT FUNC" "$srcfile"] 200gdb_continue_to_breakpoint "short_func backward" \ 201 ".*$srcfile:$breakloc.*" 202 203set test_msg "reverse finish from short_func" 204gdb_test_multiple "finish" "$test_msg" { 205 -re ".* char_checkpoint.*$gdb_prompt $" { 206 pass "$test_msg" 207 } 208} 209 210# Test reverse finish from char func 211 212set breakloc [gdb_get_line_number "CHAR FUNC" "$srcfile"] 213gdb_continue_to_breakpoint "char_func backward" \ 214 ".*$srcfile:$breakloc.*" 215 216set test_msg "reverse finish from char_func" 217gdb_test_multiple "finish" "$test_msg" { 218 -re ".* void_checkpoint.*$gdb_prompt $" { 219 pass "$test_msg" 220 } 221} 222 223# Test reverse finish from void func 224 225set breakloc [gdb_get_line_number "VOID FUNC" "$srcfile"] 226gdb_continue_to_breakpoint "void_func backward" \ 227 ".*$srcfile:$breakloc.*" 228 229set test_msg "reverse finish from void_func" 230gdb_test_multiple "finish" "$test_msg" { 231 -re ".* call to void_func.*$gdb_prompt $" { 232 pass "$test_msg" 233 } 234} 235