1# Copyright 2009-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 16if [target_info exists gdb,nosignals] { 17 verbose "Skipping sigall-reverse.exp because of nosignals." 18 return 19} 20 21if ![supports_reverse] { 22 return 23} 24 25 26gdb_exit 27gdb_start 28gdb_reinitialize_dir $srcdir/$subdir 29 30standard_testfile 31 32if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} { 33 return -1 34} 35 36proc test_one_sig {nextsig} { 37 global sig_supported 38 global gdb_prompt 39 global thissig 40 41 set this_sig_supported $sig_supported 42 gdb_test "handle SIG$thissig stop print" \ 43 "SIG$thissig\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 44 gdb_test "b handle_$thissig" "Breakpoint \[0-9\]+ .*" 45 gdb_test "b gen_$nextsig" "Breakpoint \[0-9\]+ .*" 46 47 set need_another_continue 1 48 set missed_handler 0 49 if $this_sig_supported then { 50 if { $thissig == "IO" } { 51 setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 52 } 53 set testmsg "get signal $thissig" 54 gdb_test_multiple "continue" $testmsg { 55 -re "Program received signal SIG$thissig.*handle_$thissig.*$gdb_prompt $" { 56 fail "$testmsg (wrong location)" 57 } 58 -re "Program received signal SIG$thissig.*$gdb_prompt $" { 59 pass $testmsg 60 } 61 -re "Breakpoint.* handle_$thissig.*$gdb_prompt $" { 62 xfail $testmsg 63 set need_another_continue 0 64 } 65 } 66 } 67 68 if $need_another_continue then { 69 if { $thissig == "URG" } { 70 setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 71 } 72 # Either Lynx or GDB screws up on SIGPRIO 73 if { $thissig == "PRIO" } { 74 setup_xfail "*-*-*lynx*" 75 } 76 set testmsg "send signal $thissig" 77 gdb_test_multiple "continue" $testmsg { 78 -re "Breakpoint.*handle_$thissig.*$gdb_prompt $" { 79 pass $testmsg 80 } 81 -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 82 fail "missed breakpoint at handle_$thissig" 83 set missed_handler 1 84 } 85 } 86 } 87 88 if { $missed_handler == "0" } then { 89 set testmsg "advance to $nextsig" 90 gdb_test_multiple "signal 0" $testmsg { 91 -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 92 pass $testmsg 93 set sig_supported 1 94 } 95 -re "Breakpoint.*gen_$nextsig.*handle.*$gdb_prompt $" { 96 pass $testmsg 97 set sig_supported 0 98 } 99 } 100 } 101 set thissig $nextsig 102} 103 104proc test_one_sig_reverse {prevsig} { 105 global gdb_prompt 106 107 gdb_test "reverse-continue" "Breakpoint .* handle_$prevsig.*" \ 108 "reverse to handler of $prevsig" 109 110 set saw_signal 0 111 set testmsg "reverse to gen_$prevsig" 112 gdb_test_multiple "reverse-continue" $testmsg { 113 -re "Breakpoint.*handle_.*$gdb_prompt " { 114 pass "$testmsg (un-handled)" 115 } 116 -re "Program received signal SIG$prevsig.*$gdb_prompt " { 117 pass "reverse to signal event, $prevsig" 118 119 set nested_testmsg "reverse signal delivered" 120 gdb_test_multiple "frame" $nested_testmsg { 121 -re ".*handle_$prevsig.*$gdb_prompt " { 122 fail "$nested_testmsg (wrong location)" 123 } 124 -re ".*$gdb_prompt " { 125 pass $nested_testmsg 126 } 127 } 128 129 set saw_signal 1 130 send_gdb "reverse-continue\n" 131 exp_continue 132 } 133 -re "Breakpoint.*kill.*$gdb_prompt " { 134 if { $saw_signal } then { 135 pass "$testmsg (handled)" 136 } else { 137 xfail "$testmsg (handled)" 138 } 139 } 140 -re "No more reverse-execution history.*kill.*$gdb_prompt " { 141 if { $saw_signal } then { 142 pass "$testmsg (handled)" 143 } else { 144 xfail "$testmsg (handled)" 145 } 146 } 147 } 148} 149 150gdb_load $binfile 151 152runto gen_ABRT 153 154if [supports_process_record] { 155 # Activate process record/replay 156 gdb_test_no_output "record" "Turn on process record" 157} 158 159# The list of signals that the program generates, in the order they 160# are generated. 161set signals { 162 ABRT 163 HUP 164 QUIT 165 ILL 166 EMT 167 FPE 168 BUS 169 SEGV 170 SYS 171 PIPE 172 ALRM 173 URG 174 TSTP 175 CONT 176 CHLD 177 TTIN 178 TTOU 179 IO 180 XCPU 181 XFSZ 182 VTALRM 183 PROF 184 WINCH 185 LOST 186 USR1 187 USR2 188 PWR 189 POLL 190 WIND 191 PHONE 192 WAITING 193 LWP 194 DANGER 195 GRANT 196 RETRACT 197 MSG 198 SOUND 199 SAK 200 PRIO 201 33 202 34 203 35 204 36 205 37 206 38 207 39 208 40 209 41 210 42 211 43 212 44 213 45 214 46 215 47 216 48 217 49 218 50 219 51 220 52 221 53 222 54 223 55 224 56 225 57 226 58 227 59 228 60 229 61 230 62 231 63 232 TERM 233} 234 235# Make the first signal SIGABRT because it is always supported. 236set sig_supported 1 237set thissig "ABRT" 238 239# test signal handling 240foreach sig [lrange $signals 1 end] { 241 test_one_sig $sig 242} 243 244# The last signal (SIGTERM) gets handled slightly differently because 245# we are not setting up for another test. 246gdb_test "handle SIGTERM stop print" \ 247 "SIGTERM\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 248gdb_test "b handle_TERM" "Breakpoint \[0-9\]+ .*" 249gdb_test "continue" \ 250 "Continuing.*Program received signal SIGTERM.*" \ 251 "get signal TERM" 252gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" 253 254set savedtimeout $timeout 255if { [target_info exists gdb,timeout] 256 && $timeout < [target_info gdb,timeout] } { 257 set oldtimeout [target_info gdb,timeout] 258} else { 259 set oldtimeout $timeout 260} 261set timeout [expr $oldtimeout * 2] 262gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \ 263 "The next instruction is syscall exit_group.* program...y. or n. " \ 264 "yes" 265set timeout $savedtimeout 266 267foreach sig [lreverse $signals] { 268 test_one_sig_reverse $sig 269} 270 271# Make the first signal SIGABRT because it is always supported. 272set sig_supported 1 273set thissig "ABRT" 274 275foreach sig [lrange $signals 1 end] { 276 test_one_sig $sig 277} 278