diff options
author | Alan Modra <amodra@gmail.com> | 2023-05-15 22:32:32 +0930 |
---|---|---|
committer | Arsen Arsenović <arsen@gcc.gnu.org> | 2023-08-07 22:59:36 +0200 |
commit | 24f5a73aa31b51508ceacb4ccc52317476e775aa (patch) | |
tree | 3fff1f438ee9e42d0a394bb8e646b0727e9f5cb5 /include | |
parent | e4cd4f783c57987954302405702d84015823f320 (diff) | |
download | gcc-24f5a73aa31b51508ceacb4ccc52317476e775aa.zip gcc-24f5a73aa31b51508ceacb4ccc52317476e775aa.tar.gz gcc-24f5a73aa31b51508ceacb4ccc52317476e775aa.tar.bz2 |
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.
include/ChangeLog:
* 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.
Diffstat (limited to 'include')
-rw-r--r-- | include/plugin-api.h | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/include/plugin-api.h b/include/plugin-api.h index 395d5bc..f3cf2d8 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 <endian.h> + +#elif defined(__SVR4) && defined(__sun) +#include <sys/byteorder.h> + +#elif defined(__FreeBSD__) || defined(__NetBSD__) || \ + defined(__DragonFly__) || defined(__minix) +#include <sys/endian.h> + +#elif defined(__OpenBSD__) +#include <machine/endian.h> +#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 <sys/byteorder.h> -#endif -#if defined(__FreeBSD__) || defined(__NetBSD__) || \ - defined(__DragonFly__) || defined(__minix) -#include <sys/endian.h> -#endif -#if defined(__OpenBSD__) -#include <machine/endian.h> -#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 |