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