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