From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 28319385E824; Wed, 25 Mar 2020 10:12:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 28319385E824 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1585131153; bh=/vHpWiKmS/C7olaXBbPoDfReEXcVxE2awbnSoxBD6D8=; h=From:To:Subject:Date:From; b=AzreThxDQYZNsbyFz2i8qlRuoW+ParIO5CWluwwr0eslSf0oZlenGIN6bph2PdNDs HyOlxFmEjlACfMsqbnXCYMS+gD3qKSQTgjfTOKrcssiW0gRwm7TgiTfrh9QtnaeSI5 6fo3jxdBmzfXs80JdA6wyUrYG04QUdwGdC/ANg9s= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/vendors/redhat/heads/gcc-10-branch)] Improve endianess detection. X-Act-Checkin: gcc X-Git-Author: Martin Liska X-Git-Refname: refs/vendors/redhat/heads/gcc-10-branch X-Git-Oldrev: 596c90d35591589e0efddda65c81609fb422a986 X-Git-Newrev: 906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536 Message-Id: <20200325101233.28319385E824@sourceware.org> Date: Wed, 25 Mar 2020 10:12:33 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Mar 2020 10:12:33 -0000 https://gcc.gnu.org/g:906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536 commit 906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536 Author: Martin Liska Date: Tue Mar 24 11:40:10 2020 +0100 Improve endianess detection. PR lto/94249 * plugin-api.h: Add more robust endianess detection. Diff: --- include/ChangeLog | 5 ++++ include/plugin-api.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/include/ChangeLog b/include/ChangeLog index e7474e5fed1..a59560caf7e 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2020-03-24 Martin Liska + + PR lto/94249 + * plugin-api.h: Add more robust endianess detection. + 2020-03-21 Martin Liska * plugin-api.h (enum ld_plugin_symbol_type): Remove diff --git a/include/plugin-api.h b/include/plugin-api.h index 673f136ce68..864d2bf91ac 100644 --- a/include/plugin-api.h +++ b/include/plugin-api.h @@ -37,6 +37,60 @@ #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 +#ifdef _BYTE_ORDER +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define PLUGIN_LITTLE_ENDIAN 1 +#elif __BYTE_ORDER == __BIG_ENDIAN +#define PLUGIN_BIG_ENDIAN 1 +#endif +#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. */ +#ifdef _BYTE_ORDER +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define PLUGIN_LITTLE_ENDIAN 1 +#elif _BYTE_ORDER == _BIG_ENDIAN +#define PLUGIN_BIG_ENDIAN 1 +#endif +#endif +/* Detect based on _WIN32. */ +#if defined(_WIN32) +#define PLUGIN_LITTLE_ENDIAN 1 +#endif +/* Detect based on __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 +143,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;