#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)))
#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 */
#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). */
*/
#define countof(a) (sizeof(a) / sizeof(*(a)))
#endif
+#ifndef alignof
+ /**
+ * Return the alignment in memory of a generic data type.
+ *
+ * \note We need to worry about alignment when allocating memory that
+ * will be used later by unknown objects (e.g., malloc()) or, more
+ * generally, whenever creating generic container types.
+ */
+ #define alignof(type) offsetof(struct { char c; type member; }, member)
+#endif
/**
* Cast a member of a structure out to the containing structure.
*/
#if COMPILER_TYPEOF && COMPILER_STATEMENT_EXPRESSIONS
#define containerof(ptr, type, member) ({ \
- const typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \
- (type *)((char *)_mptr - offsetof(type, member)); \
+ typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \
+ (type *)(void *)((char *)_mptr - offsetof(type, member)); \
})
#else
#define containerof(ptr, type, member) \
- ( (type *)((char *)(ptr) - offsetof(type, member)) )
+ ( (type *)(void *)((char *)(ptr) - offsetof(type, member)) )
#endif
/** Issue a compilation error if the \a condition is false */