File Index
Files and directories
Sign in
FILE

compiler.h

File preview with syntax highlighting.

linux-6.19.14/tools/include/linux/compiler.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _TOOLS_LINUX_COMPILER_H_
  3#define _TOOLS_LINUX_COMPILER_H_
  4
  5#ifndef __ASSEMBLY__
  6
  7#include <linux/compiler_types.h>
  8
  9#ifndef __compiletime_error
 10# define __compiletime_error(message)
 11#endif
 12
 13#ifdef __OPTIMIZE__
 14# define __compiletime_assert(condition, msg, prefix, suffix)		\
 15	do {								\
 16		extern void prefix ## suffix(void) __compiletime_error(msg); \
 17		if (!(condition))					\
 18			prefix ## suffix();				\
 19	} while (0)
 20#else
 21# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
 22#endif
 23
 24#define _compiletime_assert(condition, msg, prefix, suffix) \
 25	__compiletime_assert(condition, msg, prefix, suffix)
 26
 27/**
 28 * compiletime_assert - break build and emit msg if condition is false
 29 * @condition: a compile-time constant condition to check
 30 * @msg:       a message to emit if condition is false
 31 *
 32 * In tradition of POSIX assert, this macro will break the build if the
 33 * supplied condition is *false*, emitting the supplied error message if the
 34 * compiler has support to do so.
 35 */
 36#define compiletime_assert(condition, msg) \
 37	_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
 38
 39/* Optimization barrier */
 40/* The "volatile" is due to gcc bugs */
 41#define barrier() __asm__ __volatile__("": : :"memory")
 42
 43#ifndef __always_inline
 44# define __always_inline	inline __attribute__((always_inline))
 45#endif
 46
 47#ifndef __always_unused
 48#define __always_unused __attribute__((__unused__))
 49#endif
 50
 51#ifndef __noreturn
 52#define __noreturn __attribute__((__noreturn__))
 53#endif
 54
 55#ifndef unreachable
 56#define unreachable() __builtin_unreachable()
 57#endif
 58
 59#ifndef noinline
 60#define noinline
 61#endif
 62
 63#ifndef __nocf_check
 64#define __nocf_check __attribute__((nocf_check))
 65#endif
 66
 67#ifndef __naked
 68#define __naked __attribute__((__naked__))
 69#endif
 70
 71/* Are two types/vars the same type (ignoring qualifiers)? */
 72#ifndef __same_type
 73# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
 74#endif
 75
 76/*
 77 * This returns a constant expression while determining if an argument is
 78 * a constant expression, most importantly without evaluating the argument.
 79 * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
 80 */
 81#define __is_constexpr(x) \
 82	(sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
 83
 84/*
 85 * Similar to statically_true() but produces a constant expression
 86 *
 87 * To be used in conjunction with macros, such as BUILD_BUG_ON_ZERO(),
 88 * which require their input to be a constant expression and for which
 89 * statically_true() would otherwise fail.
 90 *
 91 * This is a trade-off: const_true() requires all its operands to be
 92 * compile time constants. Else, it would always returns false even on
 93 * the most trivial cases like:
 94 *
 95 *   true || non_const_var
 96 *
 97 * On the opposite, statically_true() is able to fold more complex
 98 * tautologies and will return true on expressions such as:
 99 *
100 *   !(non_const_var * 8 % 4)
101 *
102 * For the general case, statically_true() is better.
103 */
104#define const_true(x) __builtin_choose_expr(__is_constexpr(x), x, false)
105
106#ifdef __ANDROID__
107/*
108 * FIXME: Big hammer to get rid of tons of:
109 *   "warning: always_inline function might not be inlinable"
110 *
111 * At least on android-ndk-r12/platforms/android-24/arch-arm
112 */
113#undef __always_inline
114#define __always_inline	inline
115#endif
116
117#define __user
118#define __rcu
119#define __read_mostly
120
121#ifndef __attribute_const__
122# define __attribute_const__
123#endif
124
125#ifndef __maybe_unused
126# define __maybe_unused		__attribute__((unused))
127#endif
128
129#ifndef __used
130# define __used		__attribute__((__unused__))
131#endif
132
133#ifndef __packed
134# define __packed		__attribute__((__packed__))
135#endif
136
137#ifndef __force
138# define __force
139#endif
140
141#ifndef __iomem
142# define __iomem
143#endif
144
145#ifndef __weak
146# define __weak			__attribute__((weak))
147#endif
148
149#ifndef likely
150# define likely(x)		__builtin_expect(!!(x), 1)
151#endif
152
153#ifndef unlikely
154# define unlikely(x)		__builtin_expect(!!(x), 0)
155#endif
156
157#include <linux/types.h>
158
159/*
160 * Following functions are taken from kernel sources and
161 * break aliasing rules in their original form.
162 *
163 * While kernel is compiled with -fno-strict-aliasing,
164 * perf uses -Wstrict-aliasing=3 which makes build fail
165 * under gcc 4.4.
166 *
167 * Using extra __may_alias__ type to allow aliasing
168 * in this case.
169 */
170typedef __u8  __attribute__((__may_alias__))  __u8_alias_t;
171typedef __u16 __attribute__((__may_alias__)) __u16_alias_t;
172typedef __u32 __attribute__((__may_alias__)) __u32_alias_t;
173typedef __u64 __attribute__((__may_alias__)) __u64_alias_t;
174
175static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
176{
177	switch (size) {
178	case 1: *(__u8_alias_t  *) res = *(volatile __u8_alias_t  *) p; break;
179	case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break;
180	case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break;
181	case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break;
182	default:
183		barrier();
184		__builtin_memcpy((void *)res, (const void *)p, size);
185		barrier();
186	}
187}
188
189static __always_inline void __write_once_size(volatile void *p, void *res, int size)
190{
191	switch (size) {
192	case 1: *(volatile  __u8_alias_t *) p = *(__u8_alias_t  *) res; break;
193	case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break;
194	case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break;
195	case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break;
196	default:
197		barrier();
198		__builtin_memcpy((void *)p, (const void *)res, size);
199		barrier();
200	}
201}
202
203/*
204 * Prevent the compiler from merging or refetching reads or writes. The
205 * compiler is also forbidden from reordering successive instances of
206 * READ_ONCE and WRITE_ONCE, but only when the compiler is aware of some
207 * particular ordering. One way to make the compiler aware of ordering is to
208 * put the two invocations of READ_ONCE or WRITE_ONCE in different C
209 * statements.
210 *
211 * These two macros will also work on aggregate data types like structs or
212 * unions. If the size of the accessed data type exceeds the word size of
213 * the machine (e.g., 32 bits or 64 bits) READ_ONCE() and WRITE_ONCE() will
214 * fall back to memcpy and print a compile-time warning.
215 *
216 * Their two major use cases are: (1) Mediating communication between
217 * process-level code and irq/NMI handlers, all running on the same CPU,
218 * and (2) Ensuring that the compiler does not fold, spindle, or otherwise
219 * mutilate accesses that either do not require ordering or that interact
220 * with an explicit memory barrier or atomic instruction that provides the
221 * required ordering.
222 */
223
224#define READ_ONCE(x)					\
225({							\
226	union { typeof(x) __val; char __c[1]; } __u =	\
227		{ .__c = { 0 } };			\
228	__read_once_size(&(x), __u.__c, sizeof(x));	\
229	__u.__val;					\
230})
231
232#define WRITE_ONCE(x, val)				\
233({							\
234	union { typeof(x) __val; char __c[1]; } __u =	\
235		{ .__val = (val) }; 			\
236	__write_once_size(&(x), __u.__c, sizeof(x));	\
237	__u.__val;					\
238})
239
240
241/* Indirect macros required for expanded argument pasting, eg. __LINE__. */
242#define ___PASTE(a, b) a##b
243#define __PASTE(a, b) ___PASTE(a, b)
244
245#ifndef OPTIMIZER_HIDE_VAR
246/* Make the optimizer believe the variable can be manipulated arbitrarily. */
247#define OPTIMIZER_HIDE_VAR(var)						\
248	__asm__ ("" : "=r" (var) : "0" (var))
249#endif
250
251#ifndef __BUILD_BUG_ON_ZERO_MSG
252#if defined(__clang__)
253#define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)(sizeof(struct { int:(-!!(e)); })))
254#else
255#define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);}))
256#endif
257#endif
258
259#endif /* __ASSEMBLY__ */
260
261#endif /* _TOOLS_LINUX_COMPILER_H */
~/ Read-only file preview.