X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=compiler%2Fcompiler.h;h=3fd0822f3b77bca92a99472ebbc9fbd1fb241df0;hb=31e65735b99dcc7288fe2ede9dc647f53fe8d6b2;hp=33500a9b02a53c4259c307d69fff96d8c7369646;hpb=9b8365618309572d8fd2579c8ea3132db89f843f;p=fio.git diff --git a/compiler/compiler.h b/compiler/compiler.h index 33500a9b..3fd0822f 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -1,26 +1,80 @@ #ifndef FIO_COMPILER_H #define FIO_COMPILER_H -#if __GNUC__ >= 4 -#include "compiler-gcc4.h" -#elif __GNUC__ == 3 -#include "compiler-gcc3.h" -#else -#error Compiler too old, need gcc at least gcc 3.x +#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 __must_check -#define __must_check +#ifndef __compiletime_error_fallback +#define __compiletime_error_fallback(condition) do { } while (0) #endif -#define uninitialized_var(x) x = x +#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__) -#ifndef __weak -#ifndef __CYGWIN__ -#define __weak __attribute__((weak)) #else -#define __weak + +#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 fallthrough __attribute__((__fallthrough__)) +#else +#define fallthrough do {} while (0) /* fallthrough */ #endif #endif