99 lines
3.1 KiB
C
99 lines
3.1 KiB
C
#if defined(DUK_F_C99) || defined(DUK_F_CPP11)
|
|
/* C99 / C++11 and above: rely on va_copy() which is required. */
|
|
#define DUK_VA_COPY(dest,src) va_copy(dest,src)
|
|
#else
|
|
/* GCC: assume we have __va_copy() in non-C99 mode. */
|
|
#define DUK_VA_COPY(dest,src) __va_copy(dest,src)
|
|
#endif
|
|
|
|
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 20500L) && (DUK_F_GCC_VERSION < 50000L)
|
|
/* Since gcc-2.5.
|
|
*
|
|
* Disabled temporarily in GCC 5+ because of an unresolved noreturn-related
|
|
* issue: https://github.com/svaarala/duktape/issues/2155.
|
|
*/
|
|
#define DUK_NORETURN(decl) decl __attribute__((noreturn))
|
|
#endif
|
|
|
|
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)
|
|
/* Since gcc-4.5. */
|
|
#define DUK_UNREACHABLE() do { __builtin_unreachable(); } while (0)
|
|
#endif
|
|
|
|
#define DUK_USE_BRANCH_HINTS
|
|
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)
|
|
/* GCC: test not very accurate; enable only in relatively recent builds
|
|
* because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html)
|
|
*/
|
|
#define DUK_LIKELY(x) __builtin_expect((x), 1)
|
|
#define DUK_UNLIKELY(x) __builtin_expect((x), 0)
|
|
#endif
|
|
/* XXX: equivalent of clang __builtin_unpredictable? */
|
|
|
|
#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \
|
|
defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 30101)
|
|
#define DUK_NOINLINE __attribute__((noinline))
|
|
#define DUK_INLINE inline
|
|
#define DUK_ALWAYS_INLINE inline __attribute__((always_inline))
|
|
#endif
|
|
|
|
#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \
|
|
defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40300)
|
|
#define DUK_HOT __attribute__((hot))
|
|
#define DUK_COLD __attribute__((cold))
|
|
#endif
|
|
|
|
#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)
|
|
#snippet "msvc_visibility.h.in"
|
|
#elif defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40000)
|
|
#snippet "gcc_clang_visibility.h.in"
|
|
#endif
|
|
|
|
#if defined(DUK_F_MINGW)
|
|
#if defined(DUK_F_CPP)
|
|
#define DUK_USE_COMPILER_STRING "mingw++"
|
|
#else
|
|
#define DUK_USE_COMPILER_STRING "mingw"
|
|
#endif
|
|
#else
|
|
#if defined(DUK_F_CPP)
|
|
#define DUK_USE_COMPILER_STRING "g++"
|
|
#else
|
|
#define DUK_USE_COMPILER_STRING "gcc"
|
|
#endif
|
|
#endif
|
|
|
|
#undef DUK_USE_VARIADIC_MACROS
|
|
#if defined(DUK_F_C99) || (defined(DUK_F_CPP11) && defined(__GNUC__))
|
|
#define DUK_USE_VARIADIC_MACROS
|
|
#endif
|
|
|
|
#define DUK_USE_UNION_INITIALIZERS
|
|
|
|
#undef DUK_USE_FLEX_C99
|
|
#undef DUK_USE_FLEX_ZEROSIZE
|
|
#undef DUK_USE_FLEX_ONESIZE
|
|
#if defined(DUK_F_C99)
|
|
#define DUK_USE_FLEX_C99
|
|
#else
|
|
#define DUK_USE_FLEX_ZEROSIZE
|
|
#endif
|
|
|
|
/* Since 4.6 one can '#pragma GCC diagnostic push/pop'. */
|
|
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40600)
|
|
#define DUK_USE_GCC_PRAGMAS
|
|
#else
|
|
#undef DUK_USE_GCC_PRAGMAS
|
|
#endif
|
|
|
|
#define DUK_USE_PACK_GCC_ATTR
|
|
|
|
/* Availability varies based on platform (between GCC 4.4 and 4.8), and there
|
|
* are apparently some bugs in GCC 4.x. Check for GCC 5.0 before enabling
|
|
* these to be safe.
|
|
*/
|
|
#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 50000L)
|
|
#define DUK_BSWAP64(x) ((duk_uint64_t) __builtin_bswap64((duk_uint64_t) (x)))
|
|
#define DUK_BSWAP32(x) ((duk_uint32_t) __builtin_bswap32((duk_uint32_t) (x)))
|
|
#define DUK_BSWAP16(x) ((duk_uint16_t) __builtin_bswap16((duk_uint16_t) (x)))
|
|
#endif
|