Add some build assert macros
[fio.git] / compiler / compiler.h
index 0a08bb12a238703ed252b62c451beac6406f695e..40e857c004c6e4304565ad1e446b4bffaf90eb35 100644 (file)
 #define __must_check
 #endif
 
-#define uninitialized_var(x) x = x
+/*
+ * Mark unused variables passed to ops functions as unused, to silence gcc
+ */
+#define fio_unused     __attribute__((__unused__))
+#define fio_init       __attribute__((constructor))
+#define fio_exit       __attribute__((destructor))
 
-#define __weak __attribute__((weak))
+#define fio_unlikely(x)        __builtin_expect(!!(x), 0)
+
+/*
+ * Check at compile time that something is of a particular type.
+ * Always evaluates to 1 so you may use it easily in comparisons.
+ */
+#define typecheck(type,x) \
+({     type __dummy; \
+       typeof(x) __dummy2; \
+       (void)(&__dummy == &__dummy2); \
+       1; \
+})
+
+#ifndef __compiletime_error
+#define __compiletime_error(message)
+#endif
+#ifndef __compiletime_error_fallback
+#define __compiletime_error_fallback(condition)        do { } while (0)
+#endif
+
+#define __compiletime_assert(condition, msg, prefix, suffix)           \
+       do {                                                            \
+               int __cond = !(condition);                              \
+               extern void prefix ## suffix(void) __compiletime_error(msg); \
+               if (__cond)                                             \
+                       prefix ## suffix();                             \
+               __compiletime_error_fallback(__cond);                   \
+       } while (0)
+
+#define _compiletime_assert(condition, msg, prefix, suffix) \
+       __compiletime_assert(condition, msg, prefix, suffix)
+
+#define compiletime_assert(condition, msg) \
+       _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
 
 #endif