From: Philippe Waroquiers <philippe.waroquiers@skynet.be>
To: gdb-patches@sourceware.org
Cc: Philippe Waroquiers <philippe.waroquiers@skynet.be>
Subject: [RFAv3 2/6] Improve process exit status macros on MinGW
Date: Sat, 04 May 2019 16:18:00 -0000 [thread overview]
Message-ID: <20190504161753.15530-3-philippe.waroquiers@skynet.be> (raw)
In-Reply-To: <20190504161753.15530-1-philippe.waroquiers@skynet.be>
gdb/ChangeLog
2019-05-04 Eli Zaretskii <eliz@gnu.org>
Philippe Waroquiers <philippe.waroquiers@skynet.be>
* 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.
---
gdb/common/gdb_wait.h | 27 +++++++++++++++++++++++++++
gdb/windows-nat.c | 18 ++++++++++++++----
2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/gdb/common/gdb_wait.h b/gdb/common/gdb_wait.h
index b3b752cf3a..ca95240009 100644
--- a/gdb/common/gdb_wait.h
+++ b/gdb/common/gdb_wait.h
@@ -40,13 +40,31 @@
NOTE exception for GNU/Linux below). We also fail to declare
wait() and waitpid(). */
+/* For MINGW, the underlying idea is that when a Windows program is terminated
+ by a fatal exception, its exit code is the value of that exception, as
+ defined by the various STATUS_* symbols in the Windows API headers.
+
+ The below is not perfect, because a program could legitimately exit normally
+ with a status whose value happens to have the high bits set, but that's
+ extremely rare, to say the least, and it is deemed such a negligibly small
+ probability of false positives is justified by the utility of reporting the
+ terminating signal in the "normal" cases. */
+
#ifndef WIFEXITED
+#if defined (__MINGW32__)
+#define WIFEXITED(stat_val) (((stat_val) & 0xC0000000) == 0)
+#else
#define WIFEXITED(w) (((w)&0377) == 0)
#endif
+#endif
#ifndef WIFSIGNALED
+#if defined (__MINGW32__)
+#define WIFSIGNALED(stat_val) (((stat_val) & 0xC0000000) == 0xC0000000)
+#else
#define WIFSIGNALED(w) (((w)&0377) != 0177 && ((w)&~0377) == 0)
#endif
+#endif
#ifndef WIFSTOPPED
#ifdef IBM6000
@@ -64,12 +82,21 @@
#endif
#ifndef WEXITSTATUS
+#if defined (__MINGW32__)
+#define WEXITSTATUS(stat_val) ((stat_val) & 255)
+#else
#define WEXITSTATUS(w) (((w) >> 8) & 0377) /* same as WRETCODE */
#endif
+#endif
#ifndef WTERMSIG
+#if defined (__MINGW32__)
+extern enum gdb_signal windows_status_to_termsig (int stat_val);
+#define WTERMSIG(stat_val) windows_status_to_termsig (stat_val)
+#else
#define WTERMSIG(w) ((w) & 0177)
#endif
+#endif
#ifndef WSTOPSIG
#define WSTOPSIG WEXITSTATUS
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index ae4e3d55b3..c90caeda6a 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -280,9 +280,9 @@ static const int *mappings;
a segment register or not. */
static segment_register_p_ftype *segment_register_p;
-/* See windows_nat_target::resume to understand why this is commented
- out. */
-#if 0
+/* See windows_nat_target::resume to understand why xlate is not used
+ to translate a signal into an exception. */
+
/* This vector maps the target's idea of an exception (extracted
from the DEBUG_EVENT structure) to GDB's idea. */
@@ -302,7 +302,17 @@ static const struct xlate_exception xlate[] =
{STATUS_FLOAT_DIVIDE_BY_ZERO, GDB_SIGNAL_FPE}
};
-#endif /* 0 */
+/* Translate a windows exception inside STAT_VAL into a gdb_signal.
+ This should only be called if WIFSIGNALED (stat_val). */
+
+enum gdb_signal
+windows_status_to_termsig (int stat_val)
+{
+ for (const xlate_exception &x : xlate)
+ if (x.them == (stat_val & ~0xC0000000))
+ return x.us;
+ return GDB_SIGNAL_UNKNOWN;
+}
struct windows_nat_target final : public x86_nat_target<inf_child_target>
{
--
2.20.1
next prev parent reply other threads:[~2019-05-04 16:18 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-04 16:18 [RFAv3 0/6] Implement | (pipe) command Philippe Waroquiers
2019-05-04 16:18 ` [RFAv3 4/6] " Philippe Waroquiers
2019-05-27 17:48 ` Pedro Alves
2019-05-27 17:55 ` Pedro Alves
2019-05-04 16:18 ` [RFAv3 5/6] Test the " Philippe Waroquiers
2019-05-27 17:49 ` Pedro Alves
2019-05-04 16:18 ` [RFAv3 1/6] Add previous_saved_command_line to allow a command to repeat a previous command Philippe Waroquiers
2019-05-27 17:29 ` Pedro Alves
2019-05-04 16:18 ` [RFAv3 3/6] Add function execute_command_to_ui_file Philippe Waroquiers
2019-05-04 16:18 ` [RFAv3 6/6] NEWS and documentation for | (pipe) command Philippe Waroquiers
2019-05-04 16:26 ` Eli Zaretskii
2019-05-04 16:33 ` Eli Zaretskii
2019-05-27 17:51 ` Pedro Alves
2019-05-04 16:18 ` Philippe Waroquiers [this message]
2019-05-27 17:33 ` [RFAv3 2/6] Improve process exit status macros on MinGW Pedro Alves
2019-05-27 18:38 ` Eli Zaretskii
2019-05-29 12:38 ` Pedro Alves
2019-05-29 15:03 ` Eli Zaretskii
2019-05-30 10:26 ` Philippe Waroquiers
2019-12-17 17:00 ` Eli Zaretskii
2019-12-17 17:51 ` Pedro Alves
2019-12-18 17:08 ` Eli Zaretskii
2019-12-18 17:42 ` Pedro Alves
2019-12-18 18:33 ` Eli Zaretskii
2019-12-25 15:57 ` Eli Zaretskii
2020-01-03 19:59 ` Pedro Alves
2020-01-03 20:08 ` Pedro Alves
2020-01-03 20:34 ` Eli Zaretskii
2020-01-06 11:57 ` Pedro Alves
2020-01-06 16:17 ` Eli Zaretskii
2020-01-06 18:51 ` Pedro Alves
2020-01-06 19:26 ` Eli Zaretskii
2020-01-06 18:59 ` Hannes Domani via gdb-patches
2020-01-06 19:34 ` Eli Zaretskii
2020-01-06 19:38 ` Hannes Domani via gdb-patches
2020-01-06 19:55 ` Eli Zaretskii
2020-01-03 17:04 ` Pedro Alves
[not found] <271718487.11947642.1578332826544.ref@mail.yahoo.com>
2020-01-06 17:47 ` Hannes Domani via gdb-patches
2020-01-06 18:23 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190504161753.15530-3-philippe.waroquiers@skynet.be \
--to=philippe.waroquiers@skynet.be \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox