X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=compiler%2Fcompiler.h;h=a6a74322549fc66f3210dc9b52406d1fd43a5475;hb=6c8200b5da36d53d477b33b5a16a7b2dbd253b6b;hp=0a0213b60fca5204cb9d0294ffb01139baa23083;hpb=225ba9e3433cf27d8ff7b213d9f78b7ef2776c70;p=fio.git diff --git a/compiler/compiler.h b/compiler/compiler.h index 0a0213b6..a6a74322 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -1,5 +1,6 @@ #ifndef FIO_COMPILER_H #define FIO_COMPILER_H +#include #if __GNUC__ >= 4 #include "compiler-gcc4.h" @@ -22,4 +23,44 @@ #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) + +#else +#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__) + +#endif + #endif