123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- diff -Nur linux-e7c8afc1dda7b7c18596d90ad6a17ae886650b72.orig/include/linux/compiler-gcc.h linux-e7c8afc1dda7b7c18596d90ad6a17ae886650b72/include/linux/compiler-gcc.h
- @@ -6,6 +6,10 @@
- * Common definitions for all gcc versions go here.
- */
-
- +#define GCC_VERSION (__GNUC__ * 10000 \
- + + __GNUC_MINOR__ * 100 \
- + + __GNUC_PATCHLEVEL__)
- +
-
- /* Optimization barrier */
- /* The "volatile" is due to gcc bugs */
- @@ -81,7 +85,164 @@
- #define __maybe_unused __attribute__((unused))
- #define __always_unused __attribute__((unused))
-
- -#define __gcc_header(x) #x
- -#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
- -#define gcc_header(x) _gcc_header(x)
- -#include gcc_header(__GNUC__)
- +/* gcc version specific checks */
- +
- +#if GCC_VERSION < 30200
- +# error Sorry, your compiler is too old - please upgrade it.
- +#endif
- +
- +#if GCC_VERSION < 30300
- +# define __used __attribute__((__unused__))
- +#else
- +# define __used __attribute__((__used__))
- +#endif
- +
- +#ifdef CONFIG_GCOV_KERNEL
- +# if GCC_VERSION < 30400
- +# error "GCOV profiling support for gcc versions below 3.4 not included"
- +# endif /* __GNUC_MINOR__ */
- +#endif /* CONFIG_GCOV_KERNEL */
- +
- +#if GCC_VERSION >= 30400
- +#define __must_check __attribute__((warn_unused_result))
- +#endif
- +
- +#if GCC_VERSION >= 40000
- +
- +/* GCC 4.1.[01] miscompiles __weak */
- +#ifdef __KERNEL__
- +# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
- +# error Your version of gcc miscompiles the __weak directive
- +# endif
- +#endif
- +
- +#define __used __attribute__((__used__))
- +#define __compiler_offsetof(a, b) \
- + __builtin_offsetof(a, b)
- +
- +#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
- +# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
- +#endif
- +
- +#if GCC_VERSION >= 40300
- +/* Mark functions as cold. gcc will assume any path leading to a call
- + * to them will be unlikely. This means a lot of manual unlikely()s
- + * are unnecessary now for any paths leading to the usual suspects
- + * like BUG(), printk(), panic() etc. [but let's keep them for now for
- + * older compilers]
- + *
- + * Early snapshots of gcc 4.3 don't support this and we can't detect this
- + * in the preprocessor, but we can live with this because they're unreleased.
- + * Maketime probing would be overkill here.
- + *
- + * gcc also has a __attribute__((__hot__)) to move hot functions into
- + * a special section, but I don't see any sense in this right now in
- + * the kernel context
- + */
- +#define __cold __attribute__((__cold__))
- +
- +#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
- +
- +#ifndef __CHECKER__
- +# define __compiletime_warning(message) __attribute__((warning(message)))
- +# define __compiletime_error(message) __attribute__((error(message)))
- +#endif /* __CHECKER__ */
- +#endif /* GCC_VERSION >= 40300 */
- +
- +#if GCC_VERSION >= 40500
- +/*
- + * Mark a position in code as unreachable. This can be used to
- + * suppress control flow warnings after asm blocks that transfer
- + * control elsewhere.
- + *
- + * Early snapshots of gcc 4.5 don't support this and we can't detect
- + * this in the preprocessor, but we can live with this because they're
- + * unreleased. Really, we need to have autoconf for the kernel.
- + */
- +#define unreachable() __builtin_unreachable()
- +
- +/* Mark a function definition as prohibited from being cloned. */
- +#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
- +
- +#endif /* GCC_VERSION >= 40500 */
- +
- +#if GCC_VERSION >= 40600
- +/*
- + * When used with Link Time Optimization, gcc can optimize away C functions or
- + * variables which are referenced only from assembly code. __visible tells the
- + * optimizer that something else uses this function or variable, thus preventing
- + * this.
- + */
- +#define __visible __attribute__((externally_visible))
- +#endif
- +
- +
- +#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
- +/*
- + * __assume_aligned(n, k): Tell the optimizer that the returned
- + * pointer can be assumed to be k modulo n. The second argument is
- + * optional (default 0), so we use a variadic macro to make the
- + * shorthand.
- + *
- + * Beware: Do not apply this to functions which may return
- + * ERR_PTRs. Also, it is probably unwise to apply it to functions
- + * returning extra information in the low bits (but in that case the
- + * compiler should see some alignment anyway, when the return value is
- + * massaged by 'flags = ptr & 3; ptr &= ~3;').
- + */
- +#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
- +#endif
- +
- +/*
- + * GCC 'asm goto' miscompiles certain code sequences:
- + *
- + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
- + *
- + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
- + *
- + * (asm goto is automatically volatile - the naming reflects this.)
- + */
- +#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
- +
- +#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
- +#if GCC_VERSION >= 40400
- +#define __HAVE_BUILTIN_BSWAP32__
- +#define __HAVE_BUILTIN_BSWAP64__
- +#endif
- +#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
- +#define __HAVE_BUILTIN_BSWAP16__
- +#endif
- +#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
- +
- +#if GCC_VERSION >= 70000
- +#define KASAN_ABI_VERSION 5
- +#elif GCC_VERSION >= 50000
- +#define KASAN_ABI_VERSION 4
- +#elif GCC_VERSION >= 40902
- +#define KASAN_ABI_VERSION 3
- +#endif
- +
- +#if GCC_VERSION >= 40902
- +/*
- + * Tell the compiler that address safety instrumentation (KASAN)
- + * should not be applied to that function.
- + * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
- + */
- +#define __no_sanitize_address __attribute__((no_sanitize_address))
- +#endif
- +
- +#endif /* gcc version >= 40000 specific checks */
- +
- +#if !defined(__noclone)
- +#define __noclone /* not needed */
- +#endif
- +
- +#if !defined(__no_sanitize_address)
- +#define __no_sanitize_address
- +#endif
- +
- +/*
- + * A trick to suppress uninitialized variable warning without generating any
- + * code
- + */
- +#define uninitialized_var(x) x = x
|