1 #ifndef FIO_COMPILER_H 2 #define FIO_COMPILER_H 3 4 #if __GNUC__ >= 4 5 #include "compiler-gcc4.h" 6 #elif __GNUC__ == 3 7 #include "compiler-gcc3.h" 8 #else 9 #error Compiler too old, need gcc at least gcc 3.x 10 #endif 11 12 #ifndef __must_check 13 #define __must_check 14 #endif 15 16 /* 17 * Mark unused variables passed to ops functions as unused, to silence gcc 18 */ 19 #define fio_unused __attribute__((__unused__)) 20 #define fio_init __attribute__((constructor)) 21 #define fio_exit __attribute__((destructor)) 22 23 #define fio_unlikely(x) __builtin_expect(!!(x), 0) 24 25 /* 26 * Check at compile time that something is of a particular type. 27 * Always evaluates to 1 so you may use it easily in comparisons. 28 */ 29 #define typecheck(type,x) \ 30 ({ type __dummy; \ 31 typeof(x) __dummy2; \ 32 (void)(&__dummy == &__dummy2); \ 33 1; \ 34 }) 35 36 #ifndef __compiletime_error 37 #define __compiletime_error(message) 38 #endif 39 #ifndef __compiletime_error_fallback 40 #define __compiletime_error_fallback(condition) do { } while (0) 41 #endif 42 43 #define __compiletime_assert(condition, msg, prefix, suffix) \ 44 do { \ 45 int __cond = !(condition); \ 46 extern void prefix ## suffix(void) __compiletime_error(msg); \ 47 if (__cond) \ 48 prefix ## suffix(); \ 49 __compiletime_error_fallback(__cond); \ 50 } while (0) 51 52 #define _compiletime_assert(condition, msg, prefix, suffix) \ 53 __compiletime_assert(condition, msg, prefix, suffix) 54 55 #define compiletime_assert(condition, msg) \ 56 _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__) 57 58 #endif 59