~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/compiler.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __LINUX_COMPILER_H
  3 #define __LINUX_COMPILER_H
  4 
  5 #include <linux/compiler_types.h>
  6 
  7 #ifndef __ASSEMBLY__
  8 
  9 #ifdef __KERNEL__
 10 
 11 /*
 12  * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
 13  * to disable branch tracing on a per file basis.
 14  */
 15 void ftrace_likely_update(struct ftrace_likely_data *f, int val,
 16                           int expect, int is_constant);
 17 #if defined(CONFIG_TRACE_BRANCH_PROFILING) \
 18     && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
 19 #define likely_notrace(x)       __builtin_expect(!!(x), 1)
 20 #define unlikely_notrace(x)     __builtin_expect(!!(x), 0)
 21 
 22 #define __branch_check__(x, expect, is_constant) ({                     \
 23                         long ______r;                                   \
 24                         static struct ftrace_likely_data                \
 25                                 __aligned(4)                            \
 26                                 __section("_ftrace_annotated_branch")   \
 27                                 ______f = {                             \
 28                                 .data.func = __func__,                  \
 29                                 .data.file = __FILE__,                  \
 30                                 .data.line = __LINE__,                  \
 31                         };                                              \
 32                         ______r = __builtin_expect(!!(x), expect);      \
 33                         ftrace_likely_update(&______f, ______r,         \
 34                                              expect, is_constant);      \
 35                         ______r;                                        \
 36                 })
 37 
 38 /*
 39  * Using __builtin_constant_p(x) to ignore cases where the return
 40  * value is always the same.  This idea is taken from a similar patch
 41  * written by Daniel Walker.
 42  */
 43 # ifndef likely
 44 #  define likely(x)     (__branch_check__(x, 1, __builtin_constant_p(x)))
 45 # endif
 46 # ifndef unlikely
 47 #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
 48 # endif
 49 
 50 #ifdef CONFIG_PROFILE_ALL_BRANCHES
 51 /*
 52  * "Define 'is'", Bill Clinton
 53  * "Define 'if'", Steven Rostedt
 54  */
 55 #define if(cond, ...) if ( __trace_if_var( !!(cond , ## __VA_ARGS__) ) )
 56 
 57 #define __trace_if_var(cond) (__builtin_constant_p(cond) ? (cond) : __trace_if_value(cond))
 58 
 59 #define __trace_if_value(cond) ({                       \
 60         static struct ftrace_branch_data                \
 61                 __aligned(4)                            \
 62                 __section("_ftrace_branch")             \
 63                 __if_trace = {                          \
 64                         .func = __func__,               \
 65                         .file = __FILE__,               \
 66                         .line = __LINE__,               \
 67                 };                                      \
 68         (cond) ?                                        \
 69                 (__if_trace.miss_hit[1]++,1) :          \
 70                 (__if_trace.miss_hit[0]++,0);           \
 71 })
 72 
 73 #endif /* CONFIG_PROFILE_ALL_BRANCHES */
 74 
 75 #else
 76 # define likely(x)      __builtin_expect(!!(x), 1)
 77 # define unlikely(x)    __builtin_expect(!!(x), 0)
 78 # define likely_notrace(x)      likely(x)
 79 # define unlikely_notrace(x)    unlikely(x)
 80 #endif
 81 
 82 /* Optimization barrier */
 83 #ifndef barrier
 84 /* The "volatile" is due to gcc bugs */
 85 # define barrier() __asm__ __volatile__("": : :"memory")
 86 #endif
 87 
 88 #ifndef barrier_data
 89 /*
 90  * This version is i.e. to prevent dead stores elimination on @ptr
 91  * where gcc and llvm may behave differently when otherwise using
 92  * normal barrier(): while gcc behavior gets along with a normal
 93  * barrier(), llvm needs an explicit input variable to be assumed
 94  * clobbered. The issue is as follows: while the inline asm might
 95  * access any memory it wants, the compiler could have fit all of
 96  * @ptr into memory registers instead, and since @ptr never escaped
 97  * from that, it proved that the inline asm wasn't touching any of
 98  * it. This version works well with both compilers, i.e. we're telling
 99  * the compiler that the inline asm absolutely may see the contents
100  * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
101  */
102 # define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
103 #endif
104 
105 /* workaround for GCC PR82365 if needed */
106 #ifndef barrier_before_unreachable
107 # define barrier_before_unreachable() do { } while (0)
108 #endif
109 
110 /* Unreachable code */
111 #ifdef CONFIG_OBJTOOL
112 /*
113  * These macros help objtool understand GCC code flow for unreachable code.
114  * The __COUNTER__ based labels are a hack to make each instance of the macros
115  * unique, to convince GCC not to merge duplicate inline asm statements.
116  */
117 #define __stringify_label(n) #n
118 
119 #define __annotate_reachable(c) ({                                      \
120         asm volatile(__stringify_label(c) ":\n\t"                       \
121                         ".pushsection .discard.reachable\n\t"           \
122                         ".long " __stringify_label(c) "b - .\n\t"       \
123                         ".popsection\n\t");                             \
124 })
125 #define annotate_reachable() __annotate_reachable(__COUNTER__)
126 
127 #define __annotate_unreachable(c) ({                                    \
128         asm volatile(__stringify_label(c) ":\n\t"                       \
129                      ".pushsection .discard.unreachable\n\t"            \
130                      ".long " __stringify_label(c) "b - .\n\t"          \
131                      ".popsection\n\t" : : "i" (c));                    \
132 })
133 #define annotate_unreachable() __annotate_unreachable(__COUNTER__)
134 
135 /* Annotate a C jump table to allow objtool to follow the code flow */
136 #define __annotate_jump_table __section(".rodata..c_jump_table,\"a\",@progbits #")
137 
138 #else /* !CONFIG_OBJTOOL */
139 #define annotate_reachable()
140 #define annotate_unreachable()
141 #define __annotate_jump_table
142 #endif /* CONFIG_OBJTOOL */
143 
144 #ifndef unreachable
145 # define unreachable() do {             \
146         annotate_unreachable();         \
147         __builtin_unreachable();        \
148 } while (0)
149 #endif
150 
151 /*
152  * KENTRY - kernel entry point
153  * This can be used to annotate symbols (functions or data) that are used
154  * without their linker symbol being referenced explicitly. For example,
155  * interrupt vector handlers, or functions in the kernel image that are found
156  * programatically.
157  *
158  * Not required for symbols exported with EXPORT_SYMBOL, or initcalls. Those
159  * are handled in their own way (with KEEP() in linker scripts).
160  *
161  * KENTRY can be avoided if the symbols in question are marked as KEEP() in the
162  * linker script. For example an architecture could KEEP() its entire
163  * boot/exception vector code rather than annotate each function and data.
164  */
165 #ifndef KENTRY
166 # define KENTRY(sym)                                            \
167         extern typeof(sym) sym;                                 \
168         static const unsigned long __kentry_##sym               \
169         __used                                                  \
170         __attribute__((__section__("___kentry+" #sym)))         \
171         = (unsigned long)&sym;
172 #endif
173 
174 #ifndef RELOC_HIDE
175 # define RELOC_HIDE(ptr, off)                                   \
176   ({ unsigned long __ptr;                                       \
177      __ptr = (unsigned long) (ptr);                             \
178     (typeof(ptr)) (__ptr + (off)); })
179 #endif
180 
181 #define absolute_pointer(val)   RELOC_HIDE((void *)(val), 0)
182 
183 #ifndef OPTIMIZER_HIDE_VAR
184 /* Make the optimizer believe the variable can be manipulated arbitrarily. */
185 #define OPTIMIZER_HIDE_VAR(var)                                         \
186         __asm__ ("" : "=r" (var) : "" (var))
187 #endif
188 
189 #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
190 
191 /**
192  * data_race - mark an expression as containing intentional data races
193  *
194  * This data_race() macro is useful for situations in which data races
195  * should be forgiven.  One example is diagnostic code that accesses
196  * shared variables but is not a part of the core synchronization design.
197  * For example, if accesses to a given variable are protected by a lock,
198  * except for diagnostic code, then the accesses under the lock should
199  * be plain C-language accesses and those in the diagnostic code should
200  * use data_race().  This way, KCSAN will complain if buggy lockless
201  * accesses to that variable are introduced, even if the buggy accesses
202  * are protected by READ_ONCE() or WRITE_ONCE().
203  *
204  * This macro *does not* affect normal code generation, but is a hint
205  * to tooling that data races here are to be ignored.  If the access must
206  * be atomic *and* KCSAN should ignore the access, use both data_race()
207  * and READ_ONCE(), for example, data_race(READ_ONCE(x)).
208  */
209 #define data_race(expr)                                                 \
210 ({                                                                      \
211         __kcsan_disable_current();                                      \
212         __auto_type __v = (expr);                                       \
213         __kcsan_enable_current();                                       \
214         __v;                                                            \
215 })
216 
217 #endif /* __KERNEL__ */
218 
219 /*
220  * Force the compiler to emit 'sym' as a symbol, so that we can reference
221  * it from inline assembler. Necessary in case 'sym' could be inlined
222  * otherwise, or eliminated entirely due to lack of references that are
223  * visible to the compiler.
224  */
225 #define ___ADDRESSABLE(sym, __attrs) \
226         static void * __used __attrs \
227         __UNIQUE_ID(__PASTE(__addressable_,sym)) = (void *)(uintptr_t)&sym;
228 #define __ADDRESSABLE(sym) \
229         ___ADDRESSABLE(sym, __section(".discard.addressable"))
230 
231 /**
232  * offset_to_ptr - convert a relative memory offset to an absolute pointer
233  * @off:        the address of the 32-bit offset value
234  */
235 static inline void *offset_to_ptr(const int *off)
236 {
237         return (void *)((unsigned long)off + *off);
238 }
239 
240 #endif /* __ASSEMBLY__ */
241 
242 /* &a[0] degrades to a pointer: a different type from an array */
243 #define __must_be_array(a)      BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
244 
245 /*
246  * This returns a constant expression while determining if an argument is
247  * a constant expression, most importantly without evaluating the argument.
248  * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
249  *
250  * Details:
251  * - sizeof() return an integer constant expression, and does not evaluate
252  *   the value of its operand; it only examines the type of its operand.
253  * - The results of comparing two integer constant expressions is also
254  *   an integer constant expression.
255  * - The first literal "8" isn't important. It could be any literal value.
256  * - The second literal "8" is to avoid warnings about unaligned pointers;
257  *   this could otherwise just be "1".
258  * - (long)(x) is used to avoid warnings about 64-bit types on 32-bit
259  *   architectures.
260  * - The C Standard defines "null pointer constant", "(void *)0", as
261  *   distinct from other void pointers.
262  * - If (x) is an integer constant expression, then the "* 0l" resolves
263  *   it into an integer constant expression of value 0. Since it is cast to
264  *   "void *", this makes the second operand a null pointer constant.
265  * - If (x) is not an integer constant expression, then the second operand
266  *   resolves to a void pointer (but not a null pointer constant: the value
267  *   is not an integer constant 0).
268  * - The conditional operator's third operand, "(int *)8", is an object
269  *   pointer (to type "int").
270  * - The behavior (including the return type) of the conditional operator
271  *   ("operand1 ? operand2 : operand3") depends on the kind of expressions
272  *   given for the second and third operands. This is the central mechanism
273  *   of the macro:
274  *   - When one operand is a null pointer constant (i.e. when x is an integer
275  *     constant expression) and the other is an object pointer (i.e. our
276  *     third operand), the conditional operator returns the type of the
277  *     object pointer operand (i.e. "int *"). Here, within the sizeof(), we
278  *     would then get:
279  *       sizeof(*((int *)(...))  == sizeof(int)  == 4
280  *   - When one operand is a void pointer (i.e. when x is not an integer
281  *     constant expression) and the other is an object pointer (i.e. our
282  *     third operand), the conditional operator returns a "void *" type.
283  *     Here, within the sizeof(), we would then get:
284  *       sizeof(*((void *)(...)) == sizeof(void) == 1
285  * - The equality comparison to "sizeof(int)" therefore depends on (x):
286  *     sizeof(int) == sizeof(int)     (x) was a constant expression
287  *     sizeof(int) != sizeof(void)    (x) was not a constant expression
288  */
289 #define __is_constexpr(x) \
290         (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
291 
292 /*
293  * Whether 'type' is a signed type or an unsigned type. Supports scalar types,
294  * bool and also pointer types.
295  */
296 #define is_signed_type(type) (((type)(-1)) < (__force type)1)
297 #define is_unsigned_type(type) (!is_signed_type(type))
298 
299 /*
300  * Useful shorthand for "is this condition known at compile-time?"
301  *
302  * Note that the condition may involve non-constant values,
303  * but the compiler may know enough about the details of the
304  * values to determine that the condition is statically true.
305  */
306 #define statically_true(x) (__builtin_constant_p(x) && (x))
307 
308 /*
309  * This is needed in functions which generate the stack canary, see
310  * arch/x86/kernel/smpboot.c::start_secondary() for an example.
311  */
312 #define prevent_tail_call_optimization()        mb()
313 
314 #include <asm/rwonce.h>
315 
316 #endif /* __LINUX_COMPILER_H */
317 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php