configure: disable compile time asserts for !opt and !static_assert
[fio.git] / compiler / compiler.h
index 33500a9b02a53c4259c307d69fff96d8c7369646..20df21d050c3ba7941e705bf51140430dd7b237a 100644 (file)
@@ -1,5 +1,6 @@
 #ifndef FIO_COMPILER_H
 #define FIO_COMPILER_H
+#include <assert.h>
 
 #if __GNUC__ >= 4
 #include "compiler-gcc4.h"
 #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))
 
-#ifndef __weak
-#ifndef __CYGWIN__
-#define __weak __attribute__((weak))
-#else
-#define __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; \
+})
+
+
+#if defined(CONFIG_STATIC_ASSERT)
+#define compiletime_assert(condition, msg) _Static_assert(condition, msg)
+
+#elif !defined(CONFIG_DISABLE_OPTIMIZATIONS)
+
+#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__)
+
+#else
+
+#define compiletime_assert(condition, msg)     do { } while (0)
+
 #endif
 
 #endif