1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#ifndef FIO_COMPILER_H
#define FIO_COMPILER_H
#define __must_check __attribute__((warn_unused_result))
#define __compiletime_warning(message) __attribute__((warning(message)))
#define __compiletime_error(message) __attribute__((error(message)))
/*
* 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 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
#ifdef FIO_INTERNAL
#define FIO_ARRAY_SIZE(x) (sizeof((x)) / (sizeof((x)[0])))
#define FIO_FIELD_SIZE(s, f) (sizeof(((__typeof__(s))0)->f))
#endif
#ifndef __has_attribute
#define __has_attribute(x) __GCC4_has_attribute_##x
#define __GCC4_has_attribute___fallthrough__ 0
#endif
#if __has_attribute(__fallthrough__)
#define fio_fallthrough __attribute__((__fallthrough__))
#else
#define fio_fallthrough do {} while (0) /* fallthrough */
#endif
#endif
|