From 5d5cc0d082910dcd15a46e3fc4297a7972f8d45c Mon Sep 17 00:00:00 2001 From: Johann Date: Wed, 14 Oct 2015 10:42:41 -0700 Subject: [PATCH] Check for bswap* builtins before using Canonical builtin checks for clang are to use __has_builtin. Much less fragile than version checks. https://code.google.com/p/webm/issues/detail?id=1082 Change-Id: I8151fb75899acdf1a935c23aad9441da99a9abcd --- vpx_util/endian_inl.h | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/vpx_util/endian_inl.h b/vpx_util/endian_inl.h index 6b177f174..37bdce1cc 100644 --- a/vpx_util/endian_inl.h +++ b/vpx_util/endian_inl.h @@ -25,14 +25,10 @@ # define LOCAL_GCC_PREREQ(maj, min) 0 #endif -#ifdef __clang__ -# define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__) -# define LOCAL_CLANG_PREREQ(maj, min) \ - (LOCAL_CLANG_VERSION >= (((maj) << 8) | (min))) -#else -# define LOCAL_CLANG_VERSION 0 -# define LOCAL_CLANG_PREREQ(maj, min) 0 -#endif // __clang__ +// handle clang compatibility +#ifndef __has_builtin +# define __has_builtin(x) 0 +#endif // some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__) #if !defined(WORDS_BIGENDIAN) && \ @@ -53,16 +49,18 @@ #define HToBE32(X) BSwap32(X) #endif -// clang-3.3 and gcc-4.3 have builtin functions for swap32/swap64 -#if LOCAL_GCC_PREREQ(4, 3) || LOCAL_CLANG_PREREQ(3, 3) -#define HAVE_BUILTIN_BSWAP32 -#define HAVE_BUILTIN_BSWAP64 -#endif -// clang-3.3 and gcc-4.8 have a builtin function for swap16 -#if LOCAL_GCC_PREREQ(4, 8) || LOCAL_CLANG_PREREQ(3, 3) +#if LOCAL_GCC_PREREQ(4, 8) || __has_builtin(__builtin_bswap16) #define HAVE_BUILTIN_BSWAP16 #endif +#if LOCAL_GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap32) +#define HAVE_BUILTIN_BSWAP32 +#endif + +#if LOCAL_GCC_PREREQ(4, 3) || __has_builtin(__builtin_bswap64) +#define HAVE_BUILTIN_BSWAP64 +#endif + #if HAVE_MIPS32 && defined(__mips__) && !defined(__mips64) && \ defined(__mips_isa_rev) && (__mips_isa_rev >= 2) && (__mips_isa_rev < 6) #define VPX_USE_MIPS32_R2