From be4ce2c54672e7772586c13d6e37c63124624bbc 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 | 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 +/* Detect endianess based on __BYTE_ORDER__ macro. */ +#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && defined(__ORDER_LITTLE_ENDIAN__) +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define PLUGIN_LITTLE_ENDIAN 1 +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define PLUGIN_BIG_ENDIAN 1 +#endif +#else +/* 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 + /* Status code returned by most API routines. */ enum ld_plugin_status @@ -89,16 +126,18 @@ 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; +#else +#error "Could not detect architecture endianess" #endif int visibility; uint64_t size; -- 2.25.1