From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 2DF02385B834 for ; Tue, 24 Mar 2020 08:49:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 2DF02385B834 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mliska@suse.cz X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 11745AFF6; Tue, 24 Mar 2020 08:49:43 +0000 (UTC) Subject: Re: [PATCH] Check endianess detection. To: Jakub Jelinek Cc: "H.J. Lu" , Richard Biener , GCC Patches References: <20200323101025.GE2156@tucnak> <7a5da5ef-1f97-c273-ca22-7621c419f1c3@suse.cz> <20200323103505.GF2156@tucnak> <6313e487-6dbb-ac17-4160-4ac600af40be@suse.cz> <7369b1aa-be0d-92cc-4f81-1612f101e2e8@suse.cz> <3786da05-1530-38c5-e9e2-cd69418cd42a@suse.cz> <5b27738a-9885-9906-0c93-888daf4a066f@suse.cz> <20200324083109.GP2156@tucnak> From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Message-ID: Date: Tue, 24 Mar 2020 09:49:42 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20200324083109.GP2156@tucnak> Content-Type: multipart/mixed; boundary="------------94D426CC5E718D0F59C2C911" Content-Language: en-US X-Spam-Status: No, score=-35.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Mar 2020 08:49:46 -0000 This is a multi-part message in MIME format. --------------94D426CC5E718D0F59C2C911 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit On 3/24/20 9:31 AM, Jakub Jelinek wrote: > On Tue, Mar 24, 2020 at 09:19:12AM +0100, Martin Liška wrote: >> 2020-03-24 Martin Liska >> >> PR lto/94249 >> * plugin-api.h: Add more robust endianess detection. >> --- >> include/plugin-api.h | 43 +++++++++++++++++++++++++++++++++++++++++-- >> 1 file changed, 41 insertions(+), 2 deletions(-) >> >> diff --git a/include/plugin-api.h b/include/plugin-api.h >> index 673f136ce68..4a211d51f43 100644 >> --- a/include/plugin-api.h >> +++ b/include/plugin-api.h >> @@ -42,6 +42,43 @@ extern "C" >> { >> #endif > > The location is incorrect, you don't want to include system headers > inside explicit extern "C", so please move it a few lines above it. > > Furthermore, you don't have the glibc case with GCC < 4.6 handled, that > needs something like: > #if defined(__GLIBC__) || defined(__GNU_LIBRARY__) \ > || defined(__ANDROID__) > #include > #if __BYTE_ORDER == __LITTLE_ENDIAN > #define PLUGIN_LITTLE_ENDIAN 1 > #elif __BYTE_ORDER == __BIG_ENDIAN > #define PLUGIN_BIG_ENDIAN 1 > ... > (of course done only if __BYTE_ORDER__ and __ORDER_*_ENDIAN__ isn't > defined). > > And, you don't handle PDP endian, while GCC does support pdp11-*, > so IMNSHO you also need to detect PDP endian and use: > > #elif PLUGIN_PDP_ENDIAN == 1 > char symbol_type; > char def; > char unused; > char section_kind; > > Jakub > Thank you Jakub for the review! There's updated patch that reflects that. Martin --------------94D426CC5E718D0F59C2C911 Content-Type: text/x-patch; charset=UTF-8; name="0001-Improve-endianess-detection.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0001-Improve-endianess-detection.patch" >From 05c219e70a6928ed3fbb087090594fe2a09234a9 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 24 Mar 2020 09:12:50 +0100 Subject: [PATCH] Improve endianess detection. include/ChangeLog: 2020-03-24 Martin Liska PR lto/94249 * plugin-api.h: Add more robust endianess detection. --- include/plugin-api.h | 61 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/include/plugin-api.h b/include/plugin-api.h index 673f136ce68..e8ba6603977 100644 --- a/include/plugin-api.h +++ b/include/plugin-api.h @@ -37,6 +37,56 @@ #error cannot find uint64_t type #endif +/* Detect endianess based on __BYTE_ORDER__ macro. */ +#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && \ + defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_PDP_ENDIAN__) +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define PLUGIN_LITTLE_ENDIAN 1 +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define PLUGIN_BIG_ENDIAN 1 +#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__ +#define PLUGIN_PDP_ENDIAN 1 +#endif +#else +/* Older GCC releases (<4.6.0) can make detection from glibc macros. */ +#if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__) +#include +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define PLUGIN_LITTLE_ENDIAN 1 +#elif __BYTE_ORDER == __BIG_ENDIAN +#define PLUGIN_BIG_ENDIAN 1 +#endif +#endif +/* Include all necessary header files based on target. */ +#if defined(__SVR4) && defined(__sun) +#include +#endif +#if defined(__FreeBSD__) || defined(__NetBSD__) || \ + defined(__DragonFly__) || defined(__minix) +#include +#endif +#if defined(__OpenBSD__) +#include +#endif +/* Detect endianess based on _BYTE_ORDER. */ +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define PLUGIN_LITTLE_ENDIAN 1 +#elif _BYTE_ORDER == _BIG_ENDIAN +#define PLUGIN_BIG_ENDIAN 1 +#endif +/* Detect based on _WIN32. */ +#if defined(_WIN32) +#define PLUGIN_LITTLE_ENDIAN 1 +#endif +/* Fallback to __BIG_ENDIAN__ and __LITTLE_ENDIAN__ */ +#ifdef __LITTLE_ENDIAN__ +#define PLUGIN_LITTLE_ENDIAN 1 +#endif +#ifdef __BIG_ENDIAN__ +#define PLUGIN_BIG_ENDIAN 1 +#endif +#endif + #ifdef __cplusplus extern "C" { @@ -89,16 +139,23 @@ struct ld_plugin_symbol char *version; /* This is for compatibility with older ABIs. The older ABI defined only 'def' field. */ -#ifdef __BIG_ENDIAN__ +#if PLUGIN_BIG_ENDIAN == 1 char unused; char section_kind; char symbol_type; char def; -#else +#elif PLUGIN_LITTLE_ENDIAN == 1 char def; char symbol_type; char section_kind; char unused; +#elif PLUGIN_PDP_ENDIAN == 1 + char symbol_type; + char def; + char unused; + char section_kind; +#else +#error "Could not detect architecture endianess" #endif int visibility; uint64_t size; -- 2.25.1 --------------94D426CC5E718D0F59C2C911--