167468Snon# Copyright 2009-2020 Free Software Foundation, Inc. 267468Snon 367468Snon# This program is free software; you can redistribute it and/or modify 4139749Simp# it under the terms of the GNU General Public License as published by 567468Snon# the Free Software Foundation; either version 3 of the License, or 667468Snon# (at your option) any later version. 767468Snon# 867468Snon# This program is distributed in the hope that it will be useful, 967468Snon# but WITHOUT ANY WARRANTY; without even the implied warranty of 1067468Snon# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1167468Snon# GNU General Public License for more details. 1267468Snon# 1367468Snon# You should have received a copy of the GNU General Public License 1467468Snon# along with this program. If not, see <http://www.gnu.org/licenses/>. 1567468Snon 1667468Snonif [target_info exists gdb,nosignals] { 1767468Snon verbose "Skipping sigall-reverse.exp because of nosignals." 1867468Snon return 1967468Snon} 2067468Snon 2167468Snonif ![supports_reverse] { 2267468Snon return 2367468Snon} 2467468Snon 2567468Snon 2667468Snongdb_exit 2767468Snongdb_start 2867468Snongdb_reinitialize_dir $srcdir/$subdir 2967468Snon 3067468Snonstandard_testfile 3167468Snon 3267468Snonif {[build_executable $testfile.exp $testfile $srcfile debug] == -1} { 3367468Snon return -1 3467468Snon} 3567468Snon 3667468Snonproc test_one_sig {nextsig} { 3767468Snon global sig_supported 3867468Snon global gdb_prompt 39119418Sobrien global thissig 40119418Sobrien global record_instruction_kfail 41119418Sobrien 4267468Snon set this_sig_supported $sig_supported 43129764Simp gdb_test "handle SIG$thissig stop print" \ 44129764Simp "SIG$thissig\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 45129764Simp gdb_test "b handle_$thissig" "Breakpoint \[0-9\]+ .*" 46240172Sjhb gdb_test "b gen_$nextsig" "Breakpoint \[0-9\]+ .*" 4767468Snon 4867468Snon set need_another_continue 1 4967468Snon set missed_handler 0 50129764Simp if $this_sig_supported then { 51129764Simp if { $thissig == "IO" } { 52126928Speter setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 5367468Snon } 54240172Sjhb gdb_test_multiple "continue" "get signal $thissig" { 5567468Snon -wrap -re \ 56107362Snon "Program received signal SIG$thissig.*handle_$thissig.*" { 57107362Snon fail "$gdb_test_name (wrong location)" 5867468Snon } 5967468Snon -wrap -re "Program received signal SIG$thissig.*" { 6067468Snon pass $gdb_test_name 6167468Snon } 6267468Snon -wrap -re "Breakpoint.* handle_$thissig.*" { 6367468Snon xfail $gdb_test_name 6467848Snon set need_another_continue 0 6567468Snon } 6667468Snon -wrap -re \ 6767468Snon "Process record does not support instruction 0xfae64 at.*" { 68129764Simp kfail "gdb/25038" $gdb_test_name 69129764Simp set record_instruction_kfail 1 70240172Sjhb return 71240172Sjhb } 7267468Snon } 73240172Sjhb } 7467468Snon 75107362Snon if $need_another_continue then { 76107362Snon if { $thissig == "URG" } { 77107362Snon setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu" 78107362Snon } 79147580Simp # Either Lynx or GDB screws up on SIGPRIO 80147580Simp if { $thissig == "PRIO" } { 81147580Simp setup_xfail "*-*-*lynx*" 82147580Simp } 83147580Simp set testmsg "send signal $thissig" 84147580Simp gdb_test_multiple "continue" $testmsg { 85147580Simp -re "Breakpoint.*handle_$thissig.*$gdb_prompt $" { 86147580Simp pass $testmsg 87147580Simp } 88107362Snon -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 89147580Simp fail "missed breakpoint at handle_$thissig" 90147580Simp set missed_handler 1 91107362Snon } 92107362Snon } 93107362Snon } 9467468Snon 9567468Snon if { $missed_handler == "0" } then { 9667468Snon set testmsg "advance to $nextsig" 9767468Snon gdb_test_multiple "signal 0" $testmsg { 9867468Snon -re "Breakpoint.*gen_$nextsig.*kill.*$gdb_prompt $" { 9967468Snon pass $testmsg 10067468Snon set sig_supported 1 10167468Snon } 10267468Snon -re "Breakpoint.*gen_$nextsig.*handle.*$gdb_prompt $" { 10367468Snon pass $testmsg 10467468Snon set sig_supported 0 105240172Sjhb } 10667468Snon } 10767468Snon } 10867468Snon set thissig $nextsig 10967468Snon} 11067468Snon 11167468Snonproc test_one_sig_reverse {prevsig} { 11267468Snon global gdb_prompt 11367468Snon 11467468Snon gdb_test "reverse-continue" "Breakpoint .* handle_$prevsig.*" \ 11567468Snon "reverse to handler of $prevsig" 11667468Snon 11767468Snon set saw_signal 0 11873087Snon set testmsg "reverse to gen_$prevsig" 11973087Snon gdb_test_multiple "reverse-continue" $testmsg { 12073087Snon -re "Breakpoint.*handle_.*$gdb_prompt " { 12173087Snon pass "$testmsg (un-handled)" 12273087Snon } 12367468Snon -re "Program received signal SIG$prevsig.*$gdb_prompt " { 12467468Snon pass "reverse to signal event, $prevsig" 12567468Snon 12667468Snon set nested_testmsg "reverse signal $prevsig delivered" 12767468Snon gdb_test_multiple "frame" $nested_testmsg { 12867468Snon -re ".*handle_$prevsig.*$gdb_prompt " { 12967468Snon fail "$nested_testmsg (wrong location)" 13067468Snon } 13167468Snon -re ".*$gdb_prompt " { 13267468Snon pass $nested_testmsg 13367468Snon } 13467468Snon } 135240172Sjhb 13667468Snon set saw_signal 1 13767468Snon send_gdb "reverse-continue\n" 138240172Sjhb exp_continue 13973087Snon } 14067468Snon -re "Breakpoint.*kill.*$gdb_prompt " { 14167468Snon if { $saw_signal } then { 14267468Snon pass "$testmsg (handled)" 14367468Snon } else { 14467468Snon xfail "$testmsg (handled)" 14567468Snon } 14673087Snon } 14773087Snon -re "No more reverse-execution history.*kill.*$gdb_prompt " { 14873087Snon if { $saw_signal } then { 14973087Snon pass "$testmsg (handled)" 15073087Snon } else { 15167468Snon xfail "$testmsg (handled)" 15267468Snon } 15373087Snon } 15473087Snon } 15567468Snon} 15667468Snon 15767468Snongdb_load $binfile 15867468Snon 15967468Snonrunto gen_ABRT 16073087Snon 16173087Snonif [supports_process_record] { 16273087Snon # Activate process record/replay 16373087Snon gdb_test_no_output "record" "turn on process record" 16473087Snon} 16573087Snon 16673087Snon# The list of signals that the program generates, in the order they 16773087Snon# are generated. 16873087Snonset signals { 16973087Snon ABRT 17073087Snon HUP 17173087Snon QUIT 17273087Snon ILL 17373087Snon EMT 17467468Snon FPE 175127135Snjl BUS 176127135Snjl SEGV 17767468Snon SYS 17867468Snon PIPE 17967468Snon ALRM 18067468Snon URG 18167468Snon TSTP 18267468Snon CONT 18367468Snon CHLD 18467468Snon TTIN 18567468Snon TTOU 18667468Snon IO 18767468Snon XCPU 18867468Snon XFSZ 18967468Snon VTALRM 19067468Snon PROF 19167468Snon WINCH 19267468Snon LOST 193127135Snjl USR1 194127135Snjl USR2 19567468Snon PWR 19667468Snon POLL 19767468Snon WIND 19867468Snon PHONE 19967468Snon WAITING 20067468Snon LWP 20167468Snon DANGER 20267468Snon GRANT 203150396Simp RETRACT 204150396Simp MSG 205107362Snon SOUND 206107362Snon SAK 207121521Simp PRIO 208121521Simp 33 209107362Snon 34 210107362Snon 35 211107362Snon 36 212107362Snon 37 213113315Simp 38 214113315Simp 39 215107362Snon 40 216107362Snon 41 217107362Snon 42 218107362Snon 43 219107362Snon 44 220107362Snon 45 221107362Snon 46 222107362Snon 47 223107362Snon 48 224107362Snon 49 225107362Snon 50 226107362Snon 51 227107362Snon 52 228107362Snon 53 229107362Snon 54 230107362Snon 55 23167468Snon 56 232150396Simp 57 23367468Snon 58 23467468Snon 59 23567468Snon 60 23667468Snon 61 23767468Snon 62 23867468Snon 63 23967468Snon TERM 24067468Snon} 24167468Snon 24267468Snon# Make the first signal SIGABRT because it is always supported. 24367468Snonset sig_supported 1 24467468Snonset thissig "ABRT" 24567468Snon 24667468Snon# test signal handling 24767468Snonwith_test_prefix "sig-test-1" { 24873280Smarkm set record_instruction_kfail 0 249166901Spiso foreach sig [lrange $signals 1 end] { 25067468Snon test_one_sig $sig 25167468Snon if { $record_instruction_kfail } { 25267468Snon return -1 25367468Snon } 25467468Snon } 25567468Snon} 25667468Snon 25767468Snon# The last signal (SIGTERM) gets handled slightly differently because 25867468Snon# we are not setting up for another test. 25967468Snongdb_test "handle SIGTERM stop print" \ 26067468Snon "SIGTERM\[ \t\]*Yes\[ \t\]*Yes\[ \t\]*Yes.*" 26167468Snongdb_test "b handle_TERM" "Breakpoint \[0-9\]+ .*" 26267468Snongdb_test "continue" \ 263194023Savg "Continuing.*Program received signal SIGTERM.*" \ 264150396Simp "get signal TERM" 26567468Snongdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM" 26667468Snon 26767468Snonwith_timeout_factor 2 { 268194023Savg gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \ 269194023Savg "The next instruction is syscall exit_group.* program...y. or n. " \ 27067468Snon "yes" 27167468Snon} 27267468Snon 27367468Snonforeach sig [lreverse $signals] { 274150396Simp test_one_sig_reverse $sig 275150396Simp} 27667468Snon 27767468Snon# Make the first signal SIGABRT because it is always supported. 27867468Snonset sig_supported 1 27967468Snonset thissig "ABRT" 28067468Snon 28167468Snonwith_test_prefix "sig-test-2" { 28267468Snon foreach sig [lrange $signals 1 end] { 28367468Snon test_one_sig $sig 28467468Snon } 28567468Snon} 28667468Snon