summaryrefslogtreecommitdiffhomepage
path: root/src/nxt_clang.h
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2017-01-17 20:00:00 +0300
committerIgor Sysoev <igor@sysoev.ru>2017-01-17 20:00:00 +0300
commit16cbf3c076a0aca6d47adaf3f719493674cf2363 (patch)
treee6530480020f62a2bdbf249988ec3e2a751d3927 /src/nxt_clang.h
downloadunit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.gz
unit-16cbf3c076a0aca6d47adaf3f719493674cf2363.tar.bz2
Initial version.
Diffstat (limited to 'src/nxt_clang.h')
-rw-r--r--src/nxt_clang.h214
1 files changed, 214 insertions, 0 deletions
diff --git a/src/nxt_clang.h b/src/nxt_clang.h
new file mode 100644
index 00000000..0ed55b64
--- /dev/null
+++ b/src/nxt_clang.h
@@ -0,0 +1,214 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ * Copyright (C) NGINX, Inc.
+ */
+
+#ifndef _NXT_CLANG_H_INCLUDED_
+#define _NXT_CLANG_H_INCLUDED_
+
+
+#define nxt_inline static inline __attribute__((always_inline))
+#define nxt_noinline __attribute__((noinline))
+#define nxt_cdecl
+
+
+#if (NXT_CLANG)
+
+/* Any __asm__ directive disables loop vectorization in GCC and Clang. */
+#define \
+nxt_pragma_loop_disable_vectorization \
+ __asm__("")
+
+#else
+
+#define \
+nxt_pragma_loop_disable_vectorization
+
+#endif
+
+
+#if (NXT_HAVE_BUILTIN_EXPECT)
+
+#define \
+nxt_fast_path(x) \
+ __builtin_expect((long) (x), 1)
+
+#define \
+nxt_slow_path(x) \
+ __builtin_expect((long) (x), 0)
+
+
+#else
+
+#define \
+nxt_fast_path(x) \
+ (x)
+
+#define \
+nxt_slow_path(x) \
+ (x)
+
+#endif
+
+
+#if (NXT_HAVE_BUILTIN_UNREACHABLE)
+
+#define \
+nxt_unreachable() \
+ __builtin_unreachable()
+
+#else
+
+#define \
+nxt_unreachable()
+
+#endif
+
+
+#if (NXT_HAVE_BUILTIN_PREFETCH)
+
+#define \
+nxt_prefetch(a) \
+ __builtin_prefetch(a)
+
+#else
+
+#define \
+nxt_prefetch(a)
+
+#endif
+
+
+#if (NXT_HAVE_GCC_ATTRIBUTE_VISIBILITY)
+
+#define NXT_EXPORT __attribute__((visibility("default")))
+
+#else
+
+#define NXT_EXPORT
+
+#endif
+
+
+#if (NXT_HAVE_GCC_ATTRIBUTE_MALLOC)
+
+#define NXT_MALLOC_LIKE __attribute__((__malloc__))
+
+#else
+
+#define NXT_MALLOC_LIKE
+
+#endif
+
+
+#if (NXT_HAVE_GCC_ATTRIBUTE_ALIGNED)
+
+#define nxt_aligned(x) __attribute__((aligned(x)))
+
+#else
+
+#define nxt_aligned(x)
+
+#endif
+
+
+#ifndef NXT_ALIGNMENT
+
+#if (NXT_SOLARIS)
+#define NXT_ALIGNMENT _POINTER_ALIGNMENT /* x86_64: 8, i386: 4 */
+ /* sparcv9: 8, sparcv8: 4 */
+#elif (__i386__ || __i386)
+#define NXT_ALIGNMENT 4
+
+#elif (__arm__)
+#define NXT_ALIGNMENT 8 /* 32-bit ARM may use 64-bit load/store */
+
+#elif (__ia64__)
+#define NXT_ALIGNMENT 8 /* long long */
+
+#else
+#define NXT_ALIGNMENT NXT_PTR_SIZE
+#endif
+
+#endif
+
+
+#ifndef NXT_MAX_ALIGNMENT
+
+#if (NXT_SOLARIS)
+#define NXT_MAX_ALIGNMENT _MAX_ALIGNMENT /* x86_64: 16, i386: 4 */
+ /* sparcv9: 16, sparcv8: 8 */
+#elif (__i386__ || __i386)
+#define NXT_MAX_ALIGNMENT 4
+
+#elif (__arm__)
+#define NXT_MAX_ALIGNMENT 16
+
+#elif (__ia64__)
+#define NXT_MAX_ALIGNMENT 16
+
+#else
+#define NXT_MAX_ALIGNMENT 16
+#endif
+
+#endif
+
+
+#define \
+nxt_alloca(size) \
+ alloca(size)
+
+
+#define \
+nxt_container_of(p, type, field) \
+ (type *) ((u_char *) (p) - offsetof(type, field))
+
+
+#define \
+nxt_nitems(x) \
+ (sizeof(x) / sizeof((x)[0]))
+
+
+/* GCC and Clang use __builtin_abs() instead of libc abs(). */
+
+#define \
+nxt_abs(val) \
+ abs(val)
+
+
+#define \
+nxt_max(val1, val2) \
+ ((val1 < val2) ? (val2) : (val1))
+
+
+#define \
+nxt_min(val1, val2) \
+ ((val1 > val2) ? (val2) : (val1))
+
+
+#define \
+nxt_bswap32(val) \
+ ( ((val) >> 24) \
+ | (((val) & 0x00ff0000) >> 8) \
+ | (((val) & 0x0000ff00) << 8) \
+ | ((val) << 24))
+
+
+
+#define \
+nxt_align_size(d, a) \
+ (((d) + ((size_t) (a) - 1)) & ~((size_t) (a) - 1))
+
+
+#define \
+nxt_align_ptr(p, a) \
+ (u_char *) (((uintptr_t) (p) + ((uintptr_t) (a) - 1)) \
+ & ~((uintptr_t) (a) - 1))
+
+#define \
+nxt_trunc_ptr(p, a) \
+ (u_char *) ((uintptr_t) (p) & ~((uintptr_t) (a) - 1))
+
+
+#endif /* _NXT_CLANG_H_INCLUDED_ */