Re: [RFAv3 2/6] Improve process exit status macros on MinGW

Hannes Domani via gdb-patches
2020-01-06T17:47:30Z

While locally fixing a merge-conflict I noticed the following:

Am Freitag, 3. Januar 2020, 20:59:45 MEZ hat Pedro Alves <palves@redhat.com> Folgendes geschrieben:

> Here's the updated patch.  I confirmed that it builds on MinGW-W64
> using my Fedora's cross cross compiler, but I didn't try to run
> the resulting GDB (since I'm not on Windows).

> diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c
> index ca9b81df298..58f8838b885 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
> +  };

For __CYGWIN__ it's WINDOWS_SGABRT, otherwise it's WINDOWS_SIGABRT.

> +
> 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;

I don't think this compiles for cygwin.

> +    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);
> }
>
>
> base-commit: 44f81a76542dbeada2541a05de191ae0ac0fbc2c
> --
> 2.14.5