xref: /unit/src/nxt_clang.h (revision 2084:7d479274f334)
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. */
19*2084Salx.manpages@gmail.com #define nxt_pragma_loop_disable_vectorization                                 \
200Sigor@sysoev.ru     __asm__("")
210Sigor@sysoev.ru 
220Sigor@sysoev.ru #else
230Sigor@sysoev.ru 
24*2084Salx.manpages@gmail.com #define nxt_pragma_loop_disable_vectorization
250Sigor@sysoev.ru 
260Sigor@sysoev.ru #endif
270Sigor@sysoev.ru 
280Sigor@sysoev.ru 
290Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_EXPECT)
300Sigor@sysoev.ru 
31*2084Salx.manpages@gmail.com #define nxt_expect(c, x)                                                      \
3235Svbart@nginx.com     __builtin_expect((long) (x), (c))
3335Svbart@nginx.com 
34*2084Salx.manpages@gmail.com #define nxt_fast_path(x)                                                      \
3535Svbart@nginx.com     nxt_expect(1, x)
360Sigor@sysoev.ru 
37*2084Salx.manpages@gmail.com #define nxt_slow_path(x)                                                      \
3835Svbart@nginx.com     nxt_expect(0, x)
390Sigor@sysoev.ru 
400Sigor@sysoev.ru 
410Sigor@sysoev.ru #else
420Sigor@sysoev.ru 
43*2084Salx.manpages@gmail.com #define nxt_expect(c, x)                                                      \
4435Svbart@nginx.com     (x)
4535Svbart@nginx.com 
46*2084Salx.manpages@gmail.com #define nxt_fast_path(x)                                                      \
470Sigor@sysoev.ru     (x)
480Sigor@sysoev.ru 
49*2084Salx.manpages@gmail.com #define nxt_slow_path(x)                                                      \
500Sigor@sysoev.ru     (x)
510Sigor@sysoev.ru 
520Sigor@sysoev.ru #endif
530Sigor@sysoev.ru 
540Sigor@sysoev.ru 
550Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_UNREACHABLE)
560Sigor@sysoev.ru 
57*2084Salx.manpages@gmail.com #define nxt_unreachable()                                                     \
580Sigor@sysoev.ru     __builtin_unreachable()
590Sigor@sysoev.ru 
600Sigor@sysoev.ru #else
610Sigor@sysoev.ru 
62*2084Salx.manpages@gmail.com #define nxt_unreachable()
630Sigor@sysoev.ru 
640Sigor@sysoev.ru #endif
650Sigor@sysoev.ru 
660Sigor@sysoev.ru 
670Sigor@sysoev.ru #if (NXT_HAVE_BUILTIN_PREFETCH)
680Sigor@sysoev.ru 
69*2084Salx.manpages@gmail.com #define nxt_prefetch(a)                                                       \
700Sigor@sysoev.ru     __builtin_prefetch(a)
710Sigor@sysoev.ru 
720Sigor@sysoev.ru #else
730Sigor@sysoev.ru 
74*2084Salx.manpages@gmail.com #define nxt_prefetch(a)
750Sigor@sysoev.ru 
760Sigor@sysoev.ru #endif
770Sigor@sysoev.ru 
780Sigor@sysoev.ru 
790Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY)
800Sigor@sysoev.ru 
810Sigor@sysoev.ru #define NXT_EXPORT         __attribute__((visibility("default")))
820Sigor@sysoev.ru 
830Sigor@sysoev.ru #else
840Sigor@sysoev.ru 
850Sigor@sysoev.ru #define NXT_EXPORT
860Sigor@sysoev.ru 
870Sigor@sysoev.ru #endif
880Sigor@sysoev.ru 
890Sigor@sysoev.ru 
900Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_MALLOC)
910Sigor@sysoev.ru 
920Sigor@sysoev.ru #define NXT_MALLOC_LIKE    __attribute__((__malloc__))
930Sigor@sysoev.ru 
940Sigor@sysoev.ru #else
950Sigor@sysoev.ru 
960Sigor@sysoev.ru #define NXT_MALLOC_LIKE
970Sigor@sysoev.ru 
980Sigor@sysoev.ru #endif
990Sigor@sysoev.ru 
1000Sigor@sysoev.ru 
1010Sigor@sysoev.ru #if (NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
1020Sigor@sysoev.ru 
1030Sigor@sysoev.ru #define nxt_aligned(x)     __attribute__((aligned(x)))
1040Sigor@sysoev.ru 
1050Sigor@sysoev.ru #else
1060Sigor@sysoev.ru 
1070Sigor@sysoev.ru #define nxt_aligned(x)
1080Sigor@sysoev.ru 
1090Sigor@sysoev.ru #endif
1100Sigor@sysoev.ru 
1110Sigor@sysoev.ru 
112169Svbart@nginx.com #if (NXT_HAVE_GCC_ATTRIBUTE_PACKED)
113169Svbart@nginx.com 
114169Svbart@nginx.com #define nxt_packed         __attribute__((__packed__))
115169Svbart@nginx.com 
116169Svbart@nginx.com #else
117169Svbart@nginx.com 
118169Svbart@nginx.com #define nxt_packed
119169Svbart@nginx.com 
120169Svbart@nginx.com #endif
121169Svbart@nginx.com 
122169Svbart@nginx.com 
1232079Salx.manpages@gmail.com #if (NXT_HAVE_GCC_ATTRIBUTE_UNUSED)
1242079Salx.manpages@gmail.com 
1252079Salx.manpages@gmail.com #define NXT_MAYBE_UNUSED         __attribute__((__unused__))
1262079Salx.manpages@gmail.com 
1272079Salx.manpages@gmail.com #else
1282079Salx.manpages@gmail.com 
1292079Salx.manpages@gmail.com #define NXT_MAYBE_UNUSED
1302079Salx.manpages@gmail.com 
1312079Salx.manpages@gmail.com #endif
1322079Salx.manpages@gmail.com 
1332079Salx.manpages@gmail.com 
134701Spluknet@nginx.com #if (NXT_HAVE_BUILTIN_POPCOUNT)
135701Spluknet@nginx.com 
136701Spluknet@nginx.com #define nxt_popcount       __builtin_popcount
137701Spluknet@nginx.com 
138701Spluknet@nginx.com #else
139701Spluknet@nginx.com 
140701Spluknet@nginx.com nxt_inline int
nxt_popcount(unsigned int x)141701Spluknet@nginx.com nxt_popcount(unsigned int x)
142701Spluknet@nginx.com {
143701Spluknet@nginx.com     int  count;
144701Spluknet@nginx.com 
145702Svbart@nginx.com     for (count = 0; x != 0; count++) {
146702Svbart@nginx.com         x &= x - 1;
147701Spluknet@nginx.com     }
148701Spluknet@nginx.com 
149701Spluknet@nginx.com     return count;
150701Spluknet@nginx.com }
151701Spluknet@nginx.com 
152701Spluknet@nginx.com #endif
153701Spluknet@nginx.com 
154701Spluknet@nginx.com 
1550Sigor@sysoev.ru #ifndef NXT_ALIGNMENT
1560Sigor@sysoev.ru 
1570Sigor@sysoev.ru #if (NXT_SOLARIS)
1580Sigor@sysoev.ru #define NXT_ALIGNMENT      _POINTER_ALIGNMENT     /* x86_64: 8,   i386: 4    */
1590Sigor@sysoev.ru                                                   /* sparcv9: 8,  sparcv8: 4 */
1600Sigor@sysoev.ru #elif (__i386__ || __i386)
1610Sigor@sysoev.ru #define NXT_ALIGNMENT      4
1620Sigor@sysoev.ru 
1630Sigor@sysoev.ru #elif (__arm__)
1640Sigor@sysoev.ru #define NXT_ALIGNMENT      8         /* 32-bit ARM may use 64-bit load/store */
1650Sigor@sysoev.ru 
1660Sigor@sysoev.ru #elif (__ia64__)
1670Sigor@sysoev.ru #define NXT_ALIGNMENT      8         /* long long */
1680Sigor@sysoev.ru 
1690Sigor@sysoev.ru #else
1700Sigor@sysoev.ru #define NXT_ALIGNMENT      NXT_PTR_SIZE
1710Sigor@sysoev.ru #endif
1720Sigor@sysoev.ru 
1730Sigor@sysoev.ru #endif
1740Sigor@sysoev.ru 
1750Sigor@sysoev.ru 
1760Sigor@sysoev.ru #ifndef NXT_MAX_ALIGNMENT
1770Sigor@sysoev.ru 
1780Sigor@sysoev.ru #if (NXT_SOLARIS)
1790Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  _MAX_ALIGNMENT        /* x86_64: 16,   i386: 4    */
1800Sigor@sysoev.ru                                                  /* sparcv9: 16,  sparcv8: 8 */
1810Sigor@sysoev.ru #elif (__i386__ || __i386)
1820Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  4
1830Sigor@sysoev.ru 
1840Sigor@sysoev.ru #elif (__arm__)
1850Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1860Sigor@sysoev.ru 
1870Sigor@sysoev.ru #elif (__ia64__)
1880Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1890Sigor@sysoev.ru 
1900Sigor@sysoev.ru #else
1910Sigor@sysoev.ru #define NXT_MAX_ALIGNMENT  16
1920Sigor@sysoev.ru #endif
1930Sigor@sysoev.ru 
1940Sigor@sysoev.ru #endif
1950Sigor@sysoev.ru 
1960Sigor@sysoev.ru 
197*2084Salx.manpages@gmail.com #define nxt_alloca(size)                                                      \
1980Sigor@sysoev.ru     alloca(size)
1990Sigor@sysoev.ru 
2000Sigor@sysoev.ru 
201*2084Salx.manpages@gmail.com #define nxt_container_of(p, type, field)                                      \
2020Sigor@sysoev.ru     (type *) ((u_char *) (p) - offsetof(type, field))
2030Sigor@sysoev.ru 
2040Sigor@sysoev.ru 
20597Svbart@nginx.com #define nxt_pointer_to(p, offset)                                             \
20697Svbart@nginx.com     ((void *) ((char *) (p) + (offset)))
20797Svbart@nginx.com 
20897Svbart@nginx.com 
20953Sigor@sysoev.ru #define nxt_value_at(type, p, offset)                                         \
21053Sigor@sysoev.ru     *(type *) ((u_char *) p + offset)
21153Sigor@sysoev.ru 
21253Sigor@sysoev.ru 
213*2084Salx.manpages@gmail.com #define nxt_nitems(x)                                                         \
2140Sigor@sysoev.ru     (sizeof(x) / sizeof((x)[0]))
2150Sigor@sysoev.ru 
2160Sigor@sysoev.ru 
2170Sigor@sysoev.ru /* GCC and Clang use __builtin_abs() instead of libc abs(). */
2180Sigor@sysoev.ru 
219*2084Salx.manpages@gmail.com #define nxt_abs(val)                                                          \
2200Sigor@sysoev.ru     abs(val)
2210Sigor@sysoev.ru 
2220Sigor@sysoev.ru 
223*2084Salx.manpages@gmail.com #define nxt_max(val1, val2)                                                   \
2240Sigor@sysoev.ru     ((val1 < val2) ? (val2) : (val1))
2250Sigor@sysoev.ru 
2260Sigor@sysoev.ru 
227*2084Salx.manpages@gmail.com #define nxt_min(val1, val2)                                                   \
2280Sigor@sysoev.ru     ((val1 > val2) ? (val2) : (val1))
2290Sigor@sysoev.ru 
2300Sigor@sysoev.ru 
231*2084Salx.manpages@gmail.com #define nxt_bswap32(val)                                                      \
2320Sigor@sysoev.ru     (   ((val)               >> 24)                                           \
233611Svbart@nginx.com      | (((val) & 0x00FF0000) >>  8)                                           \
234611Svbart@nginx.com      | (((val) & 0x0000FF00) <<  8)                                           \
2350Sigor@sysoev.ru      |  ((val)               << 24))
2360Sigor@sysoev.ru 
2370Sigor@sysoev.ru 
23863Sigor@sysoev.ru #define nxt_is_power_of_two(value)                                            \
23963Sigor@sysoev.ru     ((((value) - 1) & (value)) == 0)
24063Sigor@sysoev.ru 
2410Sigor@sysoev.ru 
242*2084Salx.manpages@gmail.com #define nxt_align_size(d, a)                                                  \
2430Sigor@sysoev.ru     (((d) + ((size_t) (a) - 1)) & ~((size_t) (a) - 1))
2440Sigor@sysoev.ru 
2450Sigor@sysoev.ru 
246*2084Salx.manpages@gmail.com #define nxt_align_ptr(p, a)                                                   \
2470Sigor@sysoev.ru     (u_char *) (((uintptr_t) (p) + ((uintptr_t) (a) - 1))                     \
2480Sigor@sysoev.ru                   & ~((uintptr_t) (a) - 1))
2490Sigor@sysoev.ru 
250*2084Salx.manpages@gmail.com #define nxt_trunc_ptr(p, a)                                                   \
2510Sigor@sysoev.ru     (u_char *) ((uintptr_t) (p) & ~((uintptr_t) (a) - 1))
2520Sigor@sysoev.ru 
2530Sigor@sysoev.ru 
254703Svbart@nginx.com #define nxt_length(s)                                                         \
255703Svbart@nginx.com     (sizeof(s) - 1)
256703Svbart@nginx.com 
257703Svbart@nginx.com 
2580Sigor@sysoev.ru #endif /* _NXT_CLANG_H_INCLUDED_ */
259