#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