blob: 40e857c004c6e4304565ad1e446b4bffaf90eb35 [file] [log] [blame]
Jens Axboe4fee8092007-03-29 09:33:03 +02001#ifndef FIO_COMPILER_H
2#define FIO_COMPILER_H
3
4#if __GNUC__ >= 4
5#include "compiler-gcc4.h"
Jens Axboe73e07ac2007-03-29 09:33:46 +02006#elif __GNUC__ == 3
Jens Axboe4fee8092007-03-29 09:33:03 +02007#include "compiler-gcc3.h"
8#else
9#error Compiler too old, need gcc at least gcc 3.x
10#endif
11
Jens Axboe993cca02007-03-29 09:35:35 +020012#ifndef __must_check
13#define __must_check
14#endif
15
Jens Axboe7b4203d2013-04-17 19:29:37 +020016/*
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
Jens Axboe225ba9e2014-02-26 14:31:15 -080023#define fio_unlikely(x) __builtin_expect(!!(x), 0)
24
Jens Axboe6cac1b62014-07-01 08:46:44 -060025/*
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
Jens Axboe3d225d02014-10-20 10:51:24 -060036#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
Jens Axboe4fee8092007-03-29 09:33:03 +020058#endif