118 lines
2.4 KiB
C
118 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _TOOLS_LINUX_COMPILER_H_
|
|
#define _TOOLS_LINUX_COMPILER_H_
|
|
|
|
#ifndef __compiletime_error
|
|
# define __compiletime_error(message)
|
|
#endif
|
|
|
|
/* 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 noinline
|
|
#define noinline
|
|
#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
|
|
|
|
#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 __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
|
|
|
|
#ifndef __init
|
|
# define __init
|
|
#endif
|
|
|
|
#ifndef noinline
|
|
# define noinline
|
|
#endif
|
|
|
|
#define uninitialized_var(x) x = *(&(x))
|
|
|
|
#ifndef __fallthrough
|
|
# define __fallthrough
|
|
#endif
|
|
|
|
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
|
|
|
|
#ifndef max
|
|
#define max(x, y) ({ \
|
|
typeof(x) _max1 = (x); \
|
|
typeof(y) _max2 = (y); \
|
|
(void) (&_max1 == &_max2); \
|
|
_max1 > _max2 ? _max1 : _max2; })
|
|
#endif
|
|
|
|
#ifndef min
|
|
#define min(x, y) ({ \
|
|
typeof(x) _min1 = (x); \
|
|
typeof(y) _min2 = (y); \
|
|
(void) (&_min1 == &_min2); \
|
|
_min1 < _min2 ? _min1 : _min2; })
|
|
#endif
|
|
|
|
#ifndef roundup
|
|
#define roundup(x, y) ( \
|
|
{ \
|
|
const typeof(y) __y = y; \
|
|
(((x) + (__y - 1)) / __y) * __y; \
|
|
} \
|
|
)
|
|
#endif
|
|
|
|
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
|
|
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
|
|
#define round_down(x, y) ((x) & ~__round_mask(x, y))
|
|
|
|
#endif /* _TOOLS_LINUX_COMPILER_H */ |