| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | 
							- #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_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 */
 
 
  |