*
* \brief Additional support macros for compiler independance
*
- * \version $Id$
* \author Bernie Innocenti <bernie@codewiz.org>
*/
#define PP_STRINGIZE__(x) #x
+/**
+ */
+#if COMPILER_C99
+ #define COUNT_PARMS2(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
+ #define COUNT_PARMS(...) \
+ COUNT_PARMS2(11 , ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+ /**
+ * usage:
+ * \code
+ * #define foo_init(...) PP_CAT(foo_init_, COUNT_PARMS(__VA_ARGS__)) (__VA_ARGS__)
+ * \endcode
+ */
+
+#else
+ #define COUNT_PARMS2(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _
+ #define COUNT_PARMS(args...) \
+ COUNT_PARMS2(11 , ## args, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+ /**
+ * usage:
+ * \code
+ * #define foo_init(args...) PP_CAT(foo_init_, COUNT_PARMS(args)) (args)
+ * \endcode
+ */
+
+#endif
+
#if defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__)
#pragma language=extended
#define UNUSED_VAR(type,name) __attribute__((__unused__)) type name
#define USED_VAR(type,name) __attribute__((__used__)) type name
#define INLINE static inline __attribute__((__always_inline__))
+ #define NOINLINE __attribute__((noinline))
#define LIKELY(x) __builtin_expect(!!(x), 1)
#define UNLIKELY(x) __builtin_expect(!!(x), 0)
#define PURE_FUNC __attribute__((pure))
#define RESTRICT __restrict__
#define MUST_CHECK __attribute__((warn_unused_result))
#define PACKED __attribute__((packed))
+ #if CPU_ARM | CPU_CM3
+ #define NAKED __attribute__((naked))
+ #else
+ #define NAKED
+ #endif
+
/**
* Force compiler to realod context variable.
*/
#define DEPRECATED __attribute__((__deprecated__))
#endif
+ #if GNUC_PREREQ(4,5)
+ #define UNREACHABLE() __builtin_unreachable()
+ #endif
+
#ifndef __cplusplus
#define ASSERT_TYPE_EQUAL(var1, var2) \
STATIC_ASSERT(__builtin_types_compatible_p(typeof(var1), typeof(var2)))
#ifndef INLINE
#define INLINE static inline
#endif
+#ifndef NOINLINE
+#define NOINLINE /* nothing */
+#endif
#ifndef NORETURN
#define NORETURN /* nothing */
#endif
#define MEMORY_BARRIER /* nothing */
#warning No memory barrier defined for select compiler. If you use the kernel check it.
#endif
+#ifndef UNREACHABLE
+#define UNREACHABLE() for (;;)
+#endif
/* Misc definitions */
typedef unsigned char sigbit_t; /**< Type for signal bits. */
typedef unsigned char sigmask_t; /**< Type for signal masks. */
-typedef unsigned char page_t; /**< Type for banked memory pages. */
/**
#if CPU_X86
/* 32bit or 64bit (32bit for _WIN64). */
typedef long ssize_t;
- #elif CPU_ARM
+ #elif CPU_ARM || CPU_CM3
typedef int ssize_t;
#elif CPU_AVR
/* 16bit (missing in avr-libc's sys/types.h). */