blob: ddfbcc124e77ac2b1a5d7aea1640ccbc4577a331 [file] [log] [blame]
#ifndef FIO_COMPILER_H
#define FIO_COMPILER_H
/* IWYU pragma: begin_exports */
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
#include "compiler-gcc4.h"
#else
#error Compiler too old, need at least gcc 4.1.0
#endif
/* IWYU pragma: end_exports */
#ifndef __must_check
#define __must_check
#endif
/*
* 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 ARRAY_SIZE(x) (sizeof((x)) / (sizeof((x)[0])))
#define FIELD_SIZE(s, f) (sizeof(((__typeof__(s))0)->f))
#endif
#endif