diff options
author | Will Deacon <will.deacon@arm.com> | 2017-10-24 06:22:46 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-10-24 07:17:32 -0400 |
commit | d15155824c5014803d91b829736d249c500bdda6 (patch) | |
tree | 5d71b9e3e5811a7804a6aa5d139fe5beee4d2ce8 /include/linux | |
parent | 9babb091e0ec84f7503fde0a2d9a2a16a0f48e3c (diff) |
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>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/compiler-clang.h | 2 | ||||
-rw-r--r-- | include/linux/compiler-gcc.h | 2 | ||||
-rw-r--r-- | include/linux/compiler-intel.h | 2 | ||||
-rw-r--r-- | include/linux/compiler.h | 265 | ||||
-rw-r--r-- | include/linux/compiler_types.h | 274 | ||||
-rw-r--r-- | include/linux/linkage.h | 2 |
6 files changed, 281 insertions, 266 deletions
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 @@ | |||
1 | #ifndef __LINUX_COMPILER_H | 1 | #ifndef __LINUX_COMPILER_TYPES_H |
2 | #error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead." | 2 | #error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead." |
3 | #endif | 3 | #endif |
4 | 4 | ||
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 @@ | |||
1 | #ifndef __LINUX_COMPILER_H | 1 | #ifndef __LINUX_COMPILER_TYPES_H |
2 | #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." | 2 | #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." |
3 | #endif | 3 | #endif |
4 | 4 | ||
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 @@ | |||
1 | #ifndef __LINUX_COMPILER_H | 1 | #ifndef __LINUX_COMPILER_TYPES_H |
2 | #error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead." | 2 | #error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead." |
3 | #endif | 3 | #endif |
4 | 4 | ||
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index e95a2631e545..08083186e54f 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -1,111 +1,12 @@ | |||
1 | #ifndef __LINUX_COMPILER_H | 1 | #ifndef __LINUX_COMPILER_H |
2 | #define __LINUX_COMPILER_H | 2 | #define __LINUX_COMPILER_H |
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #include <linux/compiler_types.h> |
5 | 5 | ||
6 | #ifdef __CHECKER__ | 6 | #ifndef __ASSEMBLY__ |
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) | ||
54 | 7 | ||
55 | #ifdef __KERNEL__ | 8 | #ifdef __KERNEL__ |
56 | 9 | ||
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 | |||
109 | /* | 10 | /* |
110 | * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code | 11 | * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code |
111 | * to disable branch tracing on a per file basis. | 12 | * 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 | |||
332 | * with an explicit memory barrier or atomic instruction that provides the | 233 | * with an explicit memory barrier or atomic instruction that provides the |
333 | * required ordering. | 234 | * required ordering. |
334 | */ | 235 | */ |
236 | #include <asm/barrier.h> | ||
335 | 237 | ||
336 | #define __READ_ONCE(x, check) \ | 238 | #define __READ_ONCE(x, check) \ |
337 | ({ \ | 239 | ({ \ |
@@ -362,167 +264,6 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s | |||
362 | 264 | ||
363 | #endif /* __ASSEMBLY__ */ | 265 | #endif /* __ASSEMBLY__ */ |
364 | 266 | ||
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 | |||
526 | /* Compile time object size, -1 for unknown */ | 267 | /* Compile time object size, -1 for unknown */ |
527 | #ifndef __compiletime_object_size | 268 | #ifndef __compiletime_object_size |
528 | # define __compiletime_object_size(obj) -1 | 269 | # define __compiletime_object_size(obj) -1 |
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 @@ | |||
1 | #ifndef __LINUX_COMPILER_TYPES_H | ||
2 | #define __LINUX_COMPILER_TYPES_H | ||
3 | |||
4 | #ifndef __ASSEMBLY__ | ||
5 | |||
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) | ||
54 | |||
55 | #ifdef __KERNEL__ | ||
56 | |||
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 | |||
109 | #endif /* __KERNEL__ */ | ||
110 | |||
111 | #endif /* __ASSEMBLY__ */ | ||
112 | |||
113 | #ifdef __KERNEL__ | ||
114 | /* | ||
115 | * Allow us to mark functions as 'deprecated' and have gcc emit a nice | ||
116 | * warning for each use, in hopes of speeding the functions removal. | ||
117 | * Usage is: | ||
118 | * int __deprecated foo(void) | ||
119 | */ | ||
120 | #ifndef __deprecated | ||
121 | # define __deprecated /* unimplemented */ | ||
122 | #endif | ||
123 | |||
124 | #ifdef MODULE | ||
125 | #define __deprecated_for_modules __deprecated | ||
126 | #else | ||
127 | #define __deprecated_for_modules | ||
128 | #endif | ||
129 | |||
130 | #ifndef __must_check | ||
131 | #define __must_check | ||
132 | #endif | ||
133 | |||
134 | #ifndef CONFIG_ENABLE_MUST_CHECK | ||
135 | #undef __must_check | ||
136 | #define __must_check | ||
137 | #endif | ||
138 | #ifndef CONFIG_ENABLE_WARN_DEPRECATED | ||
139 | #undef __deprecated | ||
140 | #undef __deprecated_for_modules | ||
141 | #define __deprecated | ||
142 | #define __deprecated_for_modules | ||
143 | #endif | ||
144 | |||
145 | #ifndef __malloc | ||
146 | #define __malloc | ||
147 | #endif | ||
148 | |||
149 | /* | ||
150 | * Allow us to avoid 'defined but not used' warnings on functions and data, | ||
151 | * as well as force them to be emitted to the assembly file. | ||
152 | * | ||
153 | * As of gcc 3.4, static functions that are not marked with attribute((used)) | ||
154 | * may be elided from the assembly file. As of gcc 3.4, static data not so | ||
155 | * marked will not be elided, but this may change in a future gcc version. | ||
156 | * | ||
157 | * NOTE: Because distributions shipped with a backported unit-at-a-time | ||
158 | * compiler in gcc 3.3, we must define __used to be __attribute__((used)) | ||
159 | * for gcc >=3.3 instead of 3.4. | ||
160 | * | ||
161 | * In prior versions of gcc, such functions and data would be emitted, but | ||
162 | * would be warned about except with attribute((unused)). | ||
163 | * | ||
164 | * Mark functions that are referenced only in inline assembly as __used so | ||
165 | * the code is emitted even though it appears to be unreferenced. | ||
166 | */ | ||
167 | #ifndef __used | ||
168 | # define __used /* unimplemented */ | ||
169 | #endif | ||
170 | |||
171 | #ifndef __maybe_unused | ||
172 | # define __maybe_unused /* unimplemented */ | ||
173 | #endif | ||
174 | |||
175 | #ifndef __always_unused | ||
176 | # define __always_unused /* unimplemented */ | ||
177 | #endif | ||
178 | |||
179 | #ifndef noinline | ||
180 | #define noinline | ||
181 | #endif | ||
182 | |||
183 | /* | ||
184 | * Rather then using noinline to prevent stack consumption, use | ||
185 | * noinline_for_stack instead. For documentation reasons. | ||
186 | */ | ||
187 | #define noinline_for_stack noinline | ||
188 | |||
189 | #ifndef __always_inline | ||
190 | #define __always_inline inline | ||
191 | #endif | ||
192 | |||
193 | #endif /* __KERNEL__ */ | ||
194 | |||
195 | /* | ||
196 | * From the GCC manual: | ||
197 | * | ||
198 | * Many functions do not examine any values except their arguments, | ||
199 | * and have no effects except the return value. Basically this is | ||
200 | * just slightly more strict class than the `pure' attribute above, | ||
201 | * since function is not allowed to read global memory. | ||
202 | * | ||
203 | * Note that a function that has pointer arguments and examines the | ||
204 | * data pointed to must _not_ be declared `const'. Likewise, a | ||
205 | * function that calls a non-`const' function usually must not be | ||
206 | * `const'. It does not make sense for a `const' function to return | ||
207 | * `void'. | ||
208 | */ | ||
209 | #ifndef __attribute_const__ | ||
210 | # define __attribute_const__ /* unimplemented */ | ||
211 | #endif | ||
212 | |||
213 | #ifndef __designated_init | ||
214 | # define __designated_init | ||
215 | #endif | ||
216 | |||
217 | #ifndef __latent_entropy | ||
218 | # define __latent_entropy | ||
219 | #endif | ||
220 | |||
221 | #ifndef __randomize_layout | ||
222 | # define __randomize_layout __designated_init | ||
223 | #endif | ||
224 | |||
225 | #ifndef __no_randomize_layout | ||
226 | # define __no_randomize_layout | ||
227 | #endif | ||
228 | |||
229 | #ifndef randomized_struct_fields_start | ||
230 | # define randomized_struct_fields_start | ||
231 | # define randomized_struct_fields_end | ||
232 | #endif | ||
233 | |||
234 | /* | ||
235 | * Tell gcc if a function is cold. The compiler will assume any path | ||
236 | * directly leading to the call is unlikely. | ||
237 | */ | ||
238 | |||
239 | #ifndef __cold | ||
240 | #define __cold | ||
241 | #endif | ||
242 | |||
243 | /* Simple shorthand for a section definition */ | ||
244 | #ifndef __section | ||
245 | # define __section(S) __attribute__ ((__section__(#S))) | ||
246 | #endif | ||
247 | |||
248 | #ifndef __visible | ||
249 | #define __visible | ||
250 | #endif | ||
251 | |||
252 | #ifndef __nostackprotector | ||
253 | # define __nostackprotector | ||
254 | #endif | ||
255 | |||
256 | /* | ||
257 | * Assume alignment of return value. | ||
258 | */ | ||
259 | #ifndef __assume_aligned | ||
260 | #define __assume_aligned(a, ...) | ||
261 | #endif | ||
262 | |||
263 | |||
264 | /* Are two types/vars the same type (ignoring qualifiers)? */ | ||
265 | #ifndef __same_type | ||
266 | # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) | ||
267 | #endif | ||
268 | |||
269 | /* Is this type a native word size -- useful for atomic operations */ | ||
270 | #ifndef __native_word | ||
271 | # define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) | ||
272 | #endif | ||
273 | |||
274 | #endif /* __LINUX_COMPILER_TYPES_H */ | ||
diff --git a/include/linux/linkage.h b/include/linux/linkage.h index a6a42dd02466..ebd61b80fed4 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _LINUX_LINKAGE_H | 1 | #ifndef _LINUX_LINKAGE_H |
2 | #define _LINUX_LINKAGE_H | 2 | #define _LINUX_LINKAGE_H |
3 | 3 | ||
4 | #include <linux/compiler.h> | 4 | #include <linux/compiler_types.h> |
5 | #include <linux/stringify.h> | 5 | #include <linux/stringify.h> |
6 | #include <linux/export.h> | 6 | #include <linux/export.h> |
7 | #include <asm/linkage.h> | 7 | #include <asm/linkage.h> |