From patchwork Fri Apr 26 20:11:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Waroquiers X-Patchwork-Id: 32429 Received: (qmail 112077 invoked by alias); 26 Apr 2019 20:11:22 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 111986 invoked by uid 89); 26 Apr 2019 20:11:22 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-15.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mailsec108.isp.belgacom.be Received: from mailsec108.isp.belgacom.be (HELO mailsec108.isp.belgacom.be) (195.238.20.104) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 Apr 2019 20:11:20 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skynet.be; i=@skynet.be; q=dns/txt; s=securemail; t=1556309480; x=1587845480; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gv18aRokbFMw725+EtWgKRd9xyLOfu6kdLpZufE0xhM=; b=YP1sKMslAEHiK52lqM5Ms01nNMJVQSDEWkteypXTfKYZQrXZ6CP9gmVE YBkNF/guhq5/rUhsOAOfTBdioNyLUw==; Received: from 59.151-129-109.adsl-dyn.isp.belgacom.be (HELO md.home) ([109.129.151.59]) by relay.skynet.be with ESMTP/TLS/DHE-RSA-AES128-GCM-SHA256; 26 Apr 2019 22:11:14 +0200 From: Philippe Waroquiers To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [RFAv2 2/6] Improve process exit status macros on MinGW Date: Fri, 26 Apr 2019 22:11:04 +0200 Message-Id: <20190426201108.7489-3-philippe.waroquiers@skynet.be> In-Reply-To: <20190426201108.7489-1-philippe.waroquiers@skynet.be> References: <20190426201108.7489-1-philippe.waroquiers@skynet.be> MIME-Version: 1.0 X-IsSubscribed: yes gdb/ChangeLog 2019-04-26 Eli Zaretskii Philippe Waroquiers * 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 50094187bd..411c7a8133 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -281,9 +281,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. */ @@ -303,7 +303,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 {