* [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 +-
| 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
--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.