xref: /unit/src/nxt_clang.h (revision 611)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
30Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
40Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
50Sigor@sysoev.ru  */
60Sigor@sysoev.ru 
70Sigor@sysoev.ru #ifndef _NXT_CLANG_H_INCLUDED_
80Sigor@sysoev.ru #define _NXT_CLANG_H_INCLUDED_
90Sigor@sysoev.ru 
100Sigor@sysoev.ru 
110Sigor@sysoev.ru #define nxt_inline     static inline __attribute__((always_inline))
120Sigor@sysoev.ru #define nxt_noinline   __attribute__((noinline))
130Sigor@sysoev.ru #define nxt_cdecl
140Sigor@sysoev.ru 
150Sigor@sysoev.ru 
160Sigor@sysoev.ru #if (NXT_CLANG)
170Sigor@sysoev.ru 
180Sigor@sysoev.ru /* Any __asm__ directive disables loop vectorization in GCC and Clang. */
190Sigor@sysoev.ru #define                                                                       \
200Sigor@sysoev.ru nxt_pragma_loop_disable_vectorization                                         \
210Sigor@sysoev.ru     __asm__("")
220Sigor@sysoev.ru 
230Sigor@sysoev.ru #else
240Sigor@sysoev.ru 
250Sigor@sysoev.ru #define                                                                       \
260Sigor@sysoev.ru nxt_pragma_loop_disable_vectorization
270Sigor@sysoev.ru 
280Sigor@sysoev.ru #endif
290Sigor@sysoev.ru 
300Sigor@sysoev.ru 
310Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_EXPECT)
320Sigor@sysoev.ru 
330Sigor@sysoev.ru #define                                                                       \
3435Svbart@nginx.com nxt_expect(c, x)                                                              \
3535Svbart@nginx.com     __builtin_expect((long) (x), (c))
3635Svbart@nginx.com 
3735Svbart@nginx.com #define                                                                       \
380Sigor@sysoev.ru nxt_fast_path(x)                                                              \
3935Svbart@nginx.com     nxt_expect(1, x)
400Sigor@sysoev.ru 
410Sigor@sysoev.ru #define                                                                       \
420Sigor@sysoev.ru nxt_slow_path(x)                                                              \
4335Svbart@nginx.com     nxt_expect(0, x)
440Sigor@sysoev.ru 
450Sigor@sysoev.ru 
460Sigor@sysoev.ru #else
470Sigor@sysoev.ru 
480Sigor@sysoev.ru #define                                                                       \
4935Svbart@nginx.com nxt_expect(c, x)                                                              \
5035Svbart@nginx.com     (x)
5135Svbart@nginx.com 
5235Svbart@nginx.com #define                                                                       \
530Sigor@sysoev.ru nxt_fast_path(x)                                                              \
540Sigor@sysoev.ru     (x)
550Sigor@sysoev.ru 
560Sigor@sysoev.ru #define                                                                       \
570Sigor@sysoev.ru nxt_slow_path(x)                                                              \
580Sigor@sysoev.ru     (x)
590Sigor@sysoev.ru 
600Sigor@sysoev.ru #endif
610Sigor@sysoev.ru 
620Sigor@sysoev.ru 
630Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_UNREACHABLE)
640Sigor@sysoev.ru 
650Sigor@sysoev.ru #define                                                                       \
660Sigor@sysoev.ru nxt_unreachable()                                                             \
670Sigor@sysoev.ru     __builtin_unreachable()
680Sigor@sysoev.ru 
690Sigor@sysoev.ru #else
700Sigor@sysoev.ru 
710Sigor@sysoev.ru #define                                                                       \
720Sigor@sysoev.ru nxt_unreachable()
730Sigor@sysoev.ru 
740Sigor@sysoev.ru #endif
750Sigor@sysoev.ru 
760Sigor@sysoev.ru 
770Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_PREFETCH)
780Sigor@sysoev.ru 
790Sigor@sysoev.ru #define                                                                       \
800Sigor@sysoev.ru nxt_prefetch(a)                                                               \
810Sigor@sysoev.ru     __builtin_prefetch(a)
820Sigor@sysoev.ru 
830Sigor@sysoev.ru #else
840Sigor@sysoev.ru 
850Sigor@sysoev.ru #define                                                                       \
860Sigor@sysoev.ru nxt_prefetch(a)
870Sigor@sysoev.ru 
880Sigor@sysoev.ru #endif
890Sigor@sysoev.ru 
900Sigor@sysoev.ru 
910Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY)
920Sigor@sysoev.ru 
930Sigor@sysoev.ru #define NXT_EXPORT         __attribute__((visibility("default")))
940Sigor@sysoev.ru 
950Sigor@sysoev.ru #else
960Sigor@sysoev.ru 
970Sigor@sysoev.ru #define NXT_EXPORT
980Sigor@sysoev.ru 
990Sigor@sysoev.ru #endif
1000Sigor@sysoev.ru 
1010Sigor@sysoev.ru 
1020Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_MALLOC)
1030Sigor@sysoev.ru 
1040Sigor@sysoev.ru #define NXT_MALLOC_LIKE    __attribute__((__malloc__))
1050Sigor@sysoev.ru 
1060Sigor@sysoev.ru #else
1070Sigor@sysoev.ru 
1080Sigor@sysoev.ru #define NXT_MALLOC_LIKE
1090Sigor@sysoev.ru 
1100Sigor@sysoev.ru #endif
1110Sigor@sysoev.ru 
1120Sigor@sysoev.ru 
1130Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
1140Sigor@sysoev.ru 
1150Sigor@sysoev.ru #define nxt_aligned(x)     __attribute__((aligned(x)))
1160Sigor@sysoev.ru 
1170Sigor@sysoev.ru #else
1180Sigor@sysoev.ru 
1190Sigor@sysoev.ru #define nxt_aligned(x)
1200Sigor@sysoev.ru 
1210Sigor@sysoev.ru #endif
1220Sigor@sysoev.ru 
1230Sigor@sysoev.ru 
124169Svbart@nginx.com #if (NXT_HAVE_GCC_ATTRIBUTE_PACKED)
125169Svbart@nginx.com 
126169Svbart@nginx.com #define nxt_packed         __attribute__((__packed__))
127169Svbart@nginx.com 
128169Svbart@nginx.com #else
129169Svbart@nginx.com 
130169Svbart@nginx.com #define nxt_packed
131169Svbart@nginx.com 
132169Svbart@nginx.com #endif
133169Svbart@nginx.com 
134169Svbart@nginx.com 
1350Sigor@sysoev.ru #ifndef NXT_ALIGNMENT
1360Sigor@sysoev.ru 
1370Sigor@sysoev.ru #if (NXT_SOLARIS)
1380Sigor@sysoev.ru #define NXT_ALIGNMENT      _POINTER_ALIGNMENT     /* x86_64: 8,   i386: 4    */
1390Sigor@sysoev.ru                                                   /* sparcv9: 8,  sparcv8: 4 */
1400Sigor@sysoev.ru #elif (__i386__ || __i386)
1410Sigor@sysoev.ru #define NXT_ALIGNMENT      4
1420Sigor@sysoev.ru 
1430Sigor@sysoev.ru #elif (__arm__)
1440Sigor@sysoev.ru #define NXT_ALIGNMENT      8         /* 32-bit ARM may use 64-bit load/store */
1450Sigor@sysoev.ru 
1460Sigor@sysoev.ru #elif (__ia64__)
1470Sigor@sysoev.ru #define NXT_ALIGNMENT      8         /* long long */
1480Sigor@sysoev.ru 
1490Sigor@sysoev.ru #else
1500Sigor@sysoev.ru #define NXT_ALIGNMENT      NXT_PTR_SIZE
1510Sigor@sysoev.ru #endif
1520Sigor@sysoev.ru 
1530Sigor@sysoev.ru #endif
1540Sigor@sysoev.ru 
1550Sigor@sysoev.ru 
1560Sigor@sysoev.ru #ifndef NXT_MAX_ALIGNMENT
1570Sigor@sysoev.ru 
1580Sigor@sysoev.ru #if (NXT_SOLARIS)
1590Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  _MAX_ALIGNMENT        /* x86_64: 16,   i386: 4    */
1600Sigor@sysoev.ru                                                  /* sparcv9: 16,  sparcv8: 8 */
1610Sigor@sysoev.ru #elif (__i386__ || __i386)
1620Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  4
1630Sigor@sysoev.ru 
1640Sigor@sysoev.ru #elif (__arm__)
1650Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1660Sigor@sysoev.ru 
1670Sigor@sysoev.ru #elif (__ia64__)
1680Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1690Sigor@sysoev.ru 
1700Sigor@sysoev.ru #else
1710Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1720Sigor@sysoev.ru #endif
1730Sigor@sysoev.ru 
1740Sigor@sysoev.ru #endif
1750Sigor@sysoev.ru 
1760Sigor@sysoev.ru 
1770Sigor@sysoev.ru #define                                                                       \
1780Sigor@sysoev.ru nxt_alloca(size)                                                              \
1790Sigor@sysoev.ru     alloca(size)
1800Sigor@sysoev.ru 
1810Sigor@sysoev.ru 
1820Sigor@sysoev.ru #define                                                                       \
1830Sigor@sysoev.ru nxt_container_of(p, type, field)                                              \
1840Sigor@sysoev.ru     (type *) ((u_char *) (p) - offsetof(type, field))
1850Sigor@sysoev.ru 
1860Sigor@sysoev.ru 
18797Svbart@nginx.com #define nxt_pointer_to(p, offset)                                             \
18897Svbart@nginx.com     ((void *) ((char *) (p) + (offset)))
18997Svbart@nginx.com 
19097Svbart@nginx.com 
19153Sigor@sysoev.ru #define nxt_value_at(type, p, offset)                                         \
19253Sigor@sysoev.ru     *(type *) ((u_char *) p + offset)
19353Sigor@sysoev.ru 
19453Sigor@sysoev.ru 
1950Sigor@sysoev.ru #define                                                                       \
1960Sigor@sysoev.ru nxt_nitems(x)                                                                 \
1970Sigor@sysoev.ru     (sizeof(x) / sizeof((x)[0]))
1980Sigor@sysoev.ru 
1990Sigor@sysoev.ru 
2000Sigor@sysoev.ru /* GCC and Clang use __builtin_abs() instead of libc abs(). */
2010Sigor@sysoev.ru 
2020Sigor@sysoev.ru #define                                                                       \
2030Sigor@sysoev.ru nxt_abs(val)                                                                  \
2040Sigor@sysoev.ru     abs(val)
2050Sigor@sysoev.ru 
2060Sigor@sysoev.ru 
2070Sigor@sysoev.ru #define                                                                       \
2080Sigor@sysoev.ru nxt_max(val1, val2)                                                           \
2090Sigor@sysoev.ru     ((val1 < val2) ? (val2) : (val1))
2100Sigor@sysoev.ru 
2110Sigor@sysoev.ru 
2120Sigor@sysoev.ru #define                                                                       \
2130Sigor@sysoev.ru nxt_min(val1, val2)                                                           \
2140Sigor@sysoev.ru     ((val1 > val2) ? (val2) : (val1))
2150Sigor@sysoev.ru 
2160Sigor@sysoev.ru 
2170Sigor@sysoev.ru #define                                                                       \
2180Sigor@sysoev.ru nxt_bswap32(val)                                                              \
2190Sigor@sysoev.ru     (   ((val)               >> 24)                                           \
220*611Svbart@nginx.com      | (((val) & 0x00FF0000) >>  8)                                           \
221*611Svbart@nginx.com      | (((val) & 0x0000FF00) <<  8)                                           \
2220Sigor@sysoev.ru      |  ((val)               << 24))
2230Sigor@sysoev.ru 
2240Sigor@sysoev.ru 
22563Sigor@sysoev.ru #define nxt_is_power_of_two(value)                                            \
22663Sigor@sysoev.ru     ((((value) - 1) & (value)) == 0)
22763Sigor@sysoev.ru 
2280Sigor@sysoev.ru 
2290Sigor@sysoev.ru #define                                                                       \
2300Sigor@sysoev.ru nxt_align_size(d, a)                                                          \
2310Sigor@sysoev.ru     (((d) + ((size_t) (a) - 1)) & ~((size_t) (a) - 1))
2320Sigor@sysoev.ru 
2330Sigor@sysoev.ru 
2340Sigor@sysoev.ru #define                                                                       \
2350Sigor@sysoev.ru nxt_align_ptr(p, a)                                                           \
2360Sigor@sysoev.ru     (u_char *) (((uintptr_t) (p) + ((uintptr_t) (a) - 1))                     \
2370Sigor@sysoev.ru                   & ~((uintptr_t) (a) - 1))
2380Sigor@sysoev.ru 
2390Sigor@sysoev.ru #define                                                                       \
2400Sigor@sysoev.ru nxt_trunc_ptr(p, a)                                                           \
2410Sigor@sysoev.ru     (u_char *) ((uintptr_t) (p) & ~((uintptr_t) (a) - 1))
2420Sigor@sysoev.ru 
2430Sigor@sysoev.ru 
2440Sigor@sysoev.ru #endif /* _NXT_CLANG_H_INCLUDED_ */
245