diff options
author | Martin Liska <mliska@suse.cz> | 2020-03-24 11:40:10 +0100 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-03-24 04:30:20 -0700 |
commit | dfb68cc35803369cbd163c2ebc07fb27e81d9950 (patch) | |
tree | 865c6154128c25e9d7f29f1e320587287084e0b7 /include | |
parent | 7e6e972f74aeac0ebdbd95a7f905d871cd2581de (diff) | |
download | gdb-dfb68cc35803369cbd163c2ebc07fb27e81d9950.zip gdb-dfb68cc35803369cbd163c2ebc07fb27e81d9950.tar.gz gdb-dfb68cc35803369cbd163c2ebc07fb27e81d9950.tar.bz2 |
include: Sync plugin-api.h with GCC
Improve endianess detection.
PR lto/94249
* plugin-api.h: Add more robust endianess detection.
Diffstat (limited to 'include')
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/plugin-api.h | 65 |
2 files changed, 68 insertions, 2 deletions
diff --git a/include/ChangeLog b/include/ChangeLog index 3571247..3d26a57 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2020-03-24 Martin Liska <mliska@suse.cz> + + PR lto/94249 + * plugin-api.h: Add more robust endianess detection. + 2020-03-21 Martin Liska <mliska@suse.cz> * plugin-api.h (enum ld_plugin_symbol_type): Remove diff --git a/include/plugin-api.h b/include/plugin-api.h index 673f136..864d2bf 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 <endian.h> +#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 +#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; |