mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.git
				synced 2025-11-04 07:44:51 +10:00 
			
		
		
		
	include/linux/compiler*.h: make compiler-*.h mutually exclusive
Commitcafa0010cd("Raise the minimum required gcc version to 4.6") recently exposed a brittle part of the build for supporting non-gcc compilers. Both Clang and ICC define __GNUC__, __GNUC_MINOR__, and __GNUC_PATCHLEVEL__ for quick compatibility with code bases that haven't added compiler specific checks for __clang__ or __INTEL_COMPILER. This is brittle, as they happened to get compatibility by posing as a certain version of GCC. This broke when upgrading the minimal version of GCC required to build the kernel, to a version above what ICC and Clang claim to be. Rather than always including compiler-gcc.h then undefining or redefining macros in compiler-intel.h or compiler-clang.h, let's separate out the compiler specific macro definitions into mutually exclusive headers, do more proper compiler detection, and keep shared definitions in compiler_types.h. Fixes:cafa0010cd("Raise the minimum required gcc version to 4.6") Reported-by: Masahiro Yamada <yamada.masahiro@socionext.com> Suggested-by: Eli Friedman <efriedma@codeaurora.org> Suggested-by: Joe Perches <joe@perches.com> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									899fbc33fd
								
							
						
					
					
						commit
						815f0ddb34
					
				@ -38,25 +38,14 @@
 | 
			
		||||
#error Sorry, your compiler targets APCS-26 but this kernel requires APCS-32
 | 
			
		||||
#endif
 | 
			
		||||
/*
 | 
			
		||||
 * GCC 3.0, 3.1: general bad code generation.
 | 
			
		||||
 * GCC 3.2.0: incorrect function argument offset calculation.
 | 
			
		||||
 * GCC 3.2.x: miscompiles NEW_AUX_ENT in fs/binfmt_elf.c
 | 
			
		||||
 *            (http://gcc.gnu.org/PR8896) and incorrect structure
 | 
			
		||||
 *	      initialisation in fs/jffs2/erase.c
 | 
			
		||||
 * GCC 4.8.0-4.8.2: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
 | 
			
		||||
 *	      miscompiles find_get_entry(), and can result in EXT3 and EXT4
 | 
			
		||||
 *	      filesystem corruption (possibly other FS too).
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#if (__GNUC__ == 3 && __GNUC_MINOR__ < 3)
 | 
			
		||||
#error Your compiler is too buggy; it is known to miscompile kernels.
 | 
			
		||||
#error    Known good compilers: 3.3, 4.x
 | 
			
		||||
#endif
 | 
			
		||||
#if GCC_VERSION >= 40800 && GCC_VERSION < 40803
 | 
			
		||||
#if defined(GCC_VERSION) && GCC_VERSION >= 40800 && GCC_VERSION < 40803
 | 
			
		||||
#error Your compiler is too buggy; it is known to miscompile kernels
 | 
			
		||||
#error and result in filesystem corruption and oopses.
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,7 @@
 | 
			
		||||
#define MISSING_CASE(x) WARN(1, "Missing case (%s == %ld)\n", \
 | 
			
		||||
			     __stringify(x), (long)(x))
 | 
			
		||||
 | 
			
		||||
#if GCC_VERSION >= 70000
 | 
			
		||||
#if defined(GCC_VERSION) && GCC_VERSION >= 70000
 | 
			
		||||
#define add_overflows(A, B) \
 | 
			
		||||
	__builtin_add_overflow_p((A), (B), (typeof((A) + (B)))0)
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
@ -146,12 +146,7 @@ static int kempld_wdt_set_stage_timeout(struct kempld_wdt_data *wdt_data,
 | 
			
		||||
	u32 remainder;
 | 
			
		||||
	u8 stage_cfg;
 | 
			
		||||
 | 
			
		||||
#if GCC_VERSION < 40400
 | 
			
		||||
	/* work around a bug compiling do_div() */
 | 
			
		||||
	prescaler = READ_ONCE(kempld_prescaler[PRESCALER_21]);
 | 
			
		||||
#else
 | 
			
		||||
	prescaler = kempld_prescaler[PRESCALER_21];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (!stage)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
@ -6,11 +6,7 @@
 | 
			
		||||
/* Some compiler specific definitions are overwritten here
 | 
			
		||||
 * for Clang compiler
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef uninitialized_var
 | 
			
		||||
#undef uninitialized_var
 | 
			
		||||
#define uninitialized_var(x) x = *(&(x))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* same as gcc, this was present in clang-2.6 so we can assume it works
 | 
			
		||||
 * with any version that can compile the kernel
 | 
			
		||||
@ -25,14 +21,8 @@
 | 
			
		||||
#define __SANITIZE_ADDRESS__
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef __no_sanitize_address
 | 
			
		||||
#define __no_sanitize_address __attribute__((no_sanitize("address")))
 | 
			
		||||
 | 
			
		||||
/* Clang doesn't have a way to turn it off per-function, yet. */
 | 
			
		||||
#ifdef __noretpoline
 | 
			
		||||
#undef __noretpoline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Not all versions of clang implement the the type-generic versions
 | 
			
		||||
 * of the builtin overflow checkers. Fortunately, clang implements
 | 
			
		||||
@ -40,9 +30,17 @@
 | 
			
		||||
 * checks. Unfortunately, we don't know which version of gcc clang
 | 
			
		||||
 * pretends to be, so the macro may or may not be defined.
 | 
			
		||||
 */
 | 
			
		||||
#undef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW
 | 
			
		||||
#if __has_builtin(__builtin_mul_overflow) && \
 | 
			
		||||
    __has_builtin(__builtin_add_overflow) && \
 | 
			
		||||
    __has_builtin(__builtin_sub_overflow)
 | 
			
		||||
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* The following are for compatibility with GCC, from compiler-gcc.h,
 | 
			
		||||
 * and may be redefined here because they should not be shared with other
 | 
			
		||||
 * compilers, like ICC.
 | 
			
		||||
 */
 | 
			
		||||
#define barrier() __asm__ __volatile__("" : : : "memory")
 | 
			
		||||
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
 | 
			
		||||
#define __assume_aligned(a, ...)	\
 | 
			
		||||
	__attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
 | 
			
		||||
 | 
			
		||||
@ -75,48 +75,6 @@
 | 
			
		||||
#define __must_be_array(a)	BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature detection for gnu_inline (gnu89 extern inline semantics). Either
 | 
			
		||||
 * __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics,
 | 
			
		||||
 * and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not
 | 
			
		||||
 * defined so the gnu89 semantics are the default.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __GNUC_STDC_INLINE__
 | 
			
		||||
# define __gnu_inline	__attribute__((gnu_inline))
 | 
			
		||||
#else
 | 
			
		||||
# define __gnu_inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Force always-inline if the user requests it so via the .config,
 | 
			
		||||
 * or if gcc is too old.
 | 
			
		||||
 * GCC does not warn about unused static inline functions for
 | 
			
		||||
 * -Wunused-function.  This turns out to avoid the need for complex #ifdef
 | 
			
		||||
 * directives.  Suppress the warning in clang as well by using "unused"
 | 
			
		||||
 * function attribute, which is redundant but not harmful for gcc.
 | 
			
		||||
 * Prefer gnu_inline, so that extern inline functions do not emit an
 | 
			
		||||
 * externally visible function. This makes extern inline behave as per gnu89
 | 
			
		||||
 * semantics rather than c99. This prevents multiple symbol definition errors
 | 
			
		||||
 * of extern inline functions at link time.
 | 
			
		||||
 * A lot of inline functions can cause havoc with function tracing.
 | 
			
		||||
 */
 | 
			
		||||
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||		\
 | 
			
		||||
    !defined(CONFIG_OPTIMIZE_INLINING)
 | 
			
		||||
#define inline \
 | 
			
		||||
	inline __attribute__((always_inline, unused)) notrace __gnu_inline
 | 
			
		||||
#else
 | 
			
		||||
#define inline inline		__attribute__((unused)) notrace __gnu_inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define __inline__ inline
 | 
			
		||||
#define __inline inline
 | 
			
		||||
#define __always_inline	inline __attribute__((always_inline))
 | 
			
		||||
#define  noinline	__attribute__((noinline))
 | 
			
		||||
 | 
			
		||||
#define __packed	__attribute__((packed))
 | 
			
		||||
#define __weak		__attribute__((weak))
 | 
			
		||||
#define __alias(symbol)	__attribute__((alias(#symbol)))
 | 
			
		||||
 | 
			
		||||
#ifdef RETPOLINE
 | 
			
		||||
#define __noretpoline __attribute__((indirect_branch("keep")))
 | 
			
		||||
#endif
 | 
			
		||||
@ -135,55 +93,9 @@
 | 
			
		||||
 */
 | 
			
		||||
#define __naked		__attribute__((naked)) noinline __noclone notrace
 | 
			
		||||
 | 
			
		||||
#define __noreturn	__attribute__((noreturn))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * From the GCC manual:
 | 
			
		||||
 *
 | 
			
		||||
 * Many functions have no effects except the return value and their
 | 
			
		||||
 * return value depends only on the parameters and/or global
 | 
			
		||||
 * variables.  Such a function can be subject to common subexpression
 | 
			
		||||
 * elimination and loop optimization just as an arithmetic operator
 | 
			
		||||
 * would be.
 | 
			
		||||
 * [...]
 | 
			
		||||
 */
 | 
			
		||||
#define __pure			__attribute__((pure))
 | 
			
		||||
#define __aligned(x)		__attribute__((aligned(x)))
 | 
			
		||||
#define __aligned_largest	__attribute__((aligned))
 | 
			
		||||
#define __printf(a, b)		__attribute__((format(printf, a, b)))
 | 
			
		||||
#define __scanf(a, b)		__attribute__((format(scanf, a, b)))
 | 
			
		||||
#define __attribute_const__	__attribute__((__const__))
 | 
			
		||||
#define __maybe_unused		__attribute__((unused))
 | 
			
		||||
#define __always_unused		__attribute__((unused))
 | 
			
		||||
#define __mode(x)               __attribute__((mode(x)))
 | 
			
		||||
 | 
			
		||||
#define __must_check		__attribute__((warn_unused_result))
 | 
			
		||||
#define __malloc		__attribute__((__malloc__))
 | 
			
		||||
 | 
			
		||||
#define __used			__attribute__((__used__))
 | 
			
		||||
#define __compiler_offsetof(a, b)					\
 | 
			
		||||
	__builtin_offsetof(a, b)
 | 
			
		||||
 | 
			
		||||
/* 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__)
 | 
			
		||||
 | 
			
		||||
#define __optimize(level)	__attribute__((__optimize__(level)))
 | 
			
		||||
#define __nostackprotector	__optimize("no-stack-protector")
 | 
			
		||||
 | 
			
		||||
#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -14,10 +14,6 @@
 | 
			
		||||
/* Intel ECC compiler doesn't support gcc specific asm stmts.
 | 
			
		||||
 * It uses intrinsics to do the equivalent things.
 | 
			
		||||
 */
 | 
			
		||||
#undef barrier
 | 
			
		||||
#undef barrier_data
 | 
			
		||||
#undef RELOC_HIDE
 | 
			
		||||
#undef OPTIMIZER_HIDE_VAR
 | 
			
		||||
 | 
			
		||||
#define barrier() __memory_barrier()
 | 
			
		||||
#define barrier_data(ptr) barrier()
 | 
			
		||||
@ -38,13 +34,12 @@
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __HAVE_BUILTIN_BSWAP16__
 | 
			
		||||
/* icc has this, but it's called _bswap16 */
 | 
			
		||||
#define __HAVE_BUILTIN_BSWAP16__
 | 
			
		||||
#define __builtin_bswap16 _bswap16
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * icc defines __GNUC__, but does not implement the builtin overflow checkers.
 | 
			
		||||
/* The following are for compatibility with GCC, from compiler-gcc.h,
 | 
			
		||||
 * and may be redefined here because they should not be shared with other
 | 
			
		||||
 * compilers, like clang.
 | 
			
		||||
 */
 | 
			
		||||
#undef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW
 | 
			
		||||
#define __visible	__attribute__((externally_visible))
 | 
			
		||||
 | 
			
		||||
@ -54,32 +54,20 @@ extern void __chk_io_ptr(const volatile void __iomem *);
 | 
			
		||||
 | 
			
		||||
#ifdef __KERNEL__
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#include <linux/compiler-gcc.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
 | 
			
		||||
#define notrace __attribute__((hotpatch(0,0)))
 | 
			
		||||
#else
 | 
			
		||||
#define notrace __attribute__((no_instrument_function))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Intel compiler defines __GNUC__. So we will overwrite implementations
 | 
			
		||||
 * coming from above header files here
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __INTEL_COMPILER
 | 
			
		||||
# include <linux/compiler-intel.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Clang compiler defines __GNUC__. So we will overwrite implementations
 | 
			
		||||
 * coming from above header files here
 | 
			
		||||
 */
 | 
			
		||||
/* Compiler specific macros. */
 | 
			
		||||
#ifdef __clang__
 | 
			
		||||
#include <linux/compiler-clang.h>
 | 
			
		||||
#elif defined(__INTEL_COMPILER)
 | 
			
		||||
#include <linux/compiler-intel.h>
 | 
			
		||||
#elif defined(__GNUC__)
 | 
			
		||||
/* The above compilers also define __GNUC__, so order is important here. */
 | 
			
		||||
#include <linux/compiler-gcc.h>
 | 
			
		||||
#else
 | 
			
		||||
#error "Unknown compiler"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Generic compiler-dependent macros required for kernel
 | 
			
		||||
 * Generic compiler-independent macros required for kernel
 | 
			
		||||
 * build go below this comment. Actual compiler/compiler version
 | 
			
		||||
 * specific implementations come from the above header files
 | 
			
		||||
 */
 | 
			
		||||
@ -106,93 +94,19 @@ struct ftrace_likely_data {
 | 
			
		||||
	unsigned long			constant;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* __KERNEL__ */
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
#ifdef __KERNEL__
 | 
			
		||||
 | 
			
		||||
/* Don't. Just don't. */
 | 
			
		||||
#define __deprecated
 | 
			
		||||
#define __deprecated_for_modules
 | 
			
		||||
 | 
			
		||||
#ifndef __must_check
 | 
			
		||||
#define __must_check
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_ENABLE_MUST_CHECK
 | 
			
		||||
#undef __must_check
 | 
			
		||||
#define __must_check
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __malloc
 | 
			
		||||
#define __malloc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Allow us to avoid 'defined but not used' warnings on functions and data,
 | 
			
		||||
 * as well as force them to be emitted to the assembly file.
 | 
			
		||||
 *
 | 
			
		||||
 * As of gcc 3.4, static functions that are not marked with attribute((used))
 | 
			
		||||
 * may be elided from the assembly file.  As of gcc 3.4, static data not so
 | 
			
		||||
 * marked will not be elided, but this may change in a future gcc version.
 | 
			
		||||
 *
 | 
			
		||||
 * NOTE: Because distributions shipped with a backported unit-at-a-time
 | 
			
		||||
 * compiler in gcc 3.3, we must define __used to be __attribute__((used))
 | 
			
		||||
 * for gcc >=3.3 instead of 3.4.
 | 
			
		||||
 *
 | 
			
		||||
 * In prior versions of gcc, such functions and data would be emitted, but
 | 
			
		||||
 * would be warned about except with attribute((unused)).
 | 
			
		||||
 *
 | 
			
		||||
 * Mark functions that are referenced only in inline assembly as __used so
 | 
			
		||||
 * the code is emitted even though it appears to be unreferenced.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __used
 | 
			
		||||
# define __used			/* unimplemented */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __maybe_unused
 | 
			
		||||
# define __maybe_unused		/* unimplemented */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __always_unused
 | 
			
		||||
# define __always_unused	/* unimplemented */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef noinline
 | 
			
		||||
#define noinline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Rather then using noinline to prevent stack consumption, use
 | 
			
		||||
 * noinline_for_stack instead.  For documentation reasons.
 | 
			
		||||
 */
 | 
			
		||||
#define noinline_for_stack noinline
 | 
			
		||||
 | 
			
		||||
#ifndef __always_inline
 | 
			
		||||
#define __always_inline inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* __KERNEL__ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * From the GCC manual:
 | 
			
		||||
 *
 | 
			
		||||
 * Many functions do not examine any values except their arguments,
 | 
			
		||||
 * and have no effects except the return value.  Basically this is
 | 
			
		||||
 * just slightly more strict class than the `pure' attribute above,
 | 
			
		||||
 * since function is not allowed to read global memory.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that a function that has pointer arguments and examines the
 | 
			
		||||
 * data pointed to must _not_ be declared `const'.  Likewise, a
 | 
			
		||||
 * function that calls a non-`const' function usually must not be
 | 
			
		||||
 * `const'.  It does not make sense for a `const' function to return
 | 
			
		||||
 * `void'.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __attribute_const__
 | 
			
		||||
# define __attribute_const__	/* unimplemented */
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The below symbols may be defined for one or more, but not ALL, of the above
 | 
			
		||||
 * compilers. We don't consider that to be an error, so set them to nothing.
 | 
			
		||||
 * For example, some of them are for compiler specific plugins.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __designated_init
 | 
			
		||||
# define __designated_init
 | 
			
		||||
#endif
 | 
			
		||||
@ -214,28 +128,10 @@ struct ftrace_likely_data {
 | 
			
		||||
# define randomized_struct_fields_end
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Tell gcc if a function is cold. The compiler will assume any path
 | 
			
		||||
 * directly leading to the call is unlikely.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __cold
 | 
			
		||||
#define __cold
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Simple shorthand for a section definition */
 | 
			
		||||
#ifndef __section
 | 
			
		||||
# define __section(S) __attribute__ ((__section__(#S)))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __visible
 | 
			
		||||
#define __visible
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __nostackprotector
 | 
			
		||||
# define __nostackprotector
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Assume alignment of return value.
 | 
			
		||||
 */
 | 
			
		||||
@ -243,17 +139,23 @@ struct ftrace_likely_data {
 | 
			
		||||
#define __assume_aligned(a, ...)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Are two types/vars the same type (ignoring qualifiers)? */
 | 
			
		||||
#ifndef __same_type
 | 
			
		||||
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 | 
			
		||||
#endif
 | 
			
		||||
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 | 
			
		||||
 | 
			
		||||
/* Is this type a native word size -- useful for atomic operations */
 | 
			
		||||
#ifndef __native_word
 | 
			
		||||
# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
 | 
			
		||||
#define __native_word(t) \
 | 
			
		||||
	(sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
 | 
			
		||||
	 sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
 | 
			
		||||
 | 
			
		||||
#ifndef __attribute_const__
 | 
			
		||||
#define __attribute_const__	__attribute__((__const__))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __noclone
 | 
			
		||||
#define __noclone
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Helpers for emitting diagnostics in pragmas. */
 | 
			
		||||
#ifndef __diag
 | 
			
		||||
#define __diag(string)
 | 
			
		||||
#endif
 | 
			
		||||
@ -272,4 +174,92 @@ struct ftrace_likely_data {
 | 
			
		||||
#define __diag_error(compiler, version, option, comment) \
 | 
			
		||||
	__diag_ ## compiler(version, error, option)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * From the GCC manual:
 | 
			
		||||
 *
 | 
			
		||||
 * Many functions have no effects except the return value and their
 | 
			
		||||
 * return value depends only on the parameters and/or global
 | 
			
		||||
 * variables.  Such a function can be subject to common subexpression
 | 
			
		||||
 * elimination and loop optimization just as an arithmetic operator
 | 
			
		||||
 * would be.
 | 
			
		||||
 * [...]
 | 
			
		||||
 */
 | 
			
		||||
#define __pure			__attribute__((pure))
 | 
			
		||||
#define __aligned(x)		__attribute__((aligned(x)))
 | 
			
		||||
#define __aligned_largest	__attribute__((aligned))
 | 
			
		||||
#define __printf(a, b)		__attribute__((format(printf, a, b)))
 | 
			
		||||
#define __scanf(a, b)		__attribute__((format(scanf, a, b)))
 | 
			
		||||
#define __maybe_unused		__attribute__((unused))
 | 
			
		||||
#define __always_unused		__attribute__((unused))
 | 
			
		||||
#define __mode(x)		__attribute__((mode(x)))
 | 
			
		||||
#define __malloc		__attribute__((__malloc__))
 | 
			
		||||
#define __used			__attribute__((__used__))
 | 
			
		||||
#define __noreturn		__attribute__((noreturn))
 | 
			
		||||
#define __packed		__attribute__((packed))
 | 
			
		||||
#define __weak			__attribute__((weak))
 | 
			
		||||
#define __alias(symbol)		__attribute__((alias(#symbol)))
 | 
			
		||||
#define __cold			__attribute__((cold))
 | 
			
		||||
#define __section(S)		__attribute__((__section__(#S)))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ENABLE_MUST_CHECK
 | 
			
		||||
#define __must_check		__attribute__((warn_unused_result))
 | 
			
		||||
#else
 | 
			
		||||
#define __must_check
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
 | 
			
		||||
#define notrace			__attribute__((hotpatch(0, 0)))
 | 
			
		||||
#else
 | 
			
		||||
#define notrace			__attribute__((no_instrument_function))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define __compiler_offsetof(a, b)	__builtin_offsetof(a, b)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Feature detection for gnu_inline (gnu89 extern inline semantics). Either
 | 
			
		||||
 * __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics,
 | 
			
		||||
 * and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not
 | 
			
		||||
 * defined so the gnu89 semantics are the default.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __GNUC_STDC_INLINE__
 | 
			
		||||
# define __gnu_inline	__attribute__((gnu_inline))
 | 
			
		||||
#else
 | 
			
		||||
# define __gnu_inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Force always-inline if the user requests it so via the .config.
 | 
			
		||||
 * GCC does not warn about unused static inline functions for
 | 
			
		||||
 * -Wunused-function.  This turns out to avoid the need for complex #ifdef
 | 
			
		||||
 * directives.  Suppress the warning in clang as well by using "unused"
 | 
			
		||||
 * function attribute, which is redundant but not harmful for gcc.
 | 
			
		||||
 * Prefer gnu_inline, so that extern inline functions do not emit an
 | 
			
		||||
 * externally visible function. This makes extern inline behave as per gnu89
 | 
			
		||||
 * semantics rather than c99. This prevents multiple symbol definition errors
 | 
			
		||||
 * of extern inline functions at link time.
 | 
			
		||||
 * A lot of inline functions can cause havoc with function tracing.
 | 
			
		||||
 */
 | 
			
		||||
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
 | 
			
		||||
	!defined(CONFIG_OPTIMIZE_INLINING)
 | 
			
		||||
#define inline \
 | 
			
		||||
	inline __attribute__((always_inline, unused)) notrace __gnu_inline
 | 
			
		||||
#else
 | 
			
		||||
#define inline inline	__attribute__((unused)) notrace __gnu_inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define __inline__ inline
 | 
			
		||||
#define __inline inline
 | 
			
		||||
#define noinline	__attribute__((noinline))
 | 
			
		||||
 | 
			
		||||
#ifndef __always_inline
 | 
			
		||||
#define __always_inline inline __attribute__((always_inline))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Rather then using noinline to prevent stack consumption, use
 | 
			
		||||
 * noinline_for_stack instead.  For documentation reasons.
 | 
			
		||||
 */
 | 
			
		||||
#define noinline_for_stack noinline
 | 
			
		||||
 | 
			
		||||
#endif /* __LINUX_COMPILER_TYPES_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								mm/ksm.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mm/ksm.c
									
									
									
									
									
								
							@ -652,9 +652,9 @@ static void remove_node_from_stable_tree(struct stable_node *stable_node)
 | 
			
		||||
	 * list_head to stay clear from the rb_parent_color union
 | 
			
		||||
	 * (aligned and different than any node) and also different
 | 
			
		||||
	 * from &migrate_nodes. This will verify that future list.h changes
 | 
			
		||||
	 * don't break STABLE_NODE_DUP_HEAD.
 | 
			
		||||
	 * don't break STABLE_NODE_DUP_HEAD. Only recent gcc can handle it.
 | 
			
		||||
	 */
 | 
			
		||||
#if GCC_VERSION >= 40903 /* only recent gcc can handle it */
 | 
			
		||||
#if defined(GCC_VERSION) && GCC_VERSION >= 40903
 | 
			
		||||
	BUILD_BUG_ON(STABLE_NODE_DUP_HEAD <= &migrate_nodes);
 | 
			
		||||
	BUILD_BUG_ON(STABLE_NODE_DUP_HEAD >= &migrate_nodes + 1);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1131,7 +1131,8 @@ out:
 | 
			
		||||
 * gcc 4.7 and 4.8 on arm get an ICEs when inlining unmap_and_move().  Work
 | 
			
		||||
 * around it.
 | 
			
		||||
 */
 | 
			
		||||
#if (GCC_VERSION >= 40700 && GCC_VERSION < 40900) && defined(CONFIG_ARM)
 | 
			
		||||
#if defined(CONFIG_ARM) && \
 | 
			
		||||
	defined(GCC_VERSION) && GCC_VERSION < 40900 && GCC_VERSION >= 40700
 | 
			
		||||
#define ICE_noinline noinline
 | 
			
		||||
#else
 | 
			
		||||
#define ICE_noinline
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user