xref: /netbsd-src/external/gpl3/gdb/dist/gdb/testsuite/gdb.reverse/sigall-reverse.exp (revision a6f3f22f245acb8ee3bbf6871d7dce989204fa97)
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