| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | #ifndef COMPILER_H#define COMPILER_H#ifndef __ASSEMBLY__#include <stdlib.h>#include <string.h>#include <inttypes.h>#include <stdarg.h>#include <stdbool.h>/* Use builtin memcpy and memset optimizations */#define memset(s,c,n)	__builtin_memset(s,c,n)#define memcpy(d,s,n)	__builtin_memcpy(d,s,n)#define mempcpy(d,s,n)	__builtin_mempcpy(d,s,n)#define memmove(d,s,n)	__builtin_memmove(d,s,n)extern volatile void *memcpy_bytewise(volatile void *dst,				      const volatile void *src, size_t len);/* * The odd argument order allows memcpy() and mempcpy() to be implemented * as tail calls */extern void *__memxcpy_aligned(void *retval,			      const void * restrict src, size_t len,			      void * restrict dst);extern void *__memxcpy_bytewise(void *retval,				const volatile void * restrict src, size_t len,				void * restrict dst);#define likely(x)	__builtin_expect(!!(x), 1)#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;/* 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))#define min(a,b) (((a) < (b)) ? (a) : (b))#define max(a,b) (((a) > (b)) ? (a) : (b))#define ARRAY_SIZE (sizeof(a)/sizeof(a[0]))#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__))#define __fmt_printf(fstr,farg)	__attribute__((__format__(__printf__,fstr,farg)))#define __is_constant(expr)	__builtin_constant_p(expr)#else /* __ASSEMBLY__ */#define ___section(s,a,...)	.pushsection s, a, ## __VA_ARGS__#endif /* __ASSEMBLY__ */#define __text_hot	___section(".text.hot","ax")#define __rodata_hot	___section(".rodata.hot","a")#define __data_hot	___section(".data.hot","aw")#define __rwtext	___section(".rwtext","awx")#define __sdata		___section(".sdata","aw")#define __string_hot	___section(".rodata.hot.str","aMS")#define __sbss		___section(".sbss.hot","aw",@nobits)#define __bss_hot	___section(".bss.hot","aw",@nobits)#define __dram_io_head	___section(".dram.io.head","a",@nobits)#define __dram_io	___section(".dram.io","a",@nobits)#define __dram_text	___section(".dram.text","ax")#define __dram_rodata	___section(".dram.rodata","a")#define __dram_string	___section(".dram.rodata.str","aMS")#define __dram_data	___section(".dram.data","aw")#define __dram_bss	___section(".dram.bss","aw",@nobits)#define __dram_noinit	___section(".dram.noinit","aw",@nobits)#ifndef __ASSEMBLY__#define hotstr(x) ({ static __string_hot const char _str[] = (x); _str; })#endif /* __ASSEMBLY__ */#endif /* COMPILER_H */
 |