All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.