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