| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #ifndef _TOOLS_LINUX_COMPILER_H_
- #define _TOOLS_LINUX_COMPILER_H_
- #ifndef __ASSEMBLY__
- #include <linux/compiler_types.h>
- #ifndef __compiletime_error
- # define __compiletime_error(message)
- #endif
- #ifdef __OPTIMIZE__
- # define __compiletime_assert(condition, msg, prefix, suffix) \
- do { \
- extern void prefix ## suffix(void) __compiletime_error(msg); \
- if (!(condition)) \
- prefix ## suffix(); \
- } while (0)
- #else
- # define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
- #endif
- #define _compiletime_assert(condition, msg, prefix, suffix) \
- __compiletime_assert(condition, msg, prefix, suffix)
- /**
- * compiletime_assert - break build and emit msg if condition is false
- * @condition: a compile-time constant condition to check
- * @msg: a message to emit if condition is false
- *
- * In tradition of POSIX assert, this macro will break the build if the
- * supplied condition is *false*, emitting the supplied error message if the
- * compiler has support to do so.
- */
- #define compiletime_assert(condition, msg) \
- _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
- /* Optimization barrier */
- /* The "volatile" is due to gcc bugs */
- #define barrier() __asm__ __volatile__("": : :"memory")
- #ifndef __always_inline
- # define __always_inline inline __attribute__((always_inline))
- #endif
- #ifndef __always_unused
- #define __always_unused __attribute__((__unused__))
- #endif
- #ifndef __noreturn
- #define __noreturn __attribute__((__noreturn__))
- #endif
- #ifndef unreachable
- #define unreachable() __builtin_unreachable()
- #endif
- #ifndef noinline
- #define noinline
- #endif
- #ifndef __nocf_check
- #define __nocf_check __attribute__((nocf_check))
- #endif
- #ifndef __naked
- #define __naked __attribute__((__naked__))
- #endif
- /* 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
- /*
- * This returns a constant expression while determining if an argument is
- * a constant expression, most importantly without evaluating the argument.
- * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de>
- */
- #define __is_constexpr(x) \
- (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
- /*
- * Similar to statically_true() but produces a constant expression
- *
- * To be used in conjunction with macros, such as BUILD_BUG_ON_ZERO(),
- * which require their input to be a constant expression and for which
- * statically_true() would otherwise fail.
- *
- * This is a trade-off: const_true() requires all its operands to be
- * compile time constants. Else, it would always returns false even on
- * the most trivial cases like:
- *
- * true || non_const_var
- *
- * On the opposite, statically_true() is able to fold more complex
- * tautologies and will return true on expressions such as:
- *
- * !(non_const_var * 8 % 4)
- *
- * For the general case, statically_true() is better.
- */
- #define const_true(x) __builtin_choose_expr(__is_constexpr(x), x, false)
- #ifdef __ANDROID__
- /*
- * FIXME: Big hammer to get rid of tons of:
- * "warning: always_inline function might not be inlinable"
- *
- * At least on android-ndk-r12/platforms/android-24/arch-arm
- */
- #undef __always_inline
- #define __always_inline inline
- #endif
- #define __user
- #define __rcu
- #define __read_mostly
- #ifndef __attribute_const__
- # define __attribute_const__
- #endif
- #ifndef __maybe_unused
- # define __maybe_unused __attribute__((unused))
- #endif
- #ifndef __used
- # define __used __attribute__((__unused__))
- #endif
- #ifndef __packed
- # define __packed __attribute__((__packed__))
- #endif
- #ifndef __force
- # define __force
- #endif
- #ifndef __iomem
- # define __iomem
- #endif
- #ifndef __weak
- # define __weak __attribute__((weak))
- #endif
- #ifndef likely
- # define likely(x) __builtin_expect(!!(x), 1)
- #endif
- #ifndef unlikely
- # define unlikely(x) __builtin_expect(!!(x), 0)
- #endif
- #include <linux/types.h>
- /*
- * Following functions are taken from kernel sources and
- * break aliasing rules in their original form.
- *
- * While kernel is compiled with -fno-strict-aliasing,
- * perf uses -Wstrict-aliasing=3 which makes build fail
- * under gcc 4.4.
- *
- * Using extra __may_alias__ type to allow aliasing
- * in this case.
- */
- typedef __u8 __attribute__((__may_alias__)) __u8_alias_t;
- typedef __u16 __attribute__((__may_alias__)) __u16_alias_t;
- typedef __u32 __attribute__((__may_alias__)) __u32_alias_t;
- typedef __u64 __attribute__((__may_alias__)) __u64_alias_t;
- static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
- {
- switch (size) {
- case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break;
- case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break;
- case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break;
- case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break;
- default:
- barrier();
- __builtin_memcpy((void *)res, (const void *)p, size);
- barrier();
- }
- }
- static __always_inline void __write_once_size(volatile void *p, void *res, int size)
- {
- switch (size) {
- case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break;
- case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break;
- case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break;
- case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break;
- default:
- barrier();
- __builtin_memcpy((void *)p, (const void *)res, size);
- barrier();
- }
- }
- /*
- * Prevent the compiler from merging or refetching reads or writes. The
- * compiler is also forbidden from reordering successive instances of
- * READ_ONCE and WRITE_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 READ_ONCE or WRITE_ONCE in different C
- * statements.
- *
- * These two macros will also work on aggregate data types like structs or
- * unions. If the size of the accessed data type exceeds the word size of
- * the machine (e.g., 32 bits or 64 bits) READ_ONCE() and WRITE_ONCE() will
- * fall back to memcpy and print a compile-time warning.
- *
- * Their two major use cases are: (1) Mediating communication between
- * process-level code and irq/NMI handlers, all running on the same CPU,
- * and (2) Ensuring that the compiler does not fold, spindle, or otherwise
- * mutilate accesses that either do not require ordering or that interact
- * with an explicit memory barrier or atomic instruction that provides the
- * required ordering.
- */
- #define READ_ONCE(x) \
- ({ \
- union { typeof(x) __val; char __c[1]; } __u = \
- { .__c = { 0 } }; \
- __read_once_size(&(x), __u.__c, sizeof(x)); \
- __u.__val; \
- })
- #define WRITE_ONCE(x, val) \
- ({ \
- union { typeof(x) __val; char __c[1]; } __u = \
- { .__val = (val) }; \
- __write_once_size(&(x), __u.__c, sizeof(x)); \
- __u.__val; \
- })
- /* Indirect macros required for expanded argument pasting, eg. __LINE__. */
- #define ___PASTE(a, b) a##b
- #define __PASTE(a, b) ___PASTE(a, b)
- #ifndef OPTIMIZER_HIDE_VAR
- /* Make the optimizer believe the variable can be manipulated arbitrarily. */
- #define OPTIMIZER_HIDE_VAR(var) \
- __asm__ ("" : "=r" (var) : "0" (var))
- #endif
- #ifndef __BUILD_BUG_ON_ZERO_MSG
- #if defined(__clang__)
- #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)(sizeof(struct { int:(-!!(e)); })))
- #else
- #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);}))
- #endif
- #endif
- #endif /* __ASSEMBLY__ */
- #endif /* _TOOLS_LINUX_COMPILER_H */
|