eina: Fix compilation with clang
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 5 Oct 2016 07:27:46 +0000 (16:27 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 5 Oct 2016 10:40:50 +0000 (19:40 +0900)
It's not because the bug with __builtin_prefetch is inside
clang/llvm that we must break the build for people who prefer it
over gcc. As soon as a non-broken version is out, the ifdef must
be either removed (and ask people to update their clang install)
or add a version check based on __clang_xxx__.

Compilation tested with clang 3.8.1 and gcc 6.2.1.

src/lib/eina/eina_types.h

index 139dafa..fc01c69 100644 (file)
 #  define EINA_UNLIKELY(exp)    __builtin_expect((exp), 0)
 #  define EINA_LIKELY(exp)      __builtin_expect((exp), 1)
 #  define EINA_SENTINEL __attribute__((__sentinel__))
-#  define EINA_PREFETCH(arg) __builtin_prefetch(arg)
-#  define EINA_PREFETCH_WRITE(arg) __builtin_prefetch(arg, 1)
-#  define EINA_PREFETCH_NOCACHE(arg) __builtin_prefetch(arg, 0, 0)
-#  define EINA_PREFETCH_NOCACHE_WRITE(arg) __builtin_prefetch(arg, 1, 0)
+#  ifndef __clang__
+#   define EINA_PREFETCH(arg) __builtin_prefetch(arg)
+#   define EINA_PREFETCH_WRITE(arg) __builtin_prefetch(arg, 1)
+#   define EINA_PREFETCH_NOCACHE(arg) __builtin_prefetch(arg, 0, 0)
+#   define EINA_PREFETCH_NOCACHE_WRITE(arg) __builtin_prefetch(arg, 1, 0)
+#  else
+/* LLVM Clang workaround (crash on compilation) */
+#   define EINA_PREFETCH(arg) ((void) (arg))
+#   define EINA_PREFETCH_WRITE(arg) ((void) (arg))
+#   define EINA_PREFETCH_NOCACHE(arg) ((void) (arg))
+#   define EINA_PREFETCH_NOCACHE_WRITE(arg) ((void) (arg))
+#  endif
 # else
 #  define EINA_PRINTF(fmt, arg)
 #  define EINA_SCANF(fmt, arg)
 #  define EINA_UNLIKELY(exp) exp
 #  define EINA_LIKELY(exp)   exp
 #  define EINA_SENTINEL
-#  define EINA_PREFETCH(arg)
-#  define EINA_PREFETCH_WRITE(arg)
-#  define EINA_PREFETCH_NOCACHE(arg)
-#  define EINA_PREFETCH_NOCACHE_WRITE(arg)
+#  define EINA_PREFETCH(arg) ((void) (arg))
+#  define EINA_PREFETCH_WRITE(arg) ((void) (arg))
+#  define EINA_PREFETCH_NOCACHE(arg) ((void) (arg))
+#  define EINA_PREFETCH_NOCACHE_WRITE(arg) ((void) (arg))
 # endif
 
 #elif defined(_MSC_VER)
 # define EINA_UNLIKELY(exp) exp
 # define EINA_LIKELY(exp)   exp
 # define EINA_SENTINEL
-# define EINA_PREFETCH(arg)
-# define EINA_PREFETCH_WRITE(arg)
-# define EINA_PREFETCH_NOCACHE(arg)
-# define EINA_PREFETCH_NOCACHE_WRITE(arg)
+# define EINA_PREFETCH(arg) ((void) (arg))
+# define EINA_PREFETCH_WRITE(arg) ((void) (arg))
+# define EINA_PREFETCH_NOCACHE(arg) ((void) (arg))
+# define EINA_PREFETCH_NOCACHE_WRITE(arg) ((void) (arg))
 
 #elif defined(__SUNPRO_C)
 # define EINA_UNUSED
 # define EINA_UNLIKELY(exp) exp
 # define EINA_LIKELY(exp)   exp
 # define EINA_SENTINEL
-# define EINA_PREFETCH(arg)
-# define EINA_PREFETCH_WRITE(arg)
-# define EINA_PREFETCH_NOCACHE(arg)
-# define EINA_PREFETCH_NOCACHE_WRITE(arg)
+# define EINA_PREFETCH(arg) ((void) (arg))
+# define EINA_PREFETCH_WRITE(arg) ((void) (arg))
+# define EINA_PREFETCH_NOCACHE(arg) ((void) (arg))
+# define EINA_PREFETCH_NOCACHE_WRITE(arg) ((void) (arg))
 
 #else /* ! __GNUC__ && ! _MSC_VER && ! __SUNPRO_C */