aboutsummaryrefslogtreecommitdiffstats
path: root/src/gcc.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/gcc.h196
1 files changed, 129 insertions, 67 deletions
diff --git a/src/gcc.h b/src/gcc.h
index c0796b0fb..2946eae0d 100644
--- a/src/gcc.h
+++ b/src/gcc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2003-2011 The Music Player Daemon Project
+ * Copyright (C) 2003-2013 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
@@ -21,92 +21,154 @@
#define MPD_GCC_H
#define GCC_CHECK_VERSION(major, minor) \
- (defined(__GNUC__) && \
- (__GNUC__ > (major) || \
- (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))))
+ (defined(__GNUC__) && \
+ (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))))
-/* this allows us to take advantage of special gcc features while still
- * allowing other compilers to compile:
- *
- * example taken from: http://rlove.org/log/2005102601
- */
+#ifdef __GNUC__
+#define GCC_VERSION (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+#else
+#define GCC_VERSION 0
+#endif
+
+#ifdef __clang__
+# define CLANG_VERSION (__clang_major__ * 10000 \
+ + __clang_minor__ * 100 \
+ + __clang_patchlevel__)
+# if __clang_major__ < 3
+# error Sorry, your clang version is too old. You need at least version 3.1.
+# endif
+#elif defined(__GNUC__)
+# if !GCC_CHECK_VERSION(4,6)
+# error Sorry, your gcc version is too old. You need at least version 4.6.
+# endif
+#else
+# warning Untested compiler. Use at your own risk!
+#endif
+
+#if GCC_CHECK_VERSION(4,0)
+
+/* GCC 4.x */
+
+#define gcc_const __attribute__((const))
+#define gcc_deprecated __attribute__((deprecated))
+#define gcc_may_alias __attribute__((may_alias))
+#define gcc_malloc __attribute__((malloc))
+#define gcc_noreturn __attribute__((noreturn))
+#define gcc_packed __attribute__((packed))
+#define gcc_printf(a,b) __attribute__((format(printf, a, b)))
+#define gcc_pure __attribute__((pure))
+#define gcc_sentinel __attribute__((sentinel))
+#define gcc_unused __attribute__((unused))
+#define gcc_warn_unused_result __attribute__((warn_unused_result))
+
+#define gcc_nonnull(...) __attribute__((nonnull(__VA_ARGS__)))
+#define gcc_nonnull_all __attribute__((nonnull))
+
+#define gcc_likely(x) __builtin_expect (!!(x), 1)
+#define gcc_unlikely(x) __builtin_expect (!!(x), 0)
-#if GCC_CHECK_VERSION(3,0)
-# define gcc_const __attribute__((const))
-# define gcc_pure __attribute__((pure))
-# define gcc_malloc __attribute__((malloc))
-# define gcc_noreturn __attribute__((noreturn))
-# define gcc_must_check __attribute__ ((warn_unused_result))
-# define gcc_packed __attribute__ ((packed))
-/* these are very useful for type checking */
-# define gcc_printf __attribute__ ((format(printf,1,2)))
-# define gcc_fprintf __attribute__ ((format(printf,2,3)))
-# define gcc_fprintf_ __attribute__ ((format(printf,3,4)))
-# define gcc_fprintf__ __attribute__ ((format(printf,4,5)))
-# define gcc_scanf __attribute__ ((format(scanf,1,2)))
-# define gcc_used __attribute__ ((used))
-# define gcc_unused __attribute__((unused))
-# define gcc_warn_unused_result __attribute__((warn_unused_result))
-/* # define inline inline __attribute__ ((always_inline)) */
-# define gcc_noinline __attribute__ ((noinline))
-# define gcc_nonnull(...) __attribute__((nonnull(__VA_ARGS__)))
-# define gcc_nonnull_all __attribute__((nonnull))
-
-# define gcc_likely(x) __builtin_expect (!!(x), 1)
-# define gcc_unlikely(x) __builtin_expect (!!(x), 0)
+#define gcc_aligned(n) __attribute__((aligned(n)))
+
+#define gcc_visibility_hidden __attribute__((visibility("hidden")))
+#define gcc_visibility_default __attribute__((visibility("default")))
+
+#define gcc_always_inline __attribute__((always_inline))
#else
-# define gcc_unused
-# define gcc_const
-# define gcc_pure
-# define gcc_malloc
-# define gcc_noreturn
-# define gcc_must_check
-# define gcc_packed
-# define gcc_printf
-# define gcc_fprintf
-# define gcc_fprintf_
-# define gcc_fprintf__
-# define gcc_scanf
-# define gcc_used
-# define gcc_unused
-# define gcc_warn_unused_result
-/* # define inline */
-# define gcc_noinline
-# define gcc_nonnull(...)
-# define gcc_nonnull_all
-
-# define gcc_likely(x) (x)
-# define gcc_unlikely(x) (x)
+
+/* generic C compiler */
+
+#define gcc_const
+#define gcc_deprecated
+#define gcc_may_alias
+#define gcc_malloc
+#define gcc_noreturn
+#define gcc_packed
+#define gcc_printf(a,b)
+#define gcc_pure
+#define gcc_sentinel
+#define gcc_unused
+#define gcc_warn_unused_result
+
+#define gcc_nonnull(...)
+#define gcc_nonnull_all
+
+#define gcc_likely(x) (x)
+#define gcc_unlikely(x) (x)
+
+#define gcc_aligned(n)
+
+#define gcc_visibility_hidden
+#define gcc_visibility_default
+
+#define gcc_always_inline inline
#endif
-#if defined(__GNUC__) || defined(__clang__)
-#define gcc_unreachable() __builtin_unreachable()
+#if GCC_CHECK_VERSION(4,3)
+
+#define gcc_hot __attribute__((hot))
+#define gcc_cold __attribute__((cold))
+
+#else /* ! GCC_UNUSED >= 40300 */
+
+#define gcc_hot
+#define gcc_cold
+
+#endif /* ! GCC_UNUSED >= 40300 */
+
+#if GCC_CHECK_VERSION(4,6) && !defined(__clang__)
+#define gcc_flatten __attribute__((flatten))
#else
-#define gcc_unreachable()
+#define gcc_flatten
#endif
-#ifdef __cplusplus
-
-#ifdef __GNUC__
+#ifndef __cplusplus
+/* plain C99 has "restrict" */
+#define gcc_restrict restrict
+#elif GCC_CHECK_VERSION(4,0)
/* "__restrict__" is a GCC extension for C++ */
-#define restrict __restrict__
+#define gcc_restrict __restrict__
#else
/* disable it on other compilers */
-#define restrict
+#define gcc_restrict
#endif
-#if !defined(__clang__) && defined(__GNUC__) && !GCC_CHECK_VERSION(4,6)
-#error Your gcc version is too old. MPD requires gcc 4.6 or newer.
-#endif
+/* C++11 features */
+
+#if defined(__cplusplus)
/* support for C++11 "override" was added in gcc 4.7 */
-#if !defined(__clang__) && defined(__GNUC__) && !GCC_CHECK_VERSION(4,7)
+#if !defined(__clang__) && !GCC_CHECK_VERSION(4,7)
#define override
#define final
#endif
+#if defined(__clang__) || GCC_CHECK_VERSION(4,8)
+#define gcc_alignas(T, fallback) alignas(T)
+#else
+#define gcc_alignas(T, fallback) gcc_aligned(fallback)
+#endif
+
#endif
-#endif /* MPD_GCC_H */
+#ifndef __has_feature
+ // define dummy macro for non-clang compilers
+ #define __has_feature(x) 0
+#endif
+
+#if __has_feature(attribute_unused_on_fields)
+#define gcc_unused_field gcc_unused
+#else
+#define gcc_unused_field
+#endif
+
+#if defined(__GNUC__) || defined(__clang__)
+#define gcc_unreachable() __builtin_unreachable()
+#else
+#define gcc_unreachable()
+#endif
+
+#endif