Skip to content

Commit a977228

Browse files
wildea01gregkh
authored andcommitted
linux/compiler.h: Split into compiler.h and compiler_types.h
commit d15155824c5014803d91b829736d249c500bdda6 upstream. 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 <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Paul E. McKenney <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Thomas Gleixner <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent d605778 commit a977228

File tree

11 files changed

+286
-271
lines changed

11 files changed

+286
-271
lines changed

Diff for: arch/arm/include/asm/ptrace.h

+1-2
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);

Diff for: arch/sparc/include/asm/ptrace.h

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#if defined(__sparc__) && defined(__arch64__)
88
#ifndef __ASSEMBLY__
99

10+
#include <linux/compiler.h>
1011
#include <linux/threads.h>
1112
#include <asm/switch_to.h>
1213

Diff for: arch/um/include/shared/init.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
typedef int (*initcall_t)(void);
4242
typedef void (*exitcall_t)(void);
4343

44-
#include <linux/compiler.h>
44+
#include <linux/compiler_types.h>
4545

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

Diff for: include/linux/compiler-clang.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* SPDX-License-Identifier: GPL-2.0 */
2-
#ifndef __LINUX_COMPILER_H
2+
#ifndef __LINUX_COMPILER_TYPES_H
33
#error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead."
44
#endif
55

Diff for: include/linux/compiler-gcc.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* SPDX-License-Identifier: GPL-2.0 */
2-
#ifndef __LINUX_COMPILER_H
2+
#ifndef __LINUX_COMPILER_TYPES_H
33
#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
44
#endif
55

Diff for: include/linux/compiler-intel.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* SPDX-License-Identifier: GPL-2.0 */
2-
#ifndef __LINUX_COMPILER_H
2+
#ifndef __LINUX_COMPILER_TYPES_H
33
#error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead."
44
#endif
55

Diff for: include/linux/compiler.h

+3-262
Original file line numberDiff line numberDiff line change
@@ -2,111 +2,12 @@
22
#ifndef __LINUX_COMPILER_H
33
#define __LINUX_COMPILER_H
44

5-
#ifndef __ASSEMBLY__
5+
#include <linux/compiler_types.h>
66

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

569
#ifdef __KERNEL__
5710

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

337239
#define __READ_ONCE(x, check) \
338240
({ \
@@ -364,167 +266,6 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s
364266

365267
#endif /* __ASSEMBLY__ */
366268

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

0 commit comments

Comments
 (0)