--- a/gdb/common/gdb_signals.h +++ b/gdb/common/gdb_signals.h @@ -53,4 +53,6 @@ extern const char *target_signal_to_name (gdb_target_signal_t); /* Given a name (SIGHUP, etc.), return its signal. */ gdb_target_signal_t target_signal_from_name (const char *); +extern gdb_target_signal_t target_signal_from_number (int signo); + #endif /* COMMON_GDB_SIGNALS_H */ --- a/gdb/common/signals.c +++ b/gdb/common/signals.c @@ -51,34 +51,36 @@ struct gdbarch; /* This table must match in order and size the signals in gdb_target_signal_t. */ -static const struct { - const char *name; - const char *string; - } signals [] = +static const struct target_signal_o signals[] = { -#define SET(symbol, constant, name, string) { name, string }, +#define SET(symbol, constant, name, string) \ + { constant, name, string }, #include "gdb/signals.def" #undef SET }; +#define SET(symbol, constant, name, string) \ + const gdb_target_signal_t symbol = &signals[constant]; +#include "gdb/signals.def" +#undef SET /* Return the string for a signal. */ const char * target_signal_to_string (gdb_target_signal_t sig) { - if ((int) sig >= TARGET_SIGNAL_FIRST && (int) sig <= TARGET_SIGNAL_LAST) - return signals[sig].string; + if (sig >= TARGET_SIGNAL_FIRST && sig <= TARGET_SIGNAL_LAST) + return TARGET_SIGNAL_STRING (sig); else - return signals[TARGET_SIGNAL_UNKNOWN].string; + return TARGET_SIGNAL_STRING (TARGET_SIGNAL_UNKNOWN); } /* Return the name for a signal. */ const char * target_signal_to_name (gdb_target_signal_t sig) { - if ((int) sig >= TARGET_SIGNAL_FIRST && (int) sig <= TARGET_SIGNAL_LAST - && signals[sig].name != NULL) - return signals[sig].name; + if (sig >= TARGET_SIGNAL_FIRST && sig <= TARGET_SIGNAL_LAST + && TARGET_SIGNAL_NAME (sig) != NULL) + return TARGET_SIGNAL_NAME (sig); else /* I think the code which prints this will always print it along with the string, so no need to be verbose (very old comment). */ @@ -97,15 +99,24 @@ target_signal_from_name (const char *name) instead. */ /* This ugly cast brought to you by the native VAX compiler. */ - for (sig = TARGET_SIGNAL_HUP; - sig < TARGET_SIGNAL_LAST; - sig = (gdb_target_signal_t) ((int) sig + 1)) - if (signals[sig].name != NULL - && strcmp (name, signals[sig].name) == 0) + for (sig = TARGET_SIGNAL_HUP; sig < TARGET_SIGNAL_LAST; sig++) + if (TARGET_SIGNAL_NAME (sig) != NULL + && strcmp (name, TARGET_SIGNAL_NAME (sig)) == 0) return sig; return TARGET_SIGNAL_UNKNOWN; } - + +/* Return the gdb_target_signal_t for a gdb signal. */ + +gdb_target_signal_t +target_signal_from_number (int number) +{ + if (number < 0 || number > TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_LAST)) + return TARGET_SIGNAL_UNKNOWN; + else + return &signals[number]; +} + /* The following functions are to help certain targets deal with the signal/waitstatus stuff. They could just as well be in a file called native-utils.c or unixwaitstatus-utils.c or whatever. */ @@ -341,13 +352,13 @@ target_signal_from_host (int hostsig) { /* This block of TARGET_SIGNAL_REALTIME value is in order. */ if (33 <= hostsig && hostsig <= 63) - return (gdb_target_signal_t) - (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33); + return target_signal_from_number + (hostsig - 33 + TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_REALTIME_33)); else if (hostsig == 32) return TARGET_SIGNAL_REALTIME_32; else if (64 <= hostsig && hostsig <= 127) - return (gdb_target_signal_t) - (hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64); + return target_signal_from_number + (hostsig - 64 + TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_REALTIME_64)); else error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal"); } @@ -371,81 +382,81 @@ do_target_signal_to_host (gdb_target_signal_t oursig, (void) retsig; *oursig_ok = 1; - switch (oursig) + switch (TARGET_SIGNAL_NUMBER (oursig)) { - case TARGET_SIGNAL_0: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_0): return 0; #if defined (SIGHUP) - case TARGET_SIGNAL_HUP: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_HUP): return SIGHUP; #endif #if defined (SIGINT) - case TARGET_SIGNAL_INT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_INT): return SIGINT; #endif #if defined (SIGQUIT) - case TARGET_SIGNAL_QUIT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_QUIT): return SIGQUIT; #endif #if defined (SIGILL) - case TARGET_SIGNAL_ILL: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_ILL): return SIGILL; #endif #if defined (SIGTRAP) - case TARGET_SIGNAL_TRAP: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TRAP): return SIGTRAP; #endif #if defined (SIGABRT) - case TARGET_SIGNAL_ABRT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_ABRT): return SIGABRT; #endif #if defined (SIGEMT) - case TARGET_SIGNAL_EMT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_EMT): return SIGEMT; #endif #if defined (SIGFPE) - case TARGET_SIGNAL_FPE: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_FPE): return SIGFPE; #endif #if defined (SIGKILL) - case TARGET_SIGNAL_KILL: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_KILL): return SIGKILL; #endif #if defined (SIGBUS) - case TARGET_SIGNAL_BUS: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_BUS): return SIGBUS; #endif #if defined (SIGSEGV) - case TARGET_SIGNAL_SEGV: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_SEGV): return SIGSEGV; #endif #if defined (SIGSYS) - case TARGET_SIGNAL_SYS: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_SYS): return SIGSYS; #endif #if defined (SIGPIPE) - case TARGET_SIGNAL_PIPE: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_PIPE): return SIGPIPE; #endif #if defined (SIGALRM) - case TARGET_SIGNAL_ALRM: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_ALRM): return SIGALRM; #endif #if defined (SIGTERM) - case TARGET_SIGNAL_TERM: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TERM): return SIGTERM; #endif #if defined (SIGUSR1) - case TARGET_SIGNAL_USR1: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_USR1): return SIGUSR1; #endif #if defined (SIGUSR2) - case TARGET_SIGNAL_USR2: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_USR2): return SIGUSR2; #endif #if defined (SIGCHLD) || defined (SIGCLD) - case TARGET_SIGNAL_CHLD: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_CHLD): #if defined (SIGCHLD) return SIGCHLD; #else @@ -453,111 +464,111 @@ do_target_signal_to_host (gdb_target_signal_t oursig, #endif #endif /* SIGCLD or SIGCHLD */ #if defined (SIGPWR) - case TARGET_SIGNAL_PWR: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_PWR): return SIGPWR; #endif #if defined (SIGWINCH) - case TARGET_SIGNAL_WINCH: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_WINCH): return SIGWINCH; #endif #if defined (SIGURG) - case TARGET_SIGNAL_URG: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_URG): return SIGURG; #endif #if defined (SIGIO) - case TARGET_SIGNAL_IO: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_IO): return SIGIO; #endif #if defined (SIGPOLL) - case TARGET_SIGNAL_POLL: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_POLL): return SIGPOLL; #endif #if defined (SIGSTOP) - case TARGET_SIGNAL_STOP: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_STOP): return SIGSTOP; #endif #if defined (SIGTSTP) - case TARGET_SIGNAL_TSTP: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TSTP): return SIGTSTP; #endif #if defined (SIGCONT) - case TARGET_SIGNAL_CONT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_CONT): return SIGCONT; #endif #if defined (SIGTTIN) - case TARGET_SIGNAL_TTIN: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TTIN): return SIGTTIN; #endif #if defined (SIGTTOU) - case TARGET_SIGNAL_TTOU: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TTOU): return SIGTTOU; #endif #if defined (SIGVTALRM) - case TARGET_SIGNAL_VTALRM: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_VTALRM): return SIGVTALRM; #endif #if defined (SIGPROF) - case TARGET_SIGNAL_PROF: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_PROF): return SIGPROF; #endif #if defined (SIGXCPU) - case TARGET_SIGNAL_XCPU: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_XCPU): return SIGXCPU; #endif #if defined (SIGXFSZ) - case TARGET_SIGNAL_XFSZ: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_XFSZ): return SIGXFSZ; #endif #if defined (SIGWIND) - case TARGET_SIGNAL_WIND: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_WIND): return SIGWIND; #endif #if defined (SIGPHONE) - case TARGET_SIGNAL_PHONE: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_PHONE): return SIGPHONE; #endif #if defined (SIGLOST) - case TARGET_SIGNAL_LOST: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_LOST): return SIGLOST; #endif #if defined (SIGWAITING) - case TARGET_SIGNAL_WAITING: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_WAITING): return SIGWAITING; #endif #if defined (SIGCANCEL) - case TARGET_SIGNAL_CANCEL: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_CANCEL): return SIGCANCEL; #endif #if defined (SIGLWP) - case TARGET_SIGNAL_LWP: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_LWP): return SIGLWP; #endif #if defined (SIGDANGER) - case TARGET_SIGNAL_DANGER: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_DANGER): return SIGDANGER; #endif #if defined (SIGGRANT) - case TARGET_SIGNAL_GRANT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_GRANT): return SIGGRANT; #endif #if defined (SIGRETRACT) - case TARGET_SIGNAL_RETRACT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_RETRACT): return SIGRETRACT; #endif #if defined (SIGMSG) - case TARGET_SIGNAL_MSG: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_MSG): return SIGMSG; #endif #if defined (SIGSOUND) - case TARGET_SIGNAL_SOUND: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_SOUND): return SIGSOUND; #endif #if defined (SIGSAK) - case TARGET_SIGNAL_SAK: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_SAK): return SIGSAK; #endif #if defined (SIGPRIO) - case TARGET_SIGNAL_PRIO: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_PRIO): return SIGPRIO; #endif @@ -588,7 +599,7 @@ do_target_signal_to_host (gdb_target_signal_t oursig, #endif #if defined (SIGINFO) - case TARGET_SIGNAL_INFO: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_INFO): return SIGINFO; #endif @@ -601,7 +612,8 @@ do_target_signal_to_host (gdb_target_signal_t oursig, { /* This block of signals is continuous, and TARGET_SIGNAL_REALTIME_33 is 33 by definition. */ - retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33; + retsig = (TARGET_SIGNAL_NUMBER (oursig) + - TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_REALTIME_33) + 33); } else if (oursig == TARGET_SIGNAL_REALTIME_32) { @@ -614,7 +626,8 @@ do_target_signal_to_host (gdb_target_signal_t oursig, { /* This block of signals is continuous, and TARGET_SIGNAL_REALTIME_64 is 64 by definition. */ - retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64; + retsig = (TARGET_SIGNAL_NUMBER (oursig) + - TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_REALTIME_64) + 64); } if (retsig >= REALTIME_LO && retsig < REALTIME_HI) @@ -665,7 +678,7 @@ gdb_target_signal_t target_signal_from_command (int num) { if (num >= 1 && num <= 15) - return (gdb_target_signal_t) num; + return target_signal_from_number (num); error ("Only signals 1-15 are valid as numeric signals.\n\ Use \"info signals\" for a list of symbolic signals."); } @@ -675,8 +688,17 @@ extern initialize_file_ftype _initialize_signals; /* -Wmissing-prototype */ void _initialize_signals (void) { - if (strcmp (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC") != 0) - internal_error (__FILE__, __LINE__, "failed internal consistency check"); + gdb_target_signal_t sig; + + for (sig = TARGET_SIGNAL_0; sig <= TARGET_SIGNAL_LAST; sig++) + if (sig - TARGET_SIGNAL_0 != TARGET_SIGNAL_NUMBER (sig)) + internal_error (__FILE__, __LINE__, "failed internal consistency check " + "(signals continuity)"); + + if (strcmp (TARGET_SIGNAL_STRING (TARGET_SIGNAL_LAST), + "TARGET_SIGNAL_MAGIC") != 0) + internal_error (__FILE__, __LINE__, "failed internal consistency check" + "(last signal magic)"); } int --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -2266,7 +2266,7 @@ Check if we're already there.\n", || WSTOPSIG (w) == __SIGRTMIN + 1)) || #endif - (pass_signals[target_signal_from_host (WSTOPSIG (w))] + (pass_signals[TARGET_SIGNAL_NUMBER (target_signal_from_host (WSTOPSIG (w)))] && !(WSTOPSIG (w) == SIGSTOP && current_inferior->last_resume_kind == resume_stop)))) { @@ -2421,7 +2421,7 @@ Check if we're already there.\n", fprintf (stderr, "linux_wait ret = %s, %d, %d\n", target_pid_to_str (ptid_of (event_child)), ourstatus->kind, - ourstatus->value.sig); + TARGET_SIGNAL_NUMBER (ourstatus->value.sig)); return ptid_of (event_child); } --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -1240,7 +1240,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, const char **regp; struct regcache *regcache; - sprintf (buf, "T%02x", status->value.sig); + sprintf (buf, "T%02x", TARGET_SIGNAL_NUMBER (status->value.sig)); buf += strlen (buf); regp = gdbserver_expedite_regs; @@ -1339,9 +1339,10 @@ prepare_resume_reply (char *buf, ptid_t ptid, case TARGET_WAITKIND_SIGNALLED: if (multi_process) sprintf (buf, "X%x;process:%x", - status->value.sig, ptid_get_pid (ptid)); + TARGET_SIGNAL_NUMBER (status->value.sig), + ptid_get_pid (ptid)); else - sprintf (buf, "X%02x", status->value.sig); + sprintf (buf, "X%02x", TARGET_SIGNAL_NUMBER (status->value.sig)); break; default: error ("unhandled waitkind"); --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -51,7 +51,7 @@ int debug_threads; /* Enable debugging of h/w breakpoint/watchpoint support. */ int debug_hw_points; -int pass_signals[TARGET_SIGNAL_LAST]; +int pass_signals[TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_LAST)]; jmp_buf toplevel; @@ -398,7 +398,7 @@ handle_general_set (char *own_buf) { if (strncmp ("QPassSignals:", own_buf, strlen ("QPassSignals:")) == 0) { - int numsigs = (int) TARGET_SIGNAL_LAST, i; + int numsigs = TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_LAST), i; const char *p = own_buf + strlen ("QPassSignals:"); CORE_ADDR cursig; @@ -1747,12 +1747,15 @@ handle_v_cont (char *own_buf) if (p[0] == 'S' || p[0] == 'C') { - int sig; - sig = strtol (p + 1, &q, 16); + int signo; + gdb_target_signal_t sig; + + signo = strtol (p + 1, &q, 16); if (p == q) goto err; p = q; + sig = target_signal_from_number (signo); if (!target_signal_to_host_p (sig)) goto err; resume_info[i].sig = target_signal_to_host (sig); @@ -2959,8 +2962,8 @@ process_serial_event (void) case 'C': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); - if (target_signal_to_host_p (sig)) - signal = target_signal_to_host (sig); + if (target_signal_to_host_p (target_signal_from_number (sig))) + signal = target_signal_to_host (target_signal_from_number (sig)); else signal = 0; myresume (own_buf, 0, signal); @@ -2968,8 +2971,8 @@ process_serial_event (void) case 'S': require_running (own_buf); convert_ascii_to_int (own_buf + 1, &sig, 1); - if (target_signal_to_host_p (sig)) - signal = target_signal_to_host (sig); + if (target_signal_to_host_p (target_signal_from_number (sig))) + signal = target_signal_to_host (target_signal_from_number (sig)); else signal = 0; myresume (own_buf, 1, signal); --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -240,17 +240,17 @@ extern void start_remote (int from_tty); extern void normal_stop (void); -extern int signal_stop_state (int); +extern int signal_stop_state (gdb_target_signal_t sig); -extern int signal_print_state (int); +extern int signal_print_state (gdb_target_signal_t sig); -extern int signal_pass_state (int); +extern int signal_pass_state (gdb_target_signal_t sig); -extern int signal_stop_update (int, int); +extern int signal_stop_update (gdb_target_signal_t sig, int state); -extern int signal_print_update (int, int); +extern int signal_print_update (gdb_target_signal_t sig, int state); -extern int signal_pass_update (int, int); +extern int signal_pass_update (gdb_target_signal_t sig, int state); extern void get_last_target_status(ptid_t *ptid, struct target_waitstatus *status); --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1583,7 +1583,7 @@ resume (int step, gdb_target_signal_t sig) fprintf_unfiltered (gdb_stdlog, "infrun: resume (step=%d, signal=%d), " "trap_expected=%d\n", - step, sig, tp->trap_expected); + step, TARGET_SIGNAL_NUMBER (sig), tp->trap_expected); /* Normally, by the time we reach `resume', the breakpoints are either removed or inserted, as appropriate. The exception is if we're sitting @@ -1963,7 +1963,8 @@ proceed (CORE_ADDR addr, gdb_target_signal_t siggnal, int step) if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: proceed (addr=%s, signal=%d, step=%d)\n", - paddress (gdbarch, addr), siggnal, step); + paddress (gdbarch, addr), + TARGET_SIGNAL_NUMBER (siggnal), step); /* We're handling a live event, so make sure we're doing live debugging. If we're looking at traceframes while the target is @@ -2047,7 +2048,7 @@ proceed (CORE_ADDR addr, gdb_target_signal_t siggnal, int step) tp->stop_signal = siggnal; /* If this signal should not be seen by program, give it zero. Used for debugging signals. */ - else if (!signal_program[tp->stop_signal]) + else if (! signal_pass_state (tp->stop_signal)) tp->stop_signal = TARGET_SIGNAL_0; annotate_starting (); @@ -3970,11 +3971,11 @@ process_event_stop_test: if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: random signal %d\n", - ecs->event_thread->stop_signal); + TARGET_SIGNAL_NUMBER (ecs->event_thread->stop_signal)); stopped_by_random_signal = 1; - if (signal_print[ecs->event_thread->stop_signal]) + if (signal_print_state (ecs->event_thread->stop_signal)) { printed = 1; target_terminal_ours_for_output (); @@ -3997,7 +3998,7 @@ process_event_stop_test: target_terminal_inferior (); /* Clear the signal if it should not be passed. */ - if (signal_program[ecs->event_thread->stop_signal] == 0) + if (signal_pass_state (ecs->event_thread->stop_signal) == 0) ecs->event_thread->stop_signal = TARGET_SIGNAL_0; if (ecs->event_thread->prev_pc == stop_pc @@ -5184,7 +5185,7 @@ keep_going (struct execution_control_state *ecs) equivalent of a SIGNAL_TRAP to the program being debugged. */ if (ecs->event_thread->stop_signal == TARGET_SIGNAL_TRAP - && !signal_program[ecs->event_thread->stop_signal]) + && ! signal_pass_state (ecs->event_thread->stop_signal)) ecs->event_thread->stop_signal = TARGET_SIGNAL_0; discard_cleanups (old_cleanups); @@ -5594,47 +5595,47 @@ hook_stop_stub (void *cmd) } int -signal_stop_state (int signo) +signal_stop_state (gdb_target_signal_t sig) { - return signal_stop[signo]; + return signal_stop[TARGET_SIGNAL_NUMBER (sig)]; } int -signal_print_state (int signo) +signal_print_state (gdb_target_signal_t sig) { - return signal_print[signo]; + return signal_print[TARGET_SIGNAL_NUMBER (sig)]; } int -signal_pass_state (int signo) +signal_pass_state (gdb_target_signal_t sig) { - return signal_program[signo]; + return signal_program[TARGET_SIGNAL_NUMBER (sig)]; } int -signal_stop_update (int signo, int state) +signal_stop_update (gdb_target_signal_t sig, int state) { - int ret = signal_stop[signo]; + int ret = signal_stop[TARGET_SIGNAL_NUMBER (sig)]; - signal_stop[signo] = state; + signal_stop[TARGET_SIGNAL_NUMBER (sig)] = state; return ret; } int -signal_print_update (int signo, int state) +signal_print_update (gdb_target_signal_t sig, int state) { - int ret = signal_print[signo]; + int ret = signal_print[TARGET_SIGNAL_NUMBER (sig)]; - signal_print[signo] = state; + signal_print[TARGET_SIGNAL_NUMBER (sig)] = state; return ret; } int -signal_pass_update (int signo, int state) +signal_pass_update (gdb_target_signal_t sig, int state) { - int ret = signal_program[signo]; + int ret = signal_program[TARGET_SIGNAL_NUMBER (sig)]; - signal_program[signo] = state; + signal_program[TARGET_SIGNAL_NUMBER (sig)] = state; return ret; } @@ -5656,9 +5657,9 @@ sig_print_info (gdb_target_signal_t oursig) printf_filtered ("%s", name); printf_filtered ("%*.*s ", name_padding, name_padding, " "); - printf_filtered ("%s\t", signal_stop[oursig] ? "Yes" : "No"); - printf_filtered ("%s\t", signal_print[oursig] ? "Yes" : "No"); - printf_filtered ("%s\t\t", signal_program[oursig] ? "Yes" : "No"); + printf_filtered ("%s\t", signal_stop_state (oursig) ? "Yes" : "No"); + printf_filtered ("%s\t", signal_print_state (oursig) ? "Yes" : "No"); + printf_filtered ("%s\t\t", signal_pass_state (oursig) ? "Yes" : "No"); printf_filtered ("%s\n", target_signal_to_string (oursig)); } @@ -5683,7 +5684,7 @@ handle_command (char *args, int from_tty) /* Allocate and zero an array of flags for which signals to handle. */ - nsigs = (int) TARGET_SIGNAL_LAST; + nsigs = TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_LAST); sigs = (unsigned char *) alloca (nsigs); memset (sigs, 0, nsigs); @@ -5756,12 +5757,13 @@ handle_command (char *args, int from_tty) using symbolic names anyway, and the common ones like SIGHUP, SIGINT, SIGALRM, etc. will work right anyway. */ - sigfirst = siglast = (int) - target_signal_from_command (atoi (*argv)); + gdb_target_signal_t sig = target_signal_from_command (atoi (*argv)); + + sigfirst = siglast = TARGET_SIGNAL_NUMBER (sig); if ((*argv)[digits] == '-') { - siglast = (int) - target_signal_from_command (atoi ((*argv) + digits + 1)); + sig = target_signal_from_command (atoi ((*argv) + digits + 1)); + siglast = TARGET_SIGNAL_NUMBER (sig); } if (sigfirst > siglast) { @@ -5776,7 +5778,7 @@ handle_command (char *args, int from_tty) oursig = target_signal_from_name (*argv); if (oursig != TARGET_SIGNAL_UNKNOWN) { - sigfirst = siglast = (int) oursig; + sigfirst = siglast = TARGET_SIGNAL_NUMBER (oursig); } else { @@ -5790,15 +5792,15 @@ handle_command (char *args, int from_tty) for (signum = sigfirst; signum >= 0 && signum <= siglast; signum++) { - switch ((gdb_target_signal_t) signum) + switch (signum) { - case TARGET_SIGNAL_TRAP: - case TARGET_SIGNAL_INT: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_TRAP): + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_INT): if (!allsigs && !sigs[signum]) { if (query (_("%s is used by the debugger.\n\ Are you sure you want to change it? "), - target_signal_to_name ((gdb_target_signal_t) signum))) + target_signal_to_name (target_signal_from_number (signum)))) { sigs[signum] = 1; } @@ -5809,9 +5811,9 @@ Are you sure you want to change it? "), } } break; - case TARGET_SIGNAL_0: - case TARGET_SIGNAL_DEFAULT: - case TARGET_SIGNAL_UNKNOWN: + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_0): + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_DEFAULT): + case TARGET_SIGNAL_NUMBER_CONST (TARGET_SIGNAL_UNKNOWN): /* Make sure that "all" doesn't print these. */ break; default: @@ -5834,7 +5836,7 @@ Are you sure you want to change it? "), sig_print_header (); for (; signum < nsigs; signum++) if (sigs[signum]) - sig_print_info (signum); + sig_print_info (target_signal_from_number (signum)); } break; @@ -5876,21 +5878,21 @@ xdb_handle_command (char *args, int from_tty) { if (strcmp (argv[1], "s") == 0) { - if (!signal_stop[oursig]) + if (! signal_stop_state (oursig)) sprintf (argBuf, "%s %s", argv[0], "stop"); else sprintf (argBuf, "%s %s", argv[0], "nostop"); } else if (strcmp (argv[1], "i") == 0) { - if (!signal_program[oursig]) + if (! signal_pass_state (oursig)) sprintf (argBuf, "%s %s", argv[0], "pass"); else sprintf (argBuf, "%s %s", argv[0], "nopass"); } else if (strcmp (argv[1], "r") == 0) { - if (!signal_print[oursig]) + if (! signal_print_state (oursig)) sprintf (argBuf, "%s %s", argv[0], "print"); else sprintf (argBuf, "%s %s", argv[0], "noprint"); @@ -5937,9 +5939,7 @@ signals_info (char *signum_exp, int from_tty) printf_filtered ("\n"); /* These ugly casts brought to you by the native VAX compiler. */ - for (oursig = TARGET_SIGNAL_FIRST; - (int) oursig < (int) TARGET_SIGNAL_LAST; - oursig = (gdb_target_signal_t) ((int) oursig + 1)) + for (oursig = TARGET_SIGNAL_FIRST; oursig < TARGET_SIGNAL_LAST; oursig++) { QUIT; @@ -6612,7 +6612,7 @@ leave it stopped or free to run as needed."), &setlist, &showlist); - numsigs = (int) TARGET_SIGNAL_LAST; + numsigs = TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_LAST); signal_stop = (unsigned char *) xmalloc (sizeof (signal_stop[0]) * numsigs); signal_print = (unsigned char *) xmalloc (sizeof (signal_print[0]) * numsigs); @@ -6627,37 +6627,37 @@ leave it stopped or free to run as needed."), /* Signals caused by debugger's own actions should not be given to the program afterwards. */ - signal_program[TARGET_SIGNAL_TRAP] = 0; - signal_program[TARGET_SIGNAL_INT] = 0; + signal_pass_update (TARGET_SIGNAL_TRAP, 0); + signal_pass_update (TARGET_SIGNAL_INT, 0); /* Signals that are not errors should not normally enter the debugger. */ - signal_stop[TARGET_SIGNAL_ALRM] = 0; - signal_print[TARGET_SIGNAL_ALRM] = 0; - signal_stop[TARGET_SIGNAL_VTALRM] = 0; - signal_print[TARGET_SIGNAL_VTALRM] = 0; - signal_stop[TARGET_SIGNAL_PROF] = 0; - signal_print[TARGET_SIGNAL_PROF] = 0; - signal_stop[TARGET_SIGNAL_CHLD] = 0; - signal_print[TARGET_SIGNAL_CHLD] = 0; - signal_stop[TARGET_SIGNAL_IO] = 0; - signal_print[TARGET_SIGNAL_IO] = 0; - signal_stop[TARGET_SIGNAL_POLL] = 0; - signal_print[TARGET_SIGNAL_POLL] = 0; - signal_stop[TARGET_SIGNAL_URG] = 0; - signal_print[TARGET_SIGNAL_URG] = 0; - signal_stop[TARGET_SIGNAL_WINCH] = 0; - signal_print[TARGET_SIGNAL_WINCH] = 0; + signal_stop_update (TARGET_SIGNAL_ALRM, 0); + signal_print_update (TARGET_SIGNAL_ALRM, 0); + signal_stop_update (TARGET_SIGNAL_VTALRM, 0); + signal_print_update (TARGET_SIGNAL_VTALRM, 0); + signal_stop_update (TARGET_SIGNAL_PROF, 0); + signal_print_update (TARGET_SIGNAL_PROF, 0); + signal_stop_update (TARGET_SIGNAL_CHLD, 0); + signal_print_update (TARGET_SIGNAL_CHLD, 0); + signal_stop_update (TARGET_SIGNAL_IO, 0); + signal_print_update (TARGET_SIGNAL_IO, 0); + signal_stop_update (TARGET_SIGNAL_POLL, 0); + signal_print_update (TARGET_SIGNAL_POLL, 0); + signal_stop_update (TARGET_SIGNAL_URG, 0); + signal_print_update (TARGET_SIGNAL_URG, 0); + signal_stop_update (TARGET_SIGNAL_WINCH, 0); + signal_print_update (TARGET_SIGNAL_WINCH, 0); /* These signals are used internally by user-level thread implementations. (See signal(5) on Solaris.) Like the above signals, a healthy program receives and handles them as part of its normal operation. */ - signal_stop[TARGET_SIGNAL_LWP] = 0; - signal_print[TARGET_SIGNAL_LWP] = 0; - signal_stop[TARGET_SIGNAL_WAITING] = 0; - signal_print[TARGET_SIGNAL_WAITING] = 0; - signal_stop[TARGET_SIGNAL_CANCEL] = 0; - signal_print[TARGET_SIGNAL_CANCEL] = 0; + signal_stop_update (TARGET_SIGNAL_LWP, 0); + signal_print_update (TARGET_SIGNAL_LWP, 0); + signal_stop_update (TARGET_SIGNAL_WAITING, 0); + signal_print_update (TARGET_SIGNAL_WAITING, 0); + signal_stop_update (TARGET_SIGNAL_CANCEL, 0); + signal_print_update (TARGET_SIGNAL_CANCEL, 0); add_setshow_zinteger_cmd ("stop-on-solib-events", class_support, &stop_on_solib_events, _("\ --- a/gdb/record.c +++ b/gdb/record.c @@ -2302,7 +2302,7 @@ record_restore (void) bfdcore_read (core_bfd, osec, &signal, sizeof (signal), &bfd_offset); signal = netorder32 (signal); - rec->u.end.sigval = signal; + rec->u.end.sigval = target_signal_from_number (signal); /* Get insn count. */ bfdcore_read (core_bfd, osec, &count, @@ -2560,7 +2560,8 @@ cmd_record_save (char *args, int from_tty) (unsigned long) sizeof (signal), (unsigned long) sizeof (count)); /* Write signal value. */ - signal = netorder32 (record_list->u.end.sigval); + signal = netorder32 (TARGET_SIGNAL_NUMBER + (record_list->u.end.sigval)); bfdcore_write (obfd, osec, &signal, sizeof (signal), &bfd_offset); --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1557,15 +1557,17 @@ remote_pass_signals (void) if (remote_protocol_packets[PACKET_QPassSignals].support != PACKET_DISABLE) { char *pass_packet, *p; - int numsigs = (int) TARGET_SIGNAL_LAST; + int numsigs = TARGET_SIGNAL_NUMBER (TARGET_SIGNAL_LAST); int count = 0, i; gdb_assert (numsigs < 256); for (i = 0; i < numsigs; i++) { - if (signal_stop_state (i) == 0 - && signal_print_state (i) == 0 - && signal_pass_state (i) == 1) + gdb_target_signal_t sig = target_signal_from_number (i); + + if (signal_stop_state (sig) == 0 + && signal_print_state (sig) == 0 + && signal_pass_state (sig) == 1) count++; } pass_packet = xmalloc (count * 3 + strlen ("QPassSignals:") + 1); @@ -1573,9 +1575,11 @@ remote_pass_signals (void) p = pass_packet + strlen (pass_packet); for (i = 0; i < numsigs; i++) { - if (signal_stop_state (i) == 0 - && signal_print_state (i) == 0 - && signal_pass_state (i) == 1) + gdb_target_signal_t sig = target_signal_from_number (i); + + if (signal_stop_state (sig) == 0 + && signal_print_state (sig) == 0 + && signal_pass_state (sig) == 1) { if (i >= 16) *p++ = tohex (i >> 4); @@ -4389,11 +4393,11 @@ append_resumption (char *p, char *endp, struct remote_state *rs = get_remote_state (); if (step && siggnal != TARGET_SIGNAL_0) - p += xsnprintf (p, endp - p, ";S%02x", siggnal); + p += xsnprintf (p, endp - p, ";S%02x", TARGET_SIGNAL_NUMBER (siggnal)); else if (step) p += xsnprintf (p, endp - p, ";s"); else if (siggnal != TARGET_SIGNAL_0) - p += xsnprintf (p, endp - p, ";C%02x", siggnal); + p += xsnprintf (p, endp - p, ";C%02x", TARGET_SIGNAL_NUMBER (siggnal)); else p += xsnprintf (p, endp - p, ";c"); @@ -4495,7 +4499,7 @@ remote_vcont_resume (ptid_t ptid, int step, gdb_target_signal_t siggnal) /* Tell the remote machine to resume. */ -static gdb_target_signal_t last_sent_signal = TARGET_SIGNAL_0; +static gdb_target_signal_t last_sent_signal; static int last_sent_step; @@ -4531,7 +4535,7 @@ remote_resume (struct target_ops *ops, /* We don't pass signals to the target in reverse exec mode. */ if (info_verbose && siggnal != TARGET_SIGNAL_0) warning (" - Can't pass signal %d to target in reverse: ignored.\n", - siggnal); + TARGET_SIGNAL_NUMBER (siggnal)); if (step && remote_protocol_packets[PACKET_bs].support == PACKET_DISABLE) @@ -4544,9 +4548,11 @@ remote_resume (struct target_ops *ops, } else if (siggnal != TARGET_SIGNAL_0) { + int signo = TARGET_SIGNAL_NUMBER (siggnal); + buf[0] = step ? 'S' : 'C'; - buf[1] = tohex (((int) siggnal >> 4) & 0xf); - buf[2] = tohex (((int) siggnal) & 0xf); + buf[1] = tohex ((signo >> 4) & 0xf); + buf[2] = tohex (signo & 0xf); buf[3] = '\0'; } else @@ -5155,8 +5161,9 @@ Packet: '%s'\n"), else { event->ws.kind = TARGET_WAITKIND_STOPPED; - event->ws.value.sig = (gdb_target_signal_t) - (((fromhex (buf[1])) << 4) + (fromhex (buf[2]))); + event->ws.value.sig + = target_signal_from_number ((fromhex (buf[1]) << 4) + + fromhex (buf[2])); } break; case 'W': /* Target exited. */ @@ -5181,7 +5188,7 @@ Packet: '%s'\n"), { /* The remote process exited with a signal. */ event->ws.kind = TARGET_WAITKIND_SIGNALLED; - event->ws.value.sig = (gdb_target_signal_t) value; + event->ws.value.sig = target_signal_from_number (value); } /* If no process is specified, assume inferior_ptid. */ @@ -10788,5 +10795,6 @@ Show the remote pathname for \"run\""), NULL, NULL, NULL, target_buf_size = 2048; target_buf = xmalloc (target_buf_size); -} + last_sent_signal = TARGET_SIGNAL_0; +} --- a/include/gdb/signals.h +++ b/include/gdb/signals.h @@ -49,13 +49,31 @@ /* For an explanation of what each signal means, see target_signal_to_string. */ -typedef enum +#define TARGET_SIGNAL_NUMBER(target_signal) (target_signal)->number +#define TARGET_SIGNAL_STRING(target_signal) (target_signal)->string +#define TARGET_SIGNAL_NAME(target_signal) (target_signal)->name +#define TARGET_SIGNAL_NUMBER_CONST(target_signal) target_signal ## _NUMBER + +enum target_signal_number + { +#define SET(symbol, constant, name, string) \ + TARGET_SIGNAL_NUMBER_CONST (symbol) = constant, +#include "gdb/signals.def" +#undef SET + }; + +struct target_signal_o { + enum target_signal_number number; + const char *name; + const char *string; + }; + +typedef const struct target_signal_o *gdb_target_signal_t; + #define SET(symbol, constant, name, string) \ - symbol = constant, + extern const gdb_target_signal_t symbol; #include "gdb/signals.def" #undef SET - } -gdb_target_signal_t; #endif /* #ifndef GDB_SIGNALS_H */