Import gdb-7.10.1
[dragonfly.git] / contrib / gdb-7 / gdb / common / signals.c
1 /* Target signal translation functions for GDB.
2    Copyright (C) 1990-2015 Free Software Foundation, Inc.
3    Contributed by Cygnus Support.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "common-defs.h"
21
22 #ifdef HAVE_SIGNAL_H
23 #include <signal.h>
24 #endif
25
26 #include "gdb_signals.h"
27
28 struct gdbarch;
29
30 /* Always use __SIGRTMIN if it's available.  SIGRTMIN is the lowest
31    _available_ realtime signal, not the lowest supported; glibc takes
32    several for its own use.  */
33
34 #ifndef REALTIME_LO
35 # if defined(__SIGRTMIN)
36 #  define REALTIME_LO __SIGRTMIN
37 #  define REALTIME_HI (__SIGRTMAX + 1)
38 # elif defined(SIGRTMIN)
39 #  define REALTIME_LO SIGRTMIN
40 #  define REALTIME_HI (SIGRTMAX + 1)
41 # endif
42 #endif
43
44 /* This table must match in order and size the signals in enum
45    gdb_signal.  */
46
47 static const struct {
48   const char *symbol;
49   const char *name;
50   const char *string;
51   } signals [] =
52 {
53 #define SET(symbol, constant, name, string) { #symbol, name, string },
54 #include "gdb/signals.def"
55 #undef SET
56 };
57
58 const char *
59 gdb_signal_to_symbol_string (enum gdb_signal sig)
60 {
61   gdb_assert ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST);
62
63   return signals[sig].symbol;
64 }
65
66 /* Return the string for a signal.  */
67 const char *
68 gdb_signal_to_string (enum gdb_signal sig)
69 {
70   if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST)
71     return signals[sig].string;
72   else
73     return signals[GDB_SIGNAL_UNKNOWN].string;
74 }
75
76 /* Return the name for a signal.  */
77 const char *
78 gdb_signal_to_name (enum gdb_signal sig)
79 {
80   if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST
81       && signals[sig].name != NULL)
82     return signals[sig].name;
83   else
84     /* I think the code which prints this will always print it along
85        with the string, so no need to be verbose (very old comment).  */
86     return "?";
87 }
88
89 /* Given a name, return its signal.  */
90 enum gdb_signal
91 gdb_signal_from_name (const char *name)
92 {
93   enum gdb_signal sig;
94
95   /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
96      for GDB_SIGNAL_SIGCHLD.  SIGIOT, on the other hand, is more
97      questionable; seems like by now people should call it SIGABRT
98      instead.  */
99
100   /* This ugly cast brought to you by the native VAX compiler.  */
101   for (sig = GDB_SIGNAL_HUP;
102        sig < GDB_SIGNAL_LAST;
103        sig = (enum gdb_signal) ((int) sig + 1))
104     if (signals[sig].name != NULL
105         && strcmp (name, signals[sig].name) == 0)
106       return sig;
107   return GDB_SIGNAL_UNKNOWN;
108 }
109 \f
110 /* The following functions are to help certain targets deal
111    with the signal/waitstatus stuff.  They could just as well be in
112    a file called native-utils.c or unixwaitstatus-utils.c or whatever.  */
113
114 /* Convert host signal to our signals.  */
115 enum gdb_signal
116 gdb_signal_from_host (int hostsig)
117 {
118   /* A switch statement would make sense but would require special
119      kludges to deal with the cases where more than one signal has the
120      same number.  Signals are ordered ANSI-standard signals first,
121      other signals second, with signals in each block ordered by their
122      numerical values on a typical POSIX platform.  */
123
124   if (hostsig == 0)
125     return GDB_SIGNAL_0;
126
127   /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
128      are ANSI-standard signals and are always available.  */
129   if (hostsig == SIGINT)
130     return GDB_SIGNAL_INT;
131   if (hostsig == SIGILL)
132     return GDB_SIGNAL_ILL;
133   if (hostsig == SIGABRT)
134     return GDB_SIGNAL_ABRT;
135   if (hostsig == SIGFPE)
136     return GDB_SIGNAL_FPE;
137   if (hostsig == SIGSEGV)
138     return GDB_SIGNAL_SEGV;
139   if (hostsig == SIGTERM)
140     return GDB_SIGNAL_TERM;
141
142   /* All other signals need preprocessor conditionals.  */
143 #if defined (SIGHUP)
144   if (hostsig == SIGHUP)
145     return GDB_SIGNAL_HUP;
146 #endif
147 #if defined (SIGQUIT)
148   if (hostsig == SIGQUIT)
149     return GDB_SIGNAL_QUIT;
150 #endif
151 #if defined (SIGTRAP)
152   if (hostsig == SIGTRAP)
153     return GDB_SIGNAL_TRAP;
154 #endif
155 #if defined (SIGEMT)
156   if (hostsig == SIGEMT)
157     return GDB_SIGNAL_EMT;
158 #endif
159 #if defined (SIGKILL)
160   if (hostsig == SIGKILL)
161     return GDB_SIGNAL_KILL;
162 #endif
163 #if defined (SIGBUS)
164   if (hostsig == SIGBUS)
165     return GDB_SIGNAL_BUS;
166 #endif
167 #if defined (SIGSYS)
168   if (hostsig == SIGSYS)
169     return GDB_SIGNAL_SYS;
170 #endif
171 #if defined (SIGPIPE)
172   if (hostsig == SIGPIPE)
173     return GDB_SIGNAL_PIPE;
174 #endif
175 #if defined (SIGALRM)
176   if (hostsig == SIGALRM)
177     return GDB_SIGNAL_ALRM;
178 #endif
179 #if defined (SIGUSR1)
180   if (hostsig == SIGUSR1)
181     return GDB_SIGNAL_USR1;
182 #endif
183 #if defined (SIGUSR2)
184   if (hostsig == SIGUSR2)
185     return GDB_SIGNAL_USR2;
186 #endif
187 #if defined (SIGCLD)
188   if (hostsig == SIGCLD)
189     return GDB_SIGNAL_CHLD;
190 #endif
191 #if defined (SIGCHLD)
192   if (hostsig == SIGCHLD)
193     return GDB_SIGNAL_CHLD;
194 #endif
195 #if defined (SIGPWR)
196   if (hostsig == SIGPWR)
197     return GDB_SIGNAL_PWR;
198 #endif
199 #if defined (SIGWINCH)
200   if (hostsig == SIGWINCH)
201     return GDB_SIGNAL_WINCH;
202 #endif
203 #if defined (SIGURG)
204   if (hostsig == SIGURG)
205     return GDB_SIGNAL_URG;
206 #endif
207 #if defined (SIGIO)
208   if (hostsig == SIGIO)
209     return GDB_SIGNAL_IO;
210 #endif
211 #if defined (SIGPOLL)
212   if (hostsig == SIGPOLL)
213     return GDB_SIGNAL_POLL;
214 #endif
215 #if defined (SIGSTOP)
216   if (hostsig == SIGSTOP)
217     return GDB_SIGNAL_STOP;
218 #endif
219 #if defined (SIGTSTP)
220   if (hostsig == SIGTSTP)
221     return GDB_SIGNAL_TSTP;
222 #endif
223 #if defined (SIGCONT)
224   if (hostsig == SIGCONT)
225     return GDB_SIGNAL_CONT;
226 #endif
227 #if defined (SIGTTIN)
228   if (hostsig == SIGTTIN)
229     return GDB_SIGNAL_TTIN;
230 #endif
231 #if defined (SIGTTOU)
232   if (hostsig == SIGTTOU)
233     return GDB_SIGNAL_TTOU;
234 #endif
235 #if defined (SIGVTALRM)
236   if (hostsig == SIGVTALRM)
237     return GDB_SIGNAL_VTALRM;
238 #endif
239 #if defined (SIGPROF)
240   if (hostsig == SIGPROF)
241     return GDB_SIGNAL_PROF;
242 #endif
243 #if defined (SIGXCPU)
244   if (hostsig == SIGXCPU)
245     return GDB_SIGNAL_XCPU;
246 #endif
247 #if defined (SIGXFSZ)
248   if (hostsig == SIGXFSZ)
249     return GDB_SIGNAL_XFSZ;
250 #endif
251 #if defined (SIGWIND)
252   if (hostsig == SIGWIND)
253     return GDB_SIGNAL_WIND;
254 #endif
255 #if defined (SIGPHONE)
256   if (hostsig == SIGPHONE)
257     return GDB_SIGNAL_PHONE;
258 #endif
259 #if defined (SIGLOST)
260   if (hostsig == SIGLOST)
261     return GDB_SIGNAL_LOST;
262 #endif
263 #if defined (SIGWAITING)
264   if (hostsig == SIGWAITING)
265     return GDB_SIGNAL_WAITING;
266 #endif
267 #if defined (SIGCANCEL)
268   if (hostsig == SIGCANCEL)
269     return GDB_SIGNAL_CANCEL;
270 #endif
271 #if defined (SIGLWP)
272   if (hostsig == SIGLWP)
273     return GDB_SIGNAL_LWP;
274 #endif
275 #if defined (SIGDANGER)
276   if (hostsig == SIGDANGER)
277     return GDB_SIGNAL_DANGER;
278 #endif
279 #if defined (SIGGRANT)
280   if (hostsig == SIGGRANT)
281     return GDB_SIGNAL_GRANT;
282 #endif
283 #if defined (SIGRETRACT)
284   if (hostsig == SIGRETRACT)
285     return GDB_SIGNAL_RETRACT;
286 #endif
287 #if defined (SIGMSG)
288   if (hostsig == SIGMSG)
289     return GDB_SIGNAL_MSG;
290 #endif
291 #if defined (SIGSOUND)
292   if (hostsig == SIGSOUND)
293     return GDB_SIGNAL_SOUND;
294 #endif
295 #if defined (SIGSAK)
296   if (hostsig == SIGSAK)
297     return GDB_SIGNAL_SAK;
298 #endif
299 #if defined (SIGPRIO)
300   if (hostsig == SIGPRIO)
301     return GDB_SIGNAL_PRIO;
302 #endif
303
304   /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
305 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
306   if (hostsig == _NSIG + EXC_BAD_ACCESS)
307     return GDB_EXC_BAD_ACCESS;
308 #endif
309 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
310   if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
311     return GDB_EXC_BAD_INSTRUCTION;
312 #endif
313 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
314   if (hostsig == _NSIG + EXC_ARITHMETIC)
315     return GDB_EXC_ARITHMETIC;
316 #endif
317 #if defined (EXC_EMULATION) && defined (_NSIG)
318   if (hostsig == _NSIG + EXC_EMULATION)
319     return GDB_EXC_EMULATION;
320 #endif
321 #if defined (EXC_SOFTWARE) && defined (_NSIG)
322   if (hostsig == _NSIG + EXC_SOFTWARE)
323     return GDB_EXC_SOFTWARE;
324 #endif
325 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
326   if (hostsig == _NSIG + EXC_BREAKPOINT)
327     return GDB_EXC_BREAKPOINT;
328 #endif
329
330 #if defined (SIGINFO)
331   if (hostsig == SIGINFO)
332     return GDB_SIGNAL_INFO;
333 #endif
334
335 #if defined (REALTIME_LO)
336   if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
337     {
338       /* This block of GDB_SIGNAL_REALTIME value is in order.  */
339       if (33 <= hostsig && hostsig <= 63)
340         return (enum gdb_signal)
341           (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33);
342       else if (hostsig == 32)
343         return GDB_SIGNAL_REALTIME_32;
344       else if (64 <= hostsig && hostsig <= 127)
345         return (enum gdb_signal)
346           (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64);
347       else
348         error (_("GDB bug: target.c (gdb_signal_from_host): "
349                "unrecognized real-time signal"));
350     }
351 #endif
352
353   return GDB_SIGNAL_UNKNOWN;
354 }
355
356 /* Convert a OURSIG (an enum gdb_signal) to the form used by the
357    target operating system (refered to as the ``host'') or zero if the
358    equivalent host signal is not available.  Set/clear OURSIG_OK
359    accordingly. */
360
361 static int
362 do_gdb_signal_to_host (enum gdb_signal oursig,
363                           int *oursig_ok)
364 {
365   int retsig;
366   /* Silence the 'not used' warning, for targets that
367      do not support signals.  */
368   (void) retsig;
369
370   /* Signals are ordered ANSI-standard signals first, other signals
371      second, with signals in each block ordered by their numerical
372      values on a typical POSIX platform.  */
373
374   *oursig_ok = 1;
375   switch (oursig)
376     {
377     case GDB_SIGNAL_0:
378       return 0;
379
380       /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
381          are ANSI-standard signals and are always available.  */
382     case GDB_SIGNAL_INT:
383       return SIGINT;
384     case GDB_SIGNAL_ILL:
385       return SIGILL;
386     case GDB_SIGNAL_ABRT:
387       return SIGABRT;
388     case GDB_SIGNAL_FPE:
389       return SIGFPE;
390     case GDB_SIGNAL_SEGV:
391       return SIGSEGV;
392     case GDB_SIGNAL_TERM:
393       return SIGTERM;
394
395       /* All other signals need preprocessor conditionals.  */
396 #if defined (SIGHUP)
397     case GDB_SIGNAL_HUP:
398       return SIGHUP;
399 #endif
400 #if defined (SIGQUIT)
401     case GDB_SIGNAL_QUIT:
402       return SIGQUIT;
403 #endif
404 #if defined (SIGTRAP)
405     case GDB_SIGNAL_TRAP:
406       return SIGTRAP;
407 #endif
408 #if defined (SIGEMT)
409     case GDB_SIGNAL_EMT:
410       return SIGEMT;
411 #endif
412 #if defined (SIGKILL)
413     case GDB_SIGNAL_KILL:
414       return SIGKILL;
415 #endif
416 #if defined (SIGBUS)
417     case GDB_SIGNAL_BUS:
418       return SIGBUS;
419 #endif
420 #if defined (SIGSYS)
421     case GDB_SIGNAL_SYS:
422       return SIGSYS;
423 #endif
424 #if defined (SIGPIPE)
425     case GDB_SIGNAL_PIPE:
426       return SIGPIPE;
427 #endif
428 #if defined (SIGALRM)
429     case GDB_SIGNAL_ALRM:
430       return SIGALRM;
431 #endif
432 #if defined (SIGUSR1)
433     case GDB_SIGNAL_USR1:
434       return SIGUSR1;
435 #endif
436 #if defined (SIGUSR2)
437     case GDB_SIGNAL_USR2:
438       return SIGUSR2;
439 #endif
440 #if defined (SIGCHLD) || defined (SIGCLD)
441     case GDB_SIGNAL_CHLD:
442 #if defined (SIGCHLD)
443       return SIGCHLD;
444 #else
445       return SIGCLD;
446 #endif
447 #endif /* SIGCLD or SIGCHLD */
448 #if defined (SIGPWR)
449     case GDB_SIGNAL_PWR:
450       return SIGPWR;
451 #endif
452 #if defined (SIGWINCH)
453     case GDB_SIGNAL_WINCH:
454       return SIGWINCH;
455 #endif
456 #if defined (SIGURG)
457     case GDB_SIGNAL_URG:
458       return SIGURG;
459 #endif
460 #if defined (SIGIO)
461     case GDB_SIGNAL_IO:
462       return SIGIO;
463 #endif
464 #if defined (SIGPOLL)
465     case GDB_SIGNAL_POLL:
466       return SIGPOLL;
467 #endif
468 #if defined (SIGSTOP)
469     case GDB_SIGNAL_STOP:
470       return SIGSTOP;
471 #endif
472 #if defined (SIGTSTP)
473     case GDB_SIGNAL_TSTP:
474       return SIGTSTP;
475 #endif
476 #if defined (SIGCONT)
477     case GDB_SIGNAL_CONT:
478       return SIGCONT;
479 #endif
480 #if defined (SIGTTIN)
481     case GDB_SIGNAL_TTIN:
482       return SIGTTIN;
483 #endif
484 #if defined (SIGTTOU)
485     case GDB_SIGNAL_TTOU:
486       return SIGTTOU;
487 #endif
488 #if defined (SIGVTALRM)
489     case GDB_SIGNAL_VTALRM:
490       return SIGVTALRM;
491 #endif
492 #if defined (SIGPROF)
493     case GDB_SIGNAL_PROF:
494       return SIGPROF;
495 #endif
496 #if defined (SIGXCPU)
497     case GDB_SIGNAL_XCPU:
498       return SIGXCPU;
499 #endif
500 #if defined (SIGXFSZ)
501     case GDB_SIGNAL_XFSZ:
502       return SIGXFSZ;
503 #endif
504 #if defined (SIGWIND)
505     case GDB_SIGNAL_WIND:
506       return SIGWIND;
507 #endif
508 #if defined (SIGPHONE)
509     case GDB_SIGNAL_PHONE:
510       return SIGPHONE;
511 #endif
512 #if defined (SIGLOST)
513     case GDB_SIGNAL_LOST:
514       return SIGLOST;
515 #endif
516 #if defined (SIGWAITING)
517     case GDB_SIGNAL_WAITING:
518       return SIGWAITING;
519 #endif
520 #if defined (SIGCANCEL)
521     case GDB_SIGNAL_CANCEL:
522       return SIGCANCEL;
523 #endif
524 #if defined (SIGLWP)
525     case GDB_SIGNAL_LWP:
526       return SIGLWP;
527 #endif
528 #if defined (SIGDANGER)
529     case GDB_SIGNAL_DANGER:
530       return SIGDANGER;
531 #endif
532 #if defined (SIGGRANT)
533     case GDB_SIGNAL_GRANT:
534       return SIGGRANT;
535 #endif
536 #if defined (SIGRETRACT)
537     case GDB_SIGNAL_RETRACT:
538       return SIGRETRACT;
539 #endif
540 #if defined (SIGMSG)
541     case GDB_SIGNAL_MSG:
542       return SIGMSG;
543 #endif
544 #if defined (SIGSOUND)
545     case GDB_SIGNAL_SOUND:
546       return SIGSOUND;
547 #endif
548 #if defined (SIGSAK)
549     case GDB_SIGNAL_SAK:
550       return SIGSAK;
551 #endif
552 #if defined (SIGPRIO)
553     case GDB_SIGNAL_PRIO:
554       return SIGPRIO;
555 #endif
556
557       /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
558 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
559     case GDB_EXC_BAD_ACCESS:
560       return _NSIG + EXC_BAD_ACCESS;
561 #endif
562 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
563     case GDB_EXC_BAD_INSTRUCTION:
564       return _NSIG + EXC_BAD_INSTRUCTION;
565 #endif
566 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
567     case GDB_EXC_ARITHMETIC:
568       return _NSIG + EXC_ARITHMETIC;
569 #endif
570 #if defined (EXC_EMULATION) && defined (_NSIG)
571     case GDB_EXC_EMULATION:
572       return _NSIG + EXC_EMULATION;
573 #endif
574 #if defined (EXC_SOFTWARE) && defined (_NSIG)
575     case GDB_EXC_SOFTWARE:
576       return _NSIG + EXC_SOFTWARE;
577 #endif
578 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
579     case GDB_EXC_BREAKPOINT:
580       return _NSIG + EXC_BREAKPOINT;
581 #endif
582
583 #if defined (SIGINFO)
584     case GDB_SIGNAL_INFO:
585       return SIGINFO;
586 #endif
587
588     default:
589 #if defined (REALTIME_LO)
590       retsig = 0;
591
592       if (oursig >= GDB_SIGNAL_REALTIME_33
593           && oursig <= GDB_SIGNAL_REALTIME_63)
594         {
595           /* This block of signals is continuous, and
596              GDB_SIGNAL_REALTIME_33 is 33 by definition.  */
597           retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33;
598         }
599       else if (oursig == GDB_SIGNAL_REALTIME_32)
600         {
601           /* GDB_SIGNAL_REALTIME_32 isn't contiguous with
602              GDB_SIGNAL_REALTIME_33.  It is 32 by definition.  */
603           retsig = 32;
604         }
605       else if (oursig >= GDB_SIGNAL_REALTIME_64
606           && oursig <= GDB_SIGNAL_REALTIME_127)
607         {
608           /* This block of signals is continuous, and
609              GDB_SIGNAL_REALTIME_64 is 64 by definition.  */
610           retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64;
611         }
612
613       if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
614         return retsig;
615 #endif
616
617       *oursig_ok = 0;
618       return 0;
619     }
620 }
621
622 int
623 gdb_signal_to_host_p (enum gdb_signal oursig)
624 {
625   int oursig_ok;
626   do_gdb_signal_to_host (oursig, &oursig_ok);
627   return oursig_ok;
628 }
629
630 int
631 gdb_signal_to_host (enum gdb_signal oursig)
632 {
633   int oursig_ok;
634   int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok);
635   if (!oursig_ok)
636     {
637       /* The user might be trying to do "signal SIGSAK" where this system
638          doesn't have SIGSAK.  */
639       warning (_("Signal %s does not exist on this system."),
640                gdb_signal_to_name (oursig));
641       return 0;
642     }
643   else
644     return targ_signo;
645 }