From 80b6c32f233ed28607643c4e4e4e2ee3399fdfd7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 15 May 2023 22:32:32 +0930 Subject: PR29961, plugin-api.h: "Could not detect architecture endianess" Found when attempting to build binutils on sparc sunos-5.8 where sys/byteorder.h defines _BIG_ENDIAN but not any of the BYTE_ORDER variants. This patch adds the extra tests to cope with the old machine, and tidies the header a little. PR 29961 plugin-api.h: When handling non-gcc or gcc < 4.6.0 include necessary header files before testing macros. Make more use of #elif. Test _LITTLE_ENDIAN and _BIG_ENDIAN in final tests. --- include/plugin-api.h | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/include/plugin-api.h b/include/plugin-api.h index 395d5bcc598..f3cf2d8101b 100644 --- a/include/plugin-api.h +++ b/include/plugin-api.h @@ -37,7 +37,7 @@ #error cannot find uint64_t type #endif -/* Detect endianess based on __BYTE_ORDER__ macro. */ +/* Detect endianess based on gcc's (>=4.6.0) __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__ @@ -47,46 +47,47 @@ #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. */ +/* Include header files to define endian macros. */ #if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID__) #include + +#elif defined(__SVR4) && defined(__sun) +#include + +#elif defined(__FreeBSD__) || defined(__NetBSD__) || \ + defined(__DragonFly__) || defined(__minix) +#include + +#elif 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 -#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 +#elif defined _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) +#elif defined _WIN32 #define PLUGIN_LITTLE_ENDIAN 1 -#endif + /* Detect based on __BIG_ENDIAN__ and __LITTLE_ENDIAN__ */ -#ifdef __LITTLE_ENDIAN__ +#elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN #define PLUGIN_LITTLE_ENDIAN 1 -#endif -#ifdef __BIG_ENDIAN__ +#elif defined __BIG_ENDIAN__ || defined _BIG_ENDIAN #define PLUGIN_BIG_ENDIAN 1 #endif #endif -- cgit v1.2.1