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

Eli Zaretskii
2019-12-17T17:00:21Z

> From: Pedro Alves <palves@redhat.com>
> Date: Mon, 27 May 2019 18:33:11 +0100

To recap, back in May Philippe added the 'pipe' command, and we had a
brief discussion regarding the use of WIFEXITED, WIFSIGNALED, and
other related macros from <sys/wait.h>, on MS-Windows. It was decided
back then to leave for later the translation of exit codes returned by
'pipe' in MS-Windows build of GDB.

I've now started to look at this issue, with the intent to provide ext
status to signal conversion for the MS-Windows ports of GDB, and I
have a few questions regarding the details.

In that discussion, Pedro commented on Philippe's proposed patch
(https://sourceware.org/ml/gdb-patches/2019-05/msg00131.html) which
added the definitions for WIF* and WEXIT* macros to gdb_wait.h and
their use in widnows-nat.c. The comments are in
https://sourceware.org/ml/gdb-patches/2019-05/msg00590.html, and go
like this:

> > * common/gdb_wait.h (WIFEXITED, WIFSIGNALED, WEXITSTATUS,
> > WTERMSIG): Define better versions for MinGW.
> > * windows-nat.c (xlate): Uncomment the definition.
> > (windows_status_to_termsig): New function.
>
> windows-nat.c looks like the wrong place to put this.
>
> windows-nat.c is only included in the build if building a native
> debugger. But, you need this functionality on every Windows-hosted build
> of GDB, even cross debuggers. So I think you're breaking the build on
> the Windows-hosted, non-native-debugger case.
>
> E.g., --host=mingw --target=arm-none-eabi.
>
> The right place would be mingw-hdep.c.

I'm okay with doing this in mingw-hdep.c, but I'm a bit confused by
this comment. The encoding of the fatal exception in the exit status
of a program is a feature of the native MS-Windows processes. Does
"running cross-debugger" mentioned above allude to running an
MS-Windows program? If so, which GDB component (that is presumably
not windows-nat.c) is involved in running such cross-debugged programs
and for translating the debug status to the likes of
TARGET_WAITKIND_EXITED? And how does the 'pipe' command support these
cross-debugging use cases (as it uses the 'popen' C library function,
which AFAIU runs natively)?

> I admit to being a bit confused about why we want to do this
> translation for this feature while we don't do it for the exit code
> of inferiors running under gdb, for example. I mean, exit status
> with 0xc0000000 set don't cause $_exitsignal to be set instead of
> $_exitcode.

Yes, we should do this for exit code of inferiors as well.

Native MS-Windows debugging produces the TARGET_WAITKIND_* values in
windows-nat.c, so I think the conversion we are talking about will
have to be done there, perhaps _in_addition_to_ other places? IOW,
the function that performs the conversion can be defined in
mingw-hdep.c, but it will have to be called from windows-nat.c at
least, right? And I'm uncertain what other places will have to call
that conversion function for the use case of running a cross-debugger,
can someone please help me understand that?

TIA