* [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' @ 2017-10-05 23:18 kbuild test robot 2017-10-06 13:21 ` Will Deacon 0 siblings, 1 reply; 3+ messages in thread From: kbuild test robot @ 2017-10-05 23:18 UTC (permalink / raw) To: Will Deacon; +Cc: kbuild-all, linux-kernel, Paul E. McKenney [-- Attachment #1: Type: text/plain, Size: 3822 bytes --] 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 vim +/smp_read_barrier_depends +343 include/linux/compiler.h 312 313 /* 314 * Prevent the compiler from merging or refetching reads or writes. The 315 * compiler is also forbidden from reordering successive instances of 316 * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the 317 * compiler is aware of some particular ordering. One way to make the 318 * compiler aware of ordering is to put the two invocations of READ_ONCE, 319 * WRITE_ONCE or ACCESS_ONCE() in different C statements. 320 * 321 * In contrast to ACCESS_ONCE these two macros will also work on aggregate 322 * data types like structs or unions. If the size of the accessed data 323 * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) 324 * READ_ONCE() and WRITE_ONCE() will fall back to memcpy(). There's at 325 * least two memcpy()s: one for the __builtin_memcpy() and then one for 326 * the macro doing the copy of variable - '__u' allocated on the stack. 327 * 328 * Their two major use cases are: (1) Mediating communication between 329 * process-level code and irq/NMI handlers, all running on the same CPU, 330 * and (2) Ensuring that the compiler does not fold, spindle, or otherwise 331 * mutilate accesses that either do not require ordering or that interact 332 * with an explicit memory barrier or atomic instruction that provides the 333 * required ordering. 334 */ 335 336 #define __READ_ONCE(x, check) \ 337 ({ \ 338 union { typeof(x) __val; char __c[1]; } __u; \ 339 if (check) \ 340 __read_once_size(&(x), __u.__c, sizeof(x)); \ 341 else \ 342 __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ > 343 smp_read_barrier_depends(); /* Enforce dependency ordering from x */ \ 344 __u.__val; \ 345 }) 346 #define READ_ONCE(x) __READ_ONCE(x, 1) 347 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 4713 bytes --] ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' 2017-10-05 23:18 [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' kbuild test robot @ 2017-10-06 13:21 ` Will Deacon 2017-10-06 20:26 ` Paul E. McKenney 0 siblings, 1 reply; 3+ messages in thread From: Will Deacon @ 2017-10-06 13:21 UTC (permalink / raw) To: kbuild test robot; +Cc: kbuild-all, linux-kernel, Paul E. McKenney 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. Will --->8 >From c3af54475c5be8789aa54823e56afcfb1b5b83da Mon Sep 17 00:00:00 2001 From: Will Deacon <will.deacon@arm.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@intel.com> Signed-off-by: Will Deacon <will.deacon@arm.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@^#include <linux/compiler.h>@@' \ + -e 's@^#include <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 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' 2017-10-06 13:21 ` Will Deacon @ 2017-10-06 20:26 ` Paul E. McKenney 0 siblings, 0 replies; 3+ messages in thread From: Paul E. McKenney @ 2017-10-06 20:26 UTC (permalink / raw) To: Will Deacon; +Cc: kbuild test robot, kbuild-all, linux-kernel 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@arm.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@intel.com> > Signed-off-by: Will Deacon <will.deacon@arm.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@^#include <linux/compiler.h>@@' \ > + -e 's@^#include <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 > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-10-06 20:26 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-10-05 23:18 [rcu:dev.2017.10.05a 32/34] include/linux/compiler.h:343:2: error: implicit declaration of function 'smp_read_barrier_depends' kbuild test robot 2017-10-06 13:21 ` Will Deacon 2017-10-06 20:26 ` Paul E. McKenney
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.