Blame view

include/linux/compiler.h 8.49 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  #ifndef __LINUX_COMPILER_H
  #define __LINUX_COMPILER_H
  
  #ifndef __ASSEMBLY__
  
  #ifdef __CHECKER__
  # define __user		__attribute__((noderef, address_space(1)))
e0fdb0e05   Rusty Russell   percpu: add __per...
8
  # define __kernel	__attribute__((address_space(0)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
  # define __safe		__attribute__((safe))
  # define __force	__attribute__((force))
  # define __nocast	__attribute__((nocast))
  # define __iomem	__attribute__((noderef, address_space(2)))
c902e0a01   Josh Triplett   [PATCH] Pass spar...
13
14
15
16
  # 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)
dcc8e559e   Josh Triplett   [PATCH] Pass a lo...
17
  # define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0)
e0fdb0e05   Rusty Russell   percpu: add __per...
18
  # define __percpu	__attribute__((noderef, address_space(3)))
ca5ecddfa   Paul E. McKenney   rcu: define __rcu...
19
20
21
  #ifdef CONFIG_SPARSE_RCU_POINTER
  # define __rcu		__attribute__((noderef, address_space(4)))
  #else
71d1d5c72   Paul E. McKenney   rcu: add __rcu AP...
22
  # define __rcu
ca5ecddfa   Paul E. McKenney   rcu: define __rcu...
23
  #endif
c47ffe3d3   Al Viro   make __chk_{user,...
24
25
  extern void __chk_user_ptr(const volatile void __user *);
  extern void __chk_io_ptr(const volatile void __iomem *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  #else
  # define __user
  # 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 __acquires(x)
  # define __releases(x)
  # define __acquire(x) (void)0
  # define __release(x) (void)0
dcc8e559e   Josh Triplett   [PATCH] Pass a lo...
40
  # define __cond_lock(x,c) (c)
e0fdb0e05   Rusty Russell   percpu: add __per...
41
  # define __percpu
71d1d5c72   Paul E. McKenney   rcu: add __rcu AP...
42
  # define __rcu
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
  #endif
  
  #ifdef __KERNEL__
f153b8212   Linus Torvalds   Sanitize gcc vers...
46
47
  #ifdef __GNUC__
  #include <linux/compiler-gcc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  #endif
28614889b   Steven Rostedt   ftrace: move notr...
49
  #define notrace __attribute__((no_instrument_function))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
54
55
56
57
58
59
60
61
  /* Intel compiler defines __GNUC__. So we will overwrite implementations
   * coming from above header files here
   */
  #ifdef __INTEL_COMPILER
  # include <linux/compiler-intel.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
   */
2ed84eeb8   Steven Rostedt   trace: rename unl...
62
  struct ftrace_branch_data {
1f0d69a9f   Steven Rostedt   tracing: profile ...
63
64
65
  	const char *func;
  	const char *file;
  	unsigned line;
2bcd521a6   Steven Rostedt   trace: profile al...
66
67
68
69
70
71
72
73
74
  	union {
  		struct {
  			unsigned long correct;
  			unsigned long incorrect;
  		};
  		struct {
  			unsigned long miss;
  			unsigned long hit;
  		};
97e7e4f39   Witold Baryluk   tracing: optimiza...
75
  		unsigned long miss_hit[2];
2bcd521a6   Steven Rostedt   trace: profile al...
76
  	};
1f0d69a9f   Steven Rostedt   tracing: profile ...
77
  };
2ed84eeb8   Steven Rostedt   trace: rename unl...
78
79
80
81
82
  
  /*
   * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
   * to disable branch tracing on a per file basis.
   */
d9ad8bc0c   Bart Van Assche   branch tracer: Fi...
83
84
  #if defined(CONFIG_TRACE_BRANCH_PROFILING) \
      && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
2ed84eeb8   Steven Rostedt   trace: rename unl...
85
  void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
1f0d69a9f   Steven Rostedt   tracing: profile ...
86
87
88
  
  #define likely_notrace(x)	__builtin_expect(!!(x), 1)
  #define unlikely_notrace(x)	__builtin_expect(!!(x), 0)
45b797492   Steven Rostedt   trace: consolidat...
89
  #define __branch_check__(x, expect) ({					\
1f0d69a9f   Steven Rostedt   tracing: profile ...
90
  			int ______r;					\
2ed84eeb8   Steven Rostedt   trace: rename unl...
91
  			static struct ftrace_branch_data		\
1f0d69a9f   Steven Rostedt   tracing: profile ...
92
  				__attribute__((__aligned__(4)))		\
45b797492   Steven Rostedt   trace: consolidat...
93
  				__attribute__((section("_ftrace_annotated_branch"))) \
1f0d69a9f   Steven Rostedt   tracing: profile ...
94
95
96
97
98
  				______f = {				\
  				.func = __func__,			\
  				.file = __FILE__,			\
  				.line = __LINE__,			\
  			};						\
1f0d69a9f   Steven Rostedt   tracing: profile ...
99
  			______r = likely_notrace(x);			\
45b797492   Steven Rostedt   trace: consolidat...
100
  			ftrace_likely_update(&______f, ______r, expect); \
1f0d69a9f   Steven Rostedt   tracing: profile ...
101
102
103
104
105
106
107
108
109
  			______r;					\
  		})
  
  /*
   * Using __builtin_constant_p(x) to ignore cases where the return
   * value is always the same.  This idea is taken from a similar patch
   * written by Daniel Walker.
   */
  # ifndef likely
45b797492   Steven Rostedt   trace: consolidat...
110
  #  define likely(x)	(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
1f0d69a9f   Steven Rostedt   tracing: profile ...
111
112
  # endif
  # ifndef unlikely
45b797492   Steven Rostedt   trace: consolidat...
113
  #  define unlikely(x)	(__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
1f0d69a9f   Steven Rostedt   tracing: profile ...
114
  # endif
2bcd521a6   Steven Rostedt   trace: profile al...
115
116
117
118
119
120
  
  #ifdef CONFIG_PROFILE_ALL_BRANCHES
  /*
   * "Define 'is'", Bill Clinton
   * "Define 'if'", Steven Rostedt
   */
ab3c9c686   Linus Torvalds   branch tracer, in...
121
122
123
  #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
  #define __trace_if(cond) \
  	if (__builtin_constant_p((cond)) ? !!(cond) :			\
2bcd521a6   Steven Rostedt   trace: profile al...
124
125
126
127
128
129
130
131
132
133
134
  	({								\
  		int ______r;						\
  		static struct ftrace_branch_data			\
  			__attribute__((__aligned__(4)))			\
  			__attribute__((section("_ftrace_branch")))	\
  			______f = {					\
  				.func = __func__,			\
  				.file = __FILE__,			\
  				.line = __LINE__,			\
  			};						\
  		______r = !!(cond);					\
97e7e4f39   Witold Baryluk   tracing: optimiza...
135
  		______f.miss_hit[______r]++;					\
2bcd521a6   Steven Rostedt   trace: profile al...
136
137
138
  		______r;						\
  	}))
  #endif /* CONFIG_PROFILE_ALL_BRANCHES */
1f0d69a9f   Steven Rostedt   tracing: profile ...
139
140
141
142
  #else
  # define likely(x)	__builtin_expect(!!(x), 1)
  # define unlikely(x)	__builtin_expect(!!(x), 0)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
145
146
147
  
  /* Optimization barrier */
  #ifndef barrier
  # define barrier() __memory_barrier()
  #endif
38938c879   David Daney   Add support for G...
148
149
150
151
  /* Unreachable code */
  #ifndef unreachable
  # define unreachable() do { } while (1)
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
152
153
154
155
156
157
158
159
160
161
  #ifndef RELOC_HIDE
  # define RELOC_HIDE(ptr, off)					\
    ({ unsigned long __ptr;					\
       __ptr = (unsigned long) (ptr);				\
      (typeof(ptr)) (__ptr + (off)); })
  #endif
  
  #endif /* __KERNEL__ */
  
  #endif /* __ASSEMBLY__ */
4f79c3ffc   David Woodhouse   Guard some of lin...
162
  #ifdef __KERNEL__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
165
166
167
168
169
170
171
  /*
   * 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
512345be2   Paul E. McKenney   [PATCH] Add depre...
172
173
174
175
176
  #ifdef MODULE
  #define __deprecated_for_modules __deprecated
  #else
  #define __deprecated_for_modules
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
  #ifndef __must_check
  #define __must_check
  #endif
cebc04ba9   Andrew Morton   add CONFIG_ENABLE...
180
181
182
183
  #ifndef CONFIG_ENABLE_MUST_CHECK
  #undef __must_check
  #define __must_check
  #endif
de4884439   Jeff Garzik   Permit silencing ...
184
185
186
187
188
189
  #ifndef CONFIG_ENABLE_WARN_DEPRECATED
  #undef __deprecated
  #undef __deprecated_for_modules
  #define __deprecated
  #define __deprecated_for_modules
  #endif
cebc04ba9   Andrew Morton   add CONFIG_ENABLE...
190

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
194
  /*
   * 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.
   *
0d7ebbbc6   David Rientjes   compiler: introdu...
195
196
   * 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
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
198
   * marked will not be elided, but this may change in a future gcc version.
   *
0d7ebbbc6   David Rientjes   compiler: introdu...
199
200
201
202
   * 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.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
   * In prior versions of gcc, such functions and data would be emitted, but
   * would be warned about except with attribute((unused)).
0d7ebbbc6   David Rientjes   compiler: introdu...
205
206
207
   *
   * Mark functions that are referenced only in inline assembly as __used so
   * the code is emitted even though it appears to be unreferenced.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
   */
0d7ebbbc6   David Rientjes   compiler: introdu...
209
210
211
212
213
214
  #ifndef __used
  # define __used			/* unimplemented */
  #endif
  
  #ifndef __maybe_unused
  # define __maybe_unused		/* unimplemented */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  #endif
7b2a35132   Li Zefan   compiler: Introdu...
216
217
218
  #ifndef __always_unused
  # define __always_unused	/* unimplemented */
  #endif
423bc7b22   David Woodhouse   Restore __attribu...
219
220
221
  #ifndef noinline
  #define noinline
  #endif
735c4fb91   Andrew Morton   add noinline_for_...
222
223
224
225
226
  /*
   * Rather then using noinline to prevent stack consumption, use
   * noinline_for_stack instead.  For documentaiton reasons.
   */
  #define noinline_for_stack noinline
423bc7b22   David Woodhouse   Restore __attribu...
227
228
229
230
231
  #ifndef __always_inline
  #define __always_inline inline
  #endif
  
  #endif /* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  /*
   * 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
a586df067   Andi Kleen   x86: Support __at...
249
250
251
252
253
254
255
256
  /*
   * 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
f3fe866d5   Sam Ravnborg   compiler.h: intro...
257
258
259
260
  /* Simple shorthand for a section definition */
  #ifndef __section
  # define __section(S) __attribute__ ((__section__(#S)))
  #endif
d2c123c27   Rusty Russell   module_param: add...
261
262
263
264
  /* 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
9f0cf4adb   Arjan van de Ven   x86: Use __builti...
265
266
267
268
  /* Compile time object size, -1 for unknown */
  #ifndef __compiletime_object_size
  # define __compiletime_object_size(obj) -1
  #endif
4a3127693   Arjan van de Ven   x86: Turn the cop...
269
270
271
  #ifndef __compiletime_warning
  # define __compiletime_warning(message)
  #endif
63312b6a6   Arjan van de Ven   x86: Add a Kconfi...
272
273
274
  #ifndef __compiletime_error
  # define __compiletime_error(message)
  #endif
1399ff86f   David Daney   kernel.h: add BUI...
275
276
277
  #ifndef __linktime_error
  # define __linktime_error(message)
  #endif
9c3cdc1f8   Linus Torvalds   Move ACCESS_ONCE(...
278
279
280
281
282
283
284
285
  /*
   * Prevent the compiler from merging or refetching accesses.  The compiler
   * is also forbidden from reordering successive instances of ACCESS_ONCE(),
   * but only when the compiler is aware of some particular ordering.  One way
   * to make the compiler aware of ordering is to put the two invocations of
   * ACCESS_ONCE() in different C statements.
   *
   * This macro does absolutely -nothing- to prevent the CPU from reordering,
ded00a56e   Paul E. McKenney   rcu: remove redun...
286
287
288
   * merging, or refetching absolutely anything at any time.  Its main intended
   * use is to mediate communication between process-level code and irq/NMI
   * handlers, all running on the same CPU.
9c3cdc1f8   Linus Torvalds   Move ACCESS_ONCE(...
289
290
   */
  #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
  #endif /* __LINUX_COMPILER_H */