diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 1a6908261..4644f9c60 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -153,32 +153,34 @@ inline void EndianCheck() { template T EndianSwap(T t) { #if defined(_MSC_VER) - #pragma push_macro("__builtin_bswap16") - #pragma push_macro("__builtin_bswap32") - #pragma push_macro("__builtin_bswap64") - #define __builtin_bswap16 _byteswap_ushort - #define __builtin_bswap32 _byteswap_ulong - #define __builtin_bswap64 _byteswap_uint64 + #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort + #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong + #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 + #else + #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 + // __builtin_bswap16 was missing prior to GCC 4.8. + #define FLATBUFFERS_BYTESWAP16(x) \ + static_cast(__builtin_bswap32(static_cast(x) << 16)) + #else + #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 + #endif + #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 + #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 #endif if (sizeof(T) == 1) { // Compile-time if-then's. return t; } else if (sizeof(T) == 2) { - auto r = __builtin_bswap16(*reinterpret_cast(&t)); + auto r = FLATBUFFERS_BYTESWAP16(*reinterpret_cast(&t)); return *reinterpret_cast(&r); } else if (sizeof(T) == 4) { - auto r = __builtin_bswap32(*reinterpret_cast(&t)); + auto r = FLATBUFFERS_BYTESWAP32(*reinterpret_cast(&t)); return *reinterpret_cast(&r); } else if (sizeof(T) == 8) { - auto r = __builtin_bswap64(*reinterpret_cast(&t)); + auto r = FLATBUFFERS_BYTESWAP64(*reinterpret_cast(&t)); return *reinterpret_cast(&r); } else { assert(0); } - #if defined(_MSC_VER) - #pragma pop_macro("__builtin_bswap16") - #pragma pop_macro("__builtin_bswap32") - #pragma pop_macro("__builtin_bswap64") - #endif } template T EndianScalar(T t) {