| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | #ifndef COMPILER_H#define COMPILER_H#ifndef __ASSEMBLY__#include <stddef.h>#include <errno.h>#include <inttypes.h>#include <limits.h>#include <stdarg.h>#include <stdbool.h>#include <stdlib.h>#ifdef __cplusplus# define extern_c extern "C"# define EXTERN_C(...) extern "C" { __VA_ARGS__ }#else# define extern_c extern# define EXTERN_C(...) __VA_ARGS__#endif#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))#undef  likely#define likely(x)	__builtin_expect(!!(x), 1)#undef  unlikely#define unlikely(x)	__builtin_expect(!!(x), 0)/* Handy composite pointer types */typedef union xptr {    uint32_t *l;    uint16_t *w;    uint8_t  *b;    void     *v;    size_t    a;} xptr_t;typedef union xcptr {    const uint32_t *l;    const uint16_t *w;    const uint8_t  *b;    const void     *v;    size_t          a;} xcptr_t;/* Subword types */typedef union {    uint8_t  b[8];    uint16_t h[4];    uint32_t l[2];    uint64_t q;} qword_t;typedef union {    uint8_t  b[4];    uint16_t h[2];    uint32_t l;} lword_t;typedef union {    uint8_t  b[2];    uint16_t h;} hword_t;/* The container_of construct: if p is a pointer to member m of   container class c, then return a pointer to the container of which   *p is a member. */#ifndef container_of# define container_of(p, c, m) ((c *)((char *)(p) - offsetof(c,m)))#endif#define offset_diff(c, m1, m2) ((ptrdiff_t)offsetof(c,m2) - \				(ptrdiff_t)offsetof(c,m1))/* Type-safeish comparison macros */#define Min(a,b) ({				\      __typeof__((a)*(b)) __a = (a);		\      __typeof__((a)*(b)) __b = (b);		\      (__a < __b) ? __a : __b;			\})#define Max(a,b) ({				\  __typeof__((a)*(b)) __a = (a);		\  __typeof__((a)*(b)) __b = (b);		\  (__a > __b) ? __a : __b;			\})#if SIZE_MAX == UINT16_MAX# define SIZE_BITS 16typedef uint32_t size2_t;#elif SIZE_MAX == UINT32_MAX# define SIZE_BITS 32typedef uint64_t size2_t;#elif SIZE_MAX == UINT64_MAX# define SIZE_BITS 64typedef unsigned __int128 size2_t;#else# error "Unknown size_t"#endif#define alignof(a) __alignof__(a)#define no_return void __attribute__((noreturn))#define ___section(s,a,...) __attribute__((__section__(s)))#define __hot			__attribute__((__hot__))#define __cold			__attribute__((__cold__))#define __aligned(x)		__attribute__((__aligned__(x)))#define __unused		__attribute__((__unused__))#define __must_inline		__attribute__((__always_inline__))#define __noinline		__attribute__ ((__noinline__))#define __constfunc		__attribute__((__const__))#define __purefunc		__attribute__((__pure__))#undef  __alloc_size#define __alloc_size(...)	__attribute__((__alloc_size__(__VA_ARGS__)))#define __malloc_func		__attribute__((__malloc__))#define __fmt_printf(fstr,farg)	__attribute__((__format__(__printf__,fstr,farg)))#define __nonnull_arg(...)	__attribute__((__nonnull__(__VA_ARGS__)))#define __no_return		void __attribute__((__noreturn__))#define __nonnull_ret		__attribute__((__returns_nonnull__))#define __packed		__attribute__((__packed__))#define __safe_alloc(...)	__nonnull_ret __alloc_size(__VA_ARGS__)#define __is_constant(expr)	__builtin_constant_p(expr)#ifndef __cplusplus# define atomic(x)		(*(volatile __typeof__(x) *)&(x))#endif#else /* __ASSEMBLY__ */#define ___section(s,a,...)	.pushsection s, a, ## __VA_ARGS__#endif /* __ASSEMBLY__ */#endif /* COMPILER_H */
 |