[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <20171006202615.GJ3521@linux.vnet.ibm.com>
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