lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:   Fri, 6 Oct 2017 13:26:15 -0700
From:   "Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To:     Will Deacon <will.deacon@....com>
Cc:     kbuild test robot <fengguang.wu@...el.com>, kbuild-all@...org,
        linux-kernel@...r.kernel.org
Subject: Re: [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2:
 error: implicit declaration of function 'smp_read_barrier_depends'

On Fri, Oct 06, 2017 at 02:21:39PM +0100, Will Deacon wrote:
> Hi Paul,
> 
> On Fri, Oct 06, 2017 at 07:18:41AM +0800, kbuild test robot wrote:
> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev.2017.10.05a
> > head:   39ae2675aa536e6ef9d334fe9097d1e2c6b25fbc
> > commit: 7e3675cc18bbf4d84f60bfc02ff563ae3764ad35 [32/34] locking/barriers: Kill lockless_dereference
> > config: h8300-h8300h-sim_defconfig (attached as .config)
> > compiler: h8300-linux-gcc (GCC) 6.2.0
> > reproduce:
> >         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> >         chmod +x ~/bin/make.cross
> >         git checkout 7e3675cc18bbf4d84f60bfc02ff563ae3764ad35
> >         # save the attached .config to linux build tree
> >         make.cross ARCH=h8300 
> > 
> > All error/warnings (new ones prefixed by >>):
> > 
> >    In file included from include/uapi/linux/stddef.h:1:0,
> >                     from include/linux/stddef.h:4,
> >                     from arch/h8300/kernel/asm-offsets.c:11:
> >    include/linux/list.h: In function 'list_empty':
> > >> include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' [-Werror=implicit-function-declaration]
> >      smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \
> >      ^
> >    include/linux/compiler.h:346:22: note: in expansion of macro '__READ_ONCE'
> >     #define READ_ONCE(x) __READ_ONCE(x, 1)
> >                          ^~~~~~~~~~~
> > >> include/linux/list.h:202:9: note: in expansion of macro 'READ_ONCE'
> >      return READ_ONCE(head->next) == head;
> >             ^~~~~~~~~
> >    cc1: some warnings being treated as errors
> >    make[2]: *** [arch/h8300/kernel/asm-offsets.s] Error 1
> >    make[2]: Target '__build' not remade because of errors.
> >    make[1]: *** [prepare0] Error 2
> >    make[1]: Target 'prepare' not remade because of errors.
> >    make: *** [sub-make] Error 2
> 
> Ok, I dug into this and the problem is as follows:
> 
> arch/h8300/kernel/asm-offsets.c includes linux/stddef.h for offsetof
> 	linux/stddef.h includes uapi/linux/stddef.h
> 		uapi/linux/stddef.h includes linux/compiler.h
> 
> arch/h8300/kernel/asm-offsets.c also includes linux/sched.h for task_struct
> 	linux/sched.h includes linux/pid.h
> 		linux/pid.h includes linux/rculist.h
> 			linux/rculist.h includes linux/list.h
> 
> linux/list.h then tries to instantiate some static inline functions
> that use READ_ONCE (e.g. list_empty), but nobody has included asm/barrier.h
> so the build fails.
> 
> Ideally, we'd just include <asm/barrier.h> in linux/compiler.h (since
> lockless_dereference uses smp_read_barrier_depends in mainline today),
> but it's not quite that simple because compiler.h is also used by
> linux/types.h, so we don't even have a definition for "bool" at this stage!
> 
> The best fix I could come up with involves splitting compiler.h into two
> headers: one for the type annotations and definitions, and the other for
> macros such as READ_ONCE. Patch below.
> 
> Note that even with this change I'm unable to build h8300. The assembler
> chokes on a bunch of unrelated errors and the compiler eventually ICEs.

Can't say that I know of something that would work better.  I am not
in a violent hurry on this one, so I will hold off until you get me
an official patch.

Have a great weekend!

							Thanx, Paul

> Will
> 
> --->8
> 
> >From c3af54475c5be8789aa54823e56afcfb1b5b83da Mon Sep 17 00:00:00 2001
> From: Will Deacon <will.deacon@....com>
> Date: Fri, 6 Oct 2017 13:50:14 +0100
> Subject: [PATCH] linux/compiler.h: Split into compiler.h and compiler-types.h
> 
> linux/compiler.h is included indirectly by linux/types.h via
> uapi/linux/types.h -> uapi/linux/posix_types.h -> linux/stddef.h
> -> uapi/linux/stddef.h and is needed to provide a proper definition of
> offsetof.
> 
> Unfortunately, compiler.h requires a definition of
> smp_read_barrier_depends() for defining READ_ONCE, which means that all
> users of READ_ONCE need to include asm/barrier.h to avoid splats such
> as:
> 
>    In file included from include/uapi/linux/stddef.h:1:0,
>                     from include/linux/stddef.h:4,
>                     from arch/h8300/kernel/asm-offsets.c:11:
>    include/linux/list.h: In function 'list_empty':
> >> include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' [-Werror=implicit-function-declaration]
>      smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \
>      ^
> 
> A better alternative is to include asm/barrier.h in linux/compiler.h,
> but this requires a type definition for "bool" on some architectures
> (e.g. x86), which is defined later by linux/types.h. Type "bool" is also
> used directly in linux/compiler.h, so the whole thing is pretty fragile.
> 
> This patch splits compiler.h in two: compiler-types.h contains type
> annotations, definitions and the compiler-specific parts, whereas
> compiler.h #includes compiler-types.h and additionally defines macros
> such as {READ,WRITE.ACCESS}_ONCE.
> 
> uapi/linux/stddef.h is then moved over to include linux/compiler-types.h,
> which fixes the build.
> 
> Reported-by: kbuild test robot <fengguang.wu@...el.com>
> Signed-off-by: Will Deacon <will.deacon@....com>
> ---
>  include/linux/compiler-clang.h |   2 +-
>  include/linux/compiler-gcc.h   |   2 +-
>  include/linux/compiler-intel.h |   2 +-
>  include/linux/compiler-types.h | 274 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/compiler.h       | 265 +--------------------------------------
>  include/uapi/linux/stddef.h    |   2 +-
>  scripts/headers_install.sh     |   2 +-
>  7 files changed, 282 insertions(+), 267 deletions(-)
>  create mode 100644 include/linux/compiler-types.h
> 
> diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
> index de179993e039..5947a3e6c0e6 100644
> --- a/include/linux/compiler-clang.h
> +++ b/include/linux/compiler-clang.h
> @@ -1,4 +1,4 @@
> -#ifndef __LINUX_COMPILER_H
> +#ifndef __LINUX_COMPILER_TYPES_H
>  #error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead."
>  #endif
> 
> diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
> index 16d41de92ee3..ce8e965646ef 100644
> --- a/include/linux/compiler-gcc.h
> +++ b/include/linux/compiler-gcc.h
> @@ -1,4 +1,4 @@
> -#ifndef __LINUX_COMPILER_H
> +#ifndef __LINUX_COMPILER_TYPES_H
>  #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
>  #endif
> 
> diff --git a/include/linux/compiler-intel.h b/include/linux/compiler-intel.h
> index d4c71132d07f..e438ac89c692 100644
> --- a/include/linux/compiler-intel.h
> +++ b/include/linux/compiler-intel.h
> @@ -1,4 +1,4 @@
> -#ifndef __LINUX_COMPILER_H
> +#ifndef __LINUX_COMPILER_TYPES_H
>  #error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead."
>  #endif
> 
> diff --git a/include/linux/compiler-types.h b/include/linux/compiler-types.h
> new file mode 100644
> index 000000000000..6b79a9bba9a7
> --- /dev/null
> +++ b/include/linux/compiler-types.h
> @@ -0,0 +1,274 @@
> +#ifndef __LINUX_COMPILER_TYPES_H
> +#define __LINUX_COMPILER_TYPES_H
> +
> +#ifndef __ASSEMBLY__
> +
> +#ifdef __CHECKER__
> +# define __user		__attribute__((noderef, address_space(1)))
> +# define __kernel	__attribute__((address_space(0)))
> +# define __safe		__attribute__((safe))
> +# define __force	__attribute__((force))
> +# define __nocast	__attribute__((nocast))
> +# define __iomem	__attribute__((noderef, address_space(2)))
> +# define __must_hold(x)	__attribute__((context(x,1,1)))
> +# define __acquires(x)	__attribute__((context(x,0,1)))
> +# define __releases(x)	__attribute__((context(x,1,0)))
> +# define __acquire(x)	__context__(x,1)
> +# define __release(x)	__context__(x,-1)
> +# define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0)
> +# define __percpu	__attribute__((noderef, address_space(3)))
> +# define __rcu		__attribute__((noderef, address_space(4)))
> +# define __private	__attribute__((noderef))
> +extern void __chk_user_ptr(const volatile void __user *);
> +extern void __chk_io_ptr(const volatile void __iomem *);
> +# define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
> +#else /* __CHECKER__ */
> +# ifdef STRUCTLEAK_PLUGIN
> +#  define __user __attribute__((user))
> +# else
> +#  define __user
> +# endif
> +# define __kernel
> +# define __safe
> +# define __force
> +# define __nocast
> +# define __iomem
> +# define __chk_user_ptr(x) (void)0
> +# define __chk_io_ptr(x) (void)0
> +# define __builtin_warning(x, y...) (1)
> +# define __must_hold(x)
> +# define __acquires(x)
> +# define __releases(x)
> +# define __acquire(x) (void)0
> +# define __release(x) (void)0
> +# define __cond_lock(x,c) (c)
> +# define __percpu
> +# define __rcu
> +# define __private
> +# define ACCESS_PRIVATE(p, member) ((p)->member)
> +#endif /* __CHECKER__ */
> +
> +/* Indirect macros required for expanded argument pasting, eg. __LINE__. */
> +#define ___PASTE(a,b) a##b
> +#define __PASTE(a,b) ___PASTE(a,b)
> +
> +#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
> + */
> +#ifdef __clang__
> +#include <linux/compiler-clang.h>
> +#endif
> +
> +/*
> + * Generic compiler-dependent macros required for kernel
> + * build go below this comment. Actual compiler/compiler version
> + * specific implementations come from the above header files
> + */
> +
> +struct ftrace_branch_data {
> +	const char *func;
> +	const char *file;
> +	unsigned line;
> +	union {
> +		struct {
> +			unsigned long correct;
> +			unsigned long incorrect;
> +		};
> +		struct {
> +			unsigned long miss;
> +			unsigned long hit;
> +		};
> +		unsigned long miss_hit[2];
> +	};
> +};
> +
> +struct ftrace_likely_data {
> +	struct ftrace_branch_data	data;
> +	unsigned long			constant;
> +};
> +
> +#endif /* __KERNEL__ */
> +
> +#endif /* __ASSEMBLY__ */
> +
> +#ifdef __KERNEL__
> +/*
> + * Allow us to mark functions as 'deprecated' and have gcc emit a nice
> + * warning for each use, in hopes of speeding the functions removal.
> + * Usage is:
> + * 		int __deprecated foo(void)
> + */
> +#ifndef __deprecated
> +# define __deprecated		/* unimplemented */
> +#endif
> +
> +#ifdef MODULE
> +#define __deprecated_for_modules __deprecated
> +#else
> +#define __deprecated_for_modules
> +#endif
> +
> +#ifndef __must_check
> +#define __must_check
> +#endif
> +
> +#ifndef CONFIG_ENABLE_MUST_CHECK
> +#undef __must_check
> +#define __must_check
> +#endif
> +#ifndef CONFIG_ENABLE_WARN_DEPRECATED
> +#undef __deprecated
> +#undef __deprecated_for_modules
> +#define __deprecated
> +#define __deprecated_for_modules
> +#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
> +
> +#ifndef __designated_init
> +# define __designated_init
> +#endif
> +
> +#ifndef __latent_entropy
> +# define __latent_entropy
> +#endif
> +
> +#ifndef __randomize_layout
> +# define __randomize_layout __designated_init
> +#endif
> +
> +#ifndef __no_randomize_layout
> +# define __no_randomize_layout
> +#endif
> +
> +#ifndef randomized_struct_fields_start
> +# define randomized_struct_fields_start
> +# 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.
> + */
> +#ifndef __assume_aligned
> +#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
> +
> +/* 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))
> +#endif
> +
> +#endif /* __LINUX_COMPILER_TYPES_H */
> diff --git a/include/linux/compiler.h b/include/linux/compiler.h
> index f260ff39f90f..4517662f128c 100644
> --- a/include/linux/compiler.h
> +++ b/include/linux/compiler.h
> @@ -1,111 +1,12 @@
>  #ifndef __LINUX_COMPILER_H
>  #define __LINUX_COMPILER_H
> 
> -#ifndef __ASSEMBLY__
> +#include <linux/compiler-types.h>
> 
> -#ifdef __CHECKER__
> -# define __user		__attribute__((noderef, address_space(1)))
> -# define __kernel	__attribute__((address_space(0)))
> -# define __safe		__attribute__((safe))
> -# define __force	__attribute__((force))
> -# define __nocast	__attribute__((nocast))
> -# define __iomem	__attribute__((noderef, address_space(2)))
> -# define __must_hold(x)	__attribute__((context(x,1,1)))
> -# define __acquires(x)	__attribute__((context(x,0,1)))
> -# define __releases(x)	__attribute__((context(x,1,0)))
> -# define __acquire(x)	__context__(x,1)
> -# define __release(x)	__context__(x,-1)
> -# define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0)
> -# define __percpu	__attribute__((noderef, address_space(3)))
> -# define __rcu		__attribute__((noderef, address_space(4)))
> -# define __private	__attribute__((noderef))
> -extern void __chk_user_ptr(const volatile void __user *);
> -extern void __chk_io_ptr(const volatile void __iomem *);
> -# define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
> -#else /* __CHECKER__ */
> -# ifdef STRUCTLEAK_PLUGIN
> -#  define __user __attribute__((user))
> -# else
> -#  define __user
> -# endif
> -# define __kernel
> -# define __safe
> -# define __force
> -# define __nocast
> -# define __iomem
> -# define __chk_user_ptr(x) (void)0
> -# define __chk_io_ptr(x) (void)0
> -# define __builtin_warning(x, y...) (1)
> -# define __must_hold(x)
> -# define __acquires(x)
> -# define __releases(x)
> -# define __acquire(x) (void)0
> -# define __release(x) (void)0
> -# define __cond_lock(x,c) (c)
> -# define __percpu
> -# define __rcu
> -# define __private
> -# define ACCESS_PRIVATE(p, member) ((p)->member)
> -#endif /* __CHECKER__ */
> -
> -/* Indirect macros required for expanded argument pasting, eg. __LINE__. */
> -#define ___PASTE(a,b) a##b
> -#define __PASTE(a,b) ___PASTE(a,b)
> +#ifndef __ASSEMBLY__
> 
>  #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
> - */
> -#ifdef __clang__
> -#include <linux/compiler-clang.h>
> -#endif
> -
> -/*
> - * Generic compiler-dependent macros required for kernel
> - * build go below this comment. Actual compiler/compiler version
> - * specific implementations come from the above header files
> - */
> -
> -struct ftrace_branch_data {
> -	const char *func;
> -	const char *file;
> -	unsigned line;
> -	union {
> -		struct {
> -			unsigned long correct;
> -			unsigned long incorrect;
> -		};
> -		struct {
> -			unsigned long miss;
> -			unsigned long hit;
> -		};
> -		unsigned long miss_hit[2];
> -	};
> -};
> -
> -struct ftrace_likely_data {
> -	struct ftrace_branch_data	data;
> -	unsigned long			constant;
> -};
> -
>  /*
>   * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
>   * to disable branch tracing on a per file basis.
> @@ -332,6 +233,7 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
>   * with an explicit memory barrier or atomic instruction that provides the
>   * required ordering.
>   */
> +#include <asm/barrier.h>
> 
>  #define __READ_ONCE(x, check)						\
>  ({									\
> @@ -363,167 +265,6 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
> 
>  #endif /* __ASSEMBLY__ */
> 
> -#ifdef __KERNEL__
> -/*
> - * Allow us to mark functions as 'deprecated' and have gcc emit a nice
> - * warning for each use, in hopes of speeding the functions removal.
> - * Usage is:
> - * 		int __deprecated foo(void)
> - */
> -#ifndef __deprecated
> -# define __deprecated		/* unimplemented */
> -#endif
> -
> -#ifdef MODULE
> -#define __deprecated_for_modules __deprecated
> -#else
> -#define __deprecated_for_modules
> -#endif
> -
> -#ifndef __must_check
> -#define __must_check
> -#endif
> -
> -#ifndef CONFIG_ENABLE_MUST_CHECK
> -#undef __must_check
> -#define __must_check
> -#endif
> -#ifndef CONFIG_ENABLE_WARN_DEPRECATED
> -#undef __deprecated
> -#undef __deprecated_for_modules
> -#define __deprecated
> -#define __deprecated_for_modules
> -#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
> -
> -#ifndef __designated_init
> -# define __designated_init
> -#endif
> -
> -#ifndef __latent_entropy
> -# define __latent_entropy
> -#endif
> -
> -#ifndef __randomize_layout
> -# define __randomize_layout __designated_init
> -#endif
> -
> -#ifndef __no_randomize_layout
> -# define __no_randomize_layout
> -#endif
> -
> -#ifndef randomized_struct_fields_start
> -# define randomized_struct_fields_start
> -# 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.
> - */
> -#ifndef __assume_aligned
> -#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
> -
> -/* 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))
> -#endif
> -
>  /* Compile time object size, -1 for unknown */
>  #ifndef __compiletime_object_size
>  # define __compiletime_object_size(obj) -1
> diff --git a/include/uapi/linux/stddef.h b/include/uapi/linux/stddef.h
> index 621fa8ac4425..1ec6a7867c46 100644
> --- a/include/uapi/linux/stddef.h
> +++ b/include/uapi/linux/stddef.h
> @@ -1,4 +1,4 @@
> -#include <linux/compiler.h>
> +#include <linux/compiler-types.h>
> 
>  #ifndef __always_inline
>  #define __always_inline inline
> diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh
> index fdebd66f8fc1..bbb7f3d35289 100755
> --- a/scripts/headers_install.sh
> +++ b/scripts/headers_install.sh
> @@ -33,7 +33,7 @@ do
>  	sed -r \
>  		-e 's/([ \t(])(__user|__force|__iomem)[ \t]/\1/g' \
>  		-e 's/__attribute_const__([ \t]|$)/\1/g' \
> -		-e 's@...nclude <linux/compiler.h>@@' \
> +		-e 's@...nclude <linux/compiler(|-types).h>@@' \
>  		-e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
>  		-e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \
>  		-e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \
> -- 
> 2.1.4
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ