1# Copyright 2000-2015 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 was written by Michael Snyder (msnyder@redhat.com) 17 18 19# re-use the program from the "return2" test. 20if { [prepare_for_testing finish.exp finish return2.c] } { 21 return -1 22} 23 24proc finish_1 { type } { 25 global gdb_prompt 26 27 gdb_test "break ${type}_func" "Breakpoint \[0123456789\].*" \ 28 "set break on ${type}_func" 29 gdb_test "continue" "Breakpoint.* ${type}_func.*" \ 30 "continue to ${type}_func" 31 gdb_test_multiple "finish" "finish from ${type}_func" { 32 -re ".*Value returned is .* = 49 '1'\r\n$gdb_prompt $" { 33 if { $type == "char" } { 34 pass "finish from char_func" 35 } else { 36 fail "finish from ${type}_func" 37 } 38 } 39 -re ".*Value returned is .* = \[0123456789\]* '1'\r\n$gdb_prompt $" { 40 if { $type == "char" } { 41 pass "finish from char_func (non-ASCII char set?)" 42 } else { 43 fail "finish from ${type}_func" 44 } 45 } 46 -re ".*Value returned is .* = 1\r\n$gdb_prompt $" { 47 pass "finish from ${type}_func" 48 } 49 } 50} 51 52proc finish_void { } { 53 global gdb_prompt 54 55 gdb_test "break void_func" "Breakpoint \[0123456789\].*" \ 56 "set break on void_func" 57 gdb_test "continue" "Breakpoint.* void_func.*" \ 58 "continue to void_func" 59 # Some architectures will have one or more instructions after the 60 # call instruction which still is part of the call sequence, so we 61 # must be prepared for a "finish" to show us the void_func call 62 # again as well as the statement after. 63 gdb_test_multiple "finish" "finish from void_func" { 64 -re ".*void_checkpoint.*$gdb_prompt $" { 65 pass "finish from void_func" 66 } 67 -re "0x\[0-9a-fA-F\]+ in main.*call to void_func.*$gdb_prompt $" { 68 pass "finish from void_func" 69 } 70 } 71} 72 73# A function that tests that the given ABBREV is a working abbreviation 74# of the "finish" command. 75 76proc finish_abbreviation { abbrev } { 77 78 if { ! [ runto "int_func" ] } then { 79 fail "running to int_func" 80 return -1 81 } 82 83 gdb_test "$abbrev" \ 84 "Value returned is .* = 1" \ 85 "Testing the \"$abbrev\" abbreviation for \"finish\"" 86} 87 88proc finish_tests { } { 89 global gdb_prompt 90 91 if { ! [ runto_main ] } then { 92 untested finish.exp 93 return -1 94 } 95 96 finish_void 97 finish_1 "char" 98 finish_1 "short" 99 finish_1 "int" 100 finish_1 "long" 101 finish_1 "long_long" 102 if ![target_info exists gdb,skip_float_tests] { 103 finish_1 "float" 104 finish_1 "double" 105 } 106 finish_abbreviation "fin" 107} 108 109set prev_timeout $timeout 110set timeout 30 111finish_tests 112set timeout $prev_timeout 113