Skip to content

Commit d151558

Browse files
wildea01Ingo Molnar
authored andcommitted
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 lockless_dereference() and soon for defining READ_ONCE(), which means that all users of READ_ONCE() will 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 and linux/linkage.h are then moved over to include linux/compiler_types.h, which fixes the build for h8 and blackfin. Signed-off-by: Will Deacon <will.deacon@arm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1508840570-22169-2-git-send-email-will.deacon@arm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
1 parent 9babb09 commit d151558

File tree

11 files changed

+286
-271
lines changed

11 files changed

+286
-271
lines changed

arch/arm/include/asm/ptrace.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ extern unsigned long profile_pc(struct pt_regs *regs);
126126
/*
127127
* kprobe-based event tracer support
128128
*/
129-
#include <linux/stddef.h>
130-
#include <linux/types.h>
129+
#include <linux/compiler.h>
131130
#define MAX_REG_OFFSET (offsetof(struct pt_regs, ARM_ORIG_r0))
132131

133132
extern int regs_query_register_offset(const char *name);

arch/sparc/include/asm/ptrace.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#if defined(__sparc__) && defined(__arch64__)
77
#ifndef __ASSEMBLY__
88

9+
#include <linux/compiler.h>
910
#include <linux/threads.h>
1011
#include <asm/switch_to.h>
1112

arch/um/include/shared/init.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
typedef int (*initcall_t)(void);
4141
typedef void (*exitcall_t)(void);
4242

43-
#include <linux/compiler.h>
43+
#include <linux/compiler_types.h>
4444

4545
/* These are for everybody (although not all archs will actually
4646
discard it in modules) */

include/linux/compiler-clang.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#ifndef __LINUX_COMPILER_H
1+
#ifndef __LINUX_COMPILER_TYPES_H
22
#error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead."
33
#endif
44

include/linux/compiler-gcc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#ifndef __LINUX_COMPILER_H
1+
#ifndef __LINUX_COMPILER_TYPES_H
22
#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
33
#endif
44

include/linux/compiler-intel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#ifndef __LINUX_COMPILER_H
1+
#ifndef __LINUX_COMPILER_TYPES_H
22
#error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead."
33
#endif
44

include/linux/compiler.h

Lines changed: 3 additions & 262 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,12 @@
11
#ifndef __LINUX_COMPILER_H
22
#define __LINUX_COMPILER_H
33

4-
#ifndef __ASSEMBLY__
4+
#include <linux/compiler_types.h>
55

6-
#ifdef __CHECKER__
7-
# define __user __attribute__((noderef, address_space(1)))
8-
# define __kernel __attribute__((address_space(0)))
9-
# define __safe __attribute__((safe))
10-
# define __force __attribute__((force))
11-
# define __nocast __attribute__((nocast))
12-
# define __iomem __attribute__((noderef, address_space(2)))
13-
# define __must_hold(x) __attribute__((context(x,1,1)))
14-
# define __acquires(x) __attribute__((context(x,0,1)))
15-
# define __releases(x) __attribute__((context(x,1,0)))
16-
# define __acquire(x) __context__(x,1)
17-
# define __release(x) __context__(x,-1)
18-
# define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0)
19-
# define __percpu __attribute__((noderef, address_space(3)))
20-
# define __rcu __attribute__((noderef, address_space(4)))
21-
# define __private __attribute__((noderef))
22-
extern void __chk_user_ptr(const volatile void __user *);
23-
extern void __chk_io_ptr(const volatile void __iomem *);
24-
# define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
25-
#else /* __CHECKER__ */
26-
# ifdef STRUCTLEAK_PLUGIN
27-
# define __user __attribute__((user))
28-
# else
29-
# define __user
30-
# endif
31-
# define __kernel
32-
# define __safe
33-
# define __force
34-
# define __nocast
35-
# define __iomem
36-
# define __chk_user_ptr(x) (void)0
37-
# define __chk_io_ptr(x) (void)0
38-
# define __builtin_warning(x, y...) (1)
39-
# define __must_hold(x)
40-
# define __acquires(x)
41-
# define __releases(x)
42-
# define __acquire(x) (void)0
43-
# define __release(x) (void)0
44-
# define __cond_lock(x,c) (c)
45-
# define __percpu
46-
# define __rcu
47-
# define __private
48-
# define ACCESS_PRIVATE(p, member) ((p)->member)
49-
#endif /* __CHECKER__ */
50-
51-
/* Indirect macros required for expanded argument pasting, eg. __LINE__. */
52-
#define ___PASTE(a,b) a##b
53-
#define __PASTE(a,b) ___PASTE(a,b)
6+
#ifndef __ASSEMBLY__
547

558
#ifdef __KERNEL__
569

57-
#ifdef __GNUC__
58-
#include <linux/compiler-gcc.h>
59-
#endif
60-
61-
#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__)
62-
#define notrace __attribute__((hotpatch(0,0)))
63-
#else
64-
#define notrace __attribute__((no_instrument_function))
65-
#endif
66-
67-
/* Intel compiler defines __GNUC__. So we will overwrite implementations
68-
* coming from above header files here
69-
*/
70-
#ifdef __INTEL_COMPILER
71-
# include <linux/compiler-intel.h>
72-
#endif
73-
74-
/* Clang compiler defines __GNUC__. So we will overwrite implementations
75-
* coming from above header files here
76-
*/
77-
#ifdef __clang__
78-
#include <linux/compiler-clang.h>
79-
#endif
80-
81-
/*
82-
* Generic compiler-dependent macros required for kernel
83-
* build go below this comment. Actual compiler/compiler version
84-
* specific implementations come from the above header files
85-
*/
86-
87-
struct ftrace_branch_data {
88-
const char *func;
89-
const char *file;
90-
unsigned line;
91-
union {
92-
struct {
93-
unsigned long correct;
94-
unsigned long incorrect;
95-
};
96-
struct {
97-
unsigned long miss;
98-
unsigned long hit;
99-
};
100-
unsigned long miss_hit[2];
101-
};
102-
};
103-
104-
struct ftrace_likely_data {
105-
struct ftrace_branch_data data;
106-
unsigned long constant;
107-
};
108-
10910
/*
11011
* Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
11112
* 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
332233
* with an explicit memory barrier or atomic instruction that provides the
333234
* required ordering.
334235
*/
236+
#include <asm/barrier.h>
335237

336238
#define __READ_ONCE(x, check) \
337239
({ \
@@ -362,167 +264,6 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
362264

363265
#endif /* __ASSEMBLY__ */
364266

365-
#ifdef __KERNEL__
366-
/*
367-
* Allow us to mark functions as 'deprecated' and have gcc emit a nice
368-
* warning for each use, in hopes of speeding the functions removal.
369-
* Usage is:
370-
* int __deprecated foo(void)
371-
*/
372-
#ifndef __deprecated
373-
# define __deprecated /* unimplemented */
374-
#endif
375-
376-
#ifdef MODULE
377-
#define __deprecated_for_modules __deprecated
378-
#else
379-
#define __deprecated_for_modules
380-
#endif
381-
382-
#ifndef __must_check
383-
#define __must_check
384-
#endif
385-
386-
#ifndef CONFIG_ENABLE_MUST_CHECK
387-
#undef __must_check
388-
#define __must_check
389-
#endif
390-
#ifndef CONFIG_ENABLE_WARN_DEPRECATED
391-
#undef __deprecated
392-
#undef __deprecated_for_modules
393-
#define __deprecated
394-
#define __deprecated_for_modules
395-
#endif
396-
397-
#ifndef __malloc
398-
#define __malloc
399-
#endif
400-
401-
/*
402-
* Allow us to avoid 'defined but not used' warnings on functions and data,
403-
* as well as force them to be emitted to the assembly file.
404-
*
405-
* As of gcc 3.4, static functions that are not marked with attribute((used))
406-
* may be elided from the assembly file. As of gcc 3.4, static data not so
407-
* marked will not be elided, but this may change in a future gcc version.
408-
*
409-
* NOTE: Because distributions shipped with a backported unit-at-a-time
410-
* compiler in gcc 3.3, we must define __used to be __attribute__((used))
411-
* for gcc >=3.3 instead of 3.4.
412-
*
413-
* In prior versions of gcc, such functions and data would be emitted, but
414-
* would be warned about except with attribute((unused)).
415-
*
416-
* Mark functions that are referenced only in inline assembly as __used so
417-
* the code is emitted even though it appears to be unreferenced.
418-
*/
419-
#ifndef __used
420-
# define __used /* unimplemented */
421-
#endif
422-
423-
#ifndef __maybe_unused
424-
# define __maybe_unused /* unimplemented */
425-
#endif
426-
427-
#ifndef __always_unused
428-
# define __always_unused /* unimplemented */
429-
#endif
430-
431-
#ifndef noinline
432-
#define noinline
433-
#endif
434-
435-
/*
436-
* Rather then using noinline to prevent stack consumption, use
437-
* noinline_for_stack instead. For documentation reasons.
438-
*/
439-
#define noinline_for_stack noinline
440-
441-
#ifndef __always_inline
442-
#define __always_inline inline
443-
#endif
444-
445-
#endif /* __KERNEL__ */
446-
447-
/*
448-
* From the GCC manual:
449-
*
450-
* Many functions do not examine any values except their arguments,
451-
* and have no effects except the return value. Basically this is
452-
* just slightly more strict class than the `pure' attribute above,
453-
* since function is not allowed to read global memory.
454-
*
455-
* Note that a function that has pointer arguments and examines the
456-
* data pointed to must _not_ be declared `const'. Likewise, a
457-
* function that calls a non-`const' function usually must not be
458-
* `const'. It does not make sense for a `const' function to return
459-
* `void'.
460-
*/
461-
#ifndef __attribute_const__
462-
# define __attribute_const__ /* unimplemented */
463-
#endif
464-
465-
#ifndef __designated_init
466-
# define __designated_init
467-
#endif
468-
469-
#ifndef __latent_entropy
470-
# define __latent_entropy
471-
#endif
472-
473-
#ifndef __randomize_layout
474-
# define __randomize_layout __designated_init
475-
#endif
476-
477-
#ifndef __no_randomize_layout
478-
# define __no_randomize_layout
479-
#endif
480-
481-
#ifndef randomized_struct_fields_start
482-
# define randomized_struct_fields_start
483-
# define randomized_struct_fields_end
484-
#endif
485-
486-
/*
487-
* Tell gcc if a function is cold. The compiler will assume any path
488-
* directly leading to the call is unlikely.
489-
*/
490-
491-
#ifndef __cold
492-
#define __cold
493-
#endif
494-
495-
/* Simple shorthand for a section definition */
496-
#ifndef __section
497-
# define __section(S) __attribute__ ((__section__(#S)))
498-
#endif
499-
500-
#ifndef __visible
501-
#define __visible
502-
#endif
503-
504-
#ifndef __nostackprotector
505-
# define __nostackprotector
506-
#endif
507-
508-
/*
509-
* Assume alignment of return value.
510-
*/
511-
#ifndef __assume_aligned
512-
#define __assume_aligned(a, ...)
513-
#endif
514-
515-
516-
/* Are two types/vars the same type (ignoring qualifiers)? */
517-
#ifndef __same_type
518-
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
519-
#endif
520-
521-
/* Is this type a native word size -- useful for atomic operations */
522-
#ifndef __native_word
523-
# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
524-
#endif
525-
526267
/* Compile time object size, -1 for unknown */
527268
#ifndef __compiletime_object_size
528269
# define __compiletime_object_size(obj) -1

0 commit comments

Comments
 (0)