[vlc-commits] Introduce VLC_GCC_VERSION macro, fix popcount and clz

Rémi Denis-Courmont git at videolan.org
Wed Aug 17 17:31:38 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Aug 17 18:28:25 2011 +0300| [9fd4a6a6ba45023d54cd2573e0842170fdfc1d94] | committer: Rémi Denis-Courmont

Introduce VLC_GCC_VERSION macro, fix popcount and clz

This can be used as follows:

 #if VLC_GCC_VERSION(major,minor)
 ...
 #endif

There is nothing "VLC" about it. The prefix is only about namespacing.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9fd4a6a6ba45023d54cd2573e0842170fdfc1d94
---

 include/vlc_common.h  |   67 +++++++++++++++++++++++++++---------------------
 include/vlc_plugin.h  |    2 +-
 include/vlc_threads.h |    3 +-
 3 files changed, 40 insertions(+), 32 deletions(-)

diff --git a/include/vlc_common.h b/include/vlc_common.h
index cb0ce94..0c7966f 100644
--- a/include/vlc_common.h
+++ b/include/vlc_common.h
@@ -56,6 +56,14 @@
 # include <stdbool.h>
 #endif
 
+/* Helper for GCC version checks */
+#ifdef __GNUC__
+# define VLC_GCC_VERSION(maj,min) \
+    ((__GNUC__ > (maj)) || (__GNUC__ == (maj) && __GNUC_MINOR__ >= (min)))
+#else
+# define VLC_GCC_VERSION(maj,min) (0)
+#endif
+
 /* Try to fix format strings for all versions of mingw and mingw64 */
 #if defined( _WIN32 ) && defined( __USE_MINGW_ANSI_STDIO )
  #undef PRId64
@@ -72,27 +80,34 @@
  #define vsnprintf       __mingw_vsnprintf
 #endif
 
-/* Format string sanity checks */
+/* Function attributes for compiler warnings */
 #ifdef __GNUC__
-#   if defined( _WIN32 ) && (__GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 4 ) )
-#     define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y)))
-#   else
-#     define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
-#   endif
-#   define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x)))
-#   if __GNUC__ > 3 || (__GNUC__ == 3 && (__GNUC_MINOR__ >= 4))
-#     define VLC_USED __attribute__ ((warn_unused_result))
-#   else
-#     define VLC_USED
-#   endif
-#   define VLC_MALLOC __attribute__ ((malloc))
+# define VLC_DEPRECATED __attribute__((deprecated))
+
+# if defined( _WIN32 ) && VLC_GCC_VERSION(4,4)
+#  define VLC_FORMAT(x,y) __attribute__ ((format(gnu_printf,x,y)))
+# else
+#  define VLC_FORMAT(x,y) __attribute__ ((format(printf,x,y)))
+# endif
+# define VLC_FORMAT_ARG(x) __attribute__ ((format_arg(x)))
+
+# define VLC_MALLOC __attribute__ ((malloc))
+
+# if VLC_GCC_VERSION(3,4)
+#  define VLC_USED __attribute__ ((warn_unused_result))
+# else
+#  define VLC_USED
+# endif
+
 #else
-#   define VLC_FORMAT(x,y)
-#   define VLC_FORMAT_ARG(x)
-#   define VLC_USED
-#   define VLC_MALLOC
+# define VLC_DEPRECATED
+# define VLC_FORMAT(x,y)
+# define VLC_FORMAT_ARG(x)
+# define VLC_MALLOC
+# define VLC_USED
 #endif
 
+
 /* Branch prediction */
 #ifdef __GNUC__
 #   define likely(p)   __builtin_expect(!!(p), 1)
@@ -102,12 +117,6 @@
 #   define unlikely(p) (!!(p))
 #endif
 
-#if defined(__GNUC__) && !defined __cplusplus
-# define VLC_DEPRECATED __attribute__((deprecated))
-#else
-# define VLC_DEPRECATED
-#endif
-
 /* Linkage */
 #ifdef __cplusplus
 # define VLC_EXTERN extern "C"
@@ -117,7 +126,7 @@
 
 #if defined (WIN32) && defined (DLL_EXPORT)
 # define VLC_EXPORT __declspec(dllexport)
-#elif defined (__GNUC__) && (__GNUC__ >= 4)
+#elif VLC_GCC_VERSION(4,0)
 # define VLC_EXPORT __attribute__((visibility("default")))
 #else
 # define VLC_EXPORT
@@ -505,7 +514,7 @@ typedef union
 /**@}*/                                                                     \
 
 /* VLC_OBJECT: attempt at doing a clever cast */
-#if defined( __GNUC__ ) && __GNUC__ > 3
+#if VLC_GCC_VERSION(4,0)
 # ifndef __cplusplus
 #  define VLC_OBJECT( x ) \
     __builtin_choose_expr( \
@@ -579,11 +588,11 @@ static inline uint8_t clip_uint8_vlc( int32_t a )
     else           return a;
 }
 
-/* Count leading zeroes */
+/** Count leading zeroes */
 VLC_USED
 static inline unsigned clz (unsigned x)
 {
-#ifdef __GNUC_
+#if VLC_GCC_VERSION(3,4)
     return __builtin_clz (x);
 #else
     unsigned i = sizeof (x) * 8;
@@ -602,11 +611,11 @@ static inline unsigned clz (unsigned x)
 /* XXX: this assumes that int is 32-bits or more */
 #define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8))
 
-/* Bit weight */
+/** Bit weight */
 VLC_USED
 static inline unsigned popcount (unsigned x)
 {
-#ifdef __GNUC_
+#if VLC_GCC_VERSION(3,4)
     return __builtin_popcount (x);
 #else
     unsigned count = 0;
diff --git a/include/vlc_plugin.h b/include/vlc_plugin.h
index e88702d..8a6a70b 100644
--- a/include/vlc_plugin.h
+++ b/include/vlc_plugin.h
@@ -138,7 +138,7 @@ enum vlc_module_properties
 #   define DLL_SYMBOL              __declspec(dllexport)
 #   undef CDECL_SYMBOL
 #   define CDECL_SYMBOL            __cdecl
-# elif defined (__GNUC__) && (__GNUC__ >= 4)
+# elif VLC_GCC_VERSION(4,0)
 #   define DLL_SYMBOL              __attribute__((visibility("default")))
 # else
 #  define DLL_SYMBOL
diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 8b02e7c..f7a91a8 100644
--- a/include/vlc_threads.h
+++ b/include/vlc_threads.h
@@ -207,8 +207,7 @@ VLC_API void msleep(mtime_t delay);
 #define VLC_HARD_MIN_SLEEP   10000 /* 10 milliseconds = 1 tick at 100Hz */
 #define VLC_SOFT_MIN_SLEEP 9000000 /* 9 seconds */
 
-#if defined (__GNUC__) \
- && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+#if VLC_GCC_VERSION(4,3)
 /* Linux has 100, 250, 300 or 1000Hz
  *
  * HZ=100 by default on FreeBSD, but some architectures use a 1000Hz timer



More information about the vlc-commits mailing list