aboutsummaryrefslogtreecommitdiff
path: root/gdb/windows-tdep.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2020-01-06 11:51:54 +0000
committerPedro Alves <palves@redhat.com>2020-01-06 11:51:54 +0000
commit559e7e5056e0671f2f248e1f9c2af849bfe3e64b (patch)
tree72cbb9abc638d724015998beb33c2341e31ebff8 /gdb/windows-tdep.c
parent49078ece048d0871508218203744f95e68ba5b4a (diff)
downloadgdb-559e7e5056e0671f2f248e1f9c2af849bfe3e64b.zip
gdb-559e7e5056e0671f2f248e1f9c2af849bfe3e64b.tar.gz
gdb-559e7e5056e0671f2f248e1f9c2af849bfe3e64b.tar.bz2
Improve process exit status macros on MinGW
When a Windows program is terminated by a fatal exception, its exit code is the value of that exception, as defined by the various EXCEPTION_* symbols in the Windows API headers. This commit emulates WTERMSIG etc. by translating the fatal exception codes to more-or-less equivalent Posix signals. gdb/ChangeLog: 2020-01-06 Eli Zaretskii <eliz@gnu.org> Pedro Alves <palves@redhat.com> * Makefile.in (COMMON_SFILES): Add gdbsupport/gdb_wait.c. * windows-tdep.c: New enumeration of WINDOWS_SIG* signals. (windows_gdb_signal_to_target): New function, uses the above enumeration to convert GDB internal signal codes to equivalent Windows codes. (windows_init_abi): Call set_gdbarch_gdb_signal_to_target. * windows-nat.c: Include "gdb_wait.h". (get_windows_debug_event): Extract the fatal exception from the exit status and convert to the equivalent Posix signal number. * cli/cli-cmds.c (exit_status_set_internal_vars): Account for the possibility that WTERMSIG returns GDB_SIGNAL_UNKNOWN. * gdbsupport/gdb_wait.c: New file, implements windows_status_to_termsig. * gdbsupport/gdb_wait.h (WIFEXITED, WIFSIGNALED, WEXITSTATUS) (WTERMSIG) [__MINGW32__]: Separate definitions for MinGW. gdb/gdbserver/ChangeLog: 2020-01-06 Eli Zaretskii <eliz@gnu.org> Pedro Alves <palves@redhat.com> * win32-low.c (get_child_debug_event): Extract the fatal exception from the exit status and convert to the equivalent Posix signal number. (win32_wait): Allow TARGET_WAITKIND_SIGNALLED status as well. * Makefile.in (OBS, SFILES): Add gdb_wait.[co].
Diffstat (limited to 'gdb/windows-tdep.c')
-rw-r--r--gdb/windows-tdep.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c
index ca9b81d..58f8838 100644
--- a/gdb/windows-tdep.c
+++ b/gdb/windows-tdep.c
@@ -35,6 +35,57 @@
#include "solib-target.h"
#include "gdbcore.h"
+/* Windows signal numbers differ between MinGW flavors and between
+ those and Cygwin. The below enumeration was gleaned from the
+ respective headers; the ones marked with MinGW64/Cygwin are defined
+ only by MinGW64 and Cygwin, not by mingw.org's MinGW. FIXME: We
+ should really have distinct MinGW vs Cygwin OSABIs, and two
+ separate enums, selected at runtime. */
+
+enum
+ {
+ WINDOWS_SIGHUP = 1, /* MinGW64/Cygwin */
+ WINDOWS_SIGINT = 2,
+ WINDOWS_SIGQUIT = 3, /* MinGW64/Cygwin */
+ WINDOWS_SIGILL = 4,
+ WINDOWS_SIGTRAP = 5, /* MinGW64/Cygwin */
+#ifdef __CYGWIN__
+ WINDOWS_SGABRT = 6,
+#else
+ WINDOWS_SIGIOT = 6, /* MinGW64 */
+#endif
+ WINDOWS_SIGEMT = 7, /* MinGW64/Cygwin */
+ WINDOWS_SIGFPE = 8,
+ WINDOWS_SIGKILL = 9, /* MinGW64/Cygwin */
+ WINDOWS_SIGBUS = 10, /* MinGW64/Cygwin */
+ WINDOWS_SIGSEGV = 11,
+ WINDOWS_SIGSYS = 12, /* MinGW64/Cygwin */
+ WINDOWS_SIGPIPE = 13,/* MinGW64/Cygwin */
+ WINDOWS_SIGALRM = 14,/* MinGW64/Cygwin */
+ WINDOWS_SIGTERM = 15,
+#ifdef __CYGWIN__
+ WINDOWS_SIGURG = 16,
+ WINDOWS_SIGSTOP = 17,
+ WINDOWS_SIGTSTP = 18,
+ WINDOWS_SIGCONT = 19,
+ WINDOWS_SIGCHLD = 20,
+ WINDOWS_SIGTTIN = 21,
+ WINDOWS_SIGTTOU = 22,
+ WINDOWS_SIGIO = 23,
+ WINDOWS_SIGXCPU = 24,
+ WINDOWS_SIGXFSZ = 25,
+ WINDOWS_SIGVTALRM = 26,
+ WINDOWS_SIGPROF = 27,
+ WINDOWS_SIGWINCH = 28,
+ WINDOWS_SIGLOST = 29,
+ WINDOWS_SIGUSR1 = 30,
+ WINDOWS_SIGUSR2 = 31
+#else
+ WINDOWS_SIGBREAK = 21,
+ WINDOWS_SIGABRT = 22
+#endif
+ };
+
struct cmd_list_element *info_w32_cmdlist;
typedef struct thread_information_block_32
@@ -461,6 +512,83 @@ init_w32_command_list (void)
}
}
+/* Implementation of `gdbarch_gdb_signal_to_target'. */
+
+static int
+windows_gdb_signal_to_target (struct gdbarch *gdbarch, enum gdb_signal signal)
+{
+ switch (signal)
+ {
+ case GDB_SIGNAL_0:
+ return 0;
+ case GDB_SIGNAL_HUP:
+ return WINDOWS_SIGHUP;
+ case GDB_SIGNAL_INT:
+ return WINDOWS_SIGINT;
+ case GDB_SIGNAL_QUIT:
+ return WINDOWS_SIGQUIT;
+ case GDB_SIGNAL_ILL:
+ return WINDOWS_SIGILL;
+ case GDB_SIGNAL_TRAP:
+ return WINDOWS_SIGTRAP;
+ case GDB_SIGNAL_ABRT:
+ return WINDOWS_SIGABRT;
+ case GDB_SIGNAL_EMT:
+ return WINDOWS_SIGEMT;
+ case GDB_SIGNAL_FPE:
+ return WINDOWS_SIGFPE;
+ case GDB_SIGNAL_KILL:
+ return WINDOWS_SIGKILL;
+ case GDB_SIGNAL_BUS:
+ return WINDOWS_SIGBUS;
+ case GDB_SIGNAL_SEGV:
+ return WINDOWS_SIGSEGV;
+ case GDB_SIGNAL_SYS:
+ return WINDOWS_SIGSYS;
+ case GDB_SIGNAL_PIPE:
+ return WINDOWS_SIGPIPE;
+ case GDB_SIGNAL_ALRM:
+ return WINDOWS_SIGALRM;
+ case GDB_SIGNAL_TERM:
+ return WINDOWS_SIGTERM;
+#ifdef __CYGWIN__
+ case GDB_SIGNAL_URG:
+ return WINDOWS_SIGURG;
+ case GDB_SIGNAL_STOP:
+ return WINDOWS_SIGSTOP;
+ case GDB_SIGNAL_TSTP:
+ return WINDOWS_SIGTSTP;
+ case GDB_SIGNAL_CONT:
+ return WINDOWS_SIGCONT;
+ case GDB_SIGNAL_CHLD:
+ return WINDOWS_SIGCHLD;
+ case GDB_SIGNAL_TTIN:
+ return WINDOWS_SIGTTIN;
+ case GDB_SIGNAL_TTOU:
+ return WINDOWS_SIGTTOU;
+ case GDB_SIGNAL_IO:
+ return WINDOWS_SIGIO;
+ case GDB_SIGNAL_XCPU:
+ return WINDOWS_SIGXCPU;
+ case GDB_SIGNAL_XFSZ:
+ return WINDOWS_SIGXFSZ;
+ case GDB_SIGNAL_VTALRM:
+ return WINDOWS_SIGVTALRM;
+ case GDB_SIGNAL_PROF:
+ return WINDOWS_SIGPROF;
+ case GDB_SIGNAL_WINCH:
+ return WINDOWS_SIGWINCH;
+ case GDB_SIGNAL_PWR:
+ return WINDOWS_SIGLOST;
+ case GDB_SIGNAL_USR1:
+ return WINDOWS_SIGUSR1;
+ case GDB_SIGNAL_USR2:
+ return WINDOWS_SIGUSR2;
+#endif /* __CYGWIN__ */
+ }
+ return -1;
+}
+
/* To be called from the various GDB_OSABI_CYGWIN handlers for the
various Windows architectures and machine types. */
@@ -477,6 +605,8 @@ windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_iterate_over_objfiles_in_search_order
(gdbarch, windows_iterate_over_objfiles_in_search_order);
+ set_gdbarch_gdb_signal_to_target (gdbarch, windows_gdb_signal_to_target);
+
set_solib_ops (gdbarch, &solib_target_so_ops);
}