1 #ifndef FIO_COMPILER_H
2 #define FIO_COMPILER_H
3 
4 #define __must_check		__attribute__((warn_unused_result))
5 
6 #define __compiletime_warning(message)	__attribute__((warning(message)))
7 #define __compiletime_error(message)	__attribute__((error(message)))
8 
9 /*
10  * Mark unused variables passed to ops functions as unused, to silence gcc
11  */
12 #define fio_unused	__attribute__((__unused__))
13 #define fio_init	__attribute__((constructor))
14 #define fio_exit	__attribute__((destructor))
15 
16 #define fio_unlikely(x)	__builtin_expect(!!(x), 0)
17 
18 /*
19  * Check at compile time that something is of a particular type.
20  * Always evaluates to 1 so you may use it easily in comparisons.
21  */
22 #define typecheck(type,x) \
23 ({	type __dummy; \
24 	__typeof__(x) __dummy2; \
25 	(void)(&__dummy == &__dummy2); \
26 	1; \
27 })
28 
29 
30 #if defined(CONFIG_STATIC_ASSERT)
31 #define compiletime_assert(condition, msg) _Static_assert(condition, msg)
32 
33 #elif !defined(CONFIG_DISABLE_OPTIMIZATIONS)
34 
35 #ifndef __compiletime_error
36 #define __compiletime_error(message)
37 #endif
38 
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 #else
59 
60 #define compiletime_assert(condition, msg)	do { } while (0)
61 
62 #endif
63 
64 #ifdef FIO_INTERNAL
65 #define FIO_ARRAY_SIZE(x)    (sizeof((x)) / (sizeof((x)[0])))
66 #define FIO_FIELD_SIZE(s, f) (sizeof(((__typeof__(s))0)->f))
67 #endif
68 
69 #ifndef __has_attribute
70 #define __GCC4_has_attribute___fallthrough__	0
71 #endif
72 
73 #if __has_attribute(__fallthrough__)
74 #define fallthrough	 __attribute__((__fallthrough__))
75 #else
76 #define fallthrough	do {} while (0)  /* fallthrough */
77 #endif
78 
79 #endif
80