#ifndef DYNCALL_MACROS_H
#define DYNCALL_MACROS_H
#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
# define DC__OS_Win64
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__WINDOWS__) || defined(_WINDOWS)
# define DC__OS_Win32
#elif defined(__APPLE__) || defined(__Darwin__)
# define DC__OS_Darwin
# if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__)
# define DC__OS_IPhone
# else /* defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) */
# define DC__OS_MacOSX
# endif
#elif defined(__linux__) || defined(__linux) || defined(__gnu_linux__)
# define DC__OS_Linux
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) /* latter is (also) used by systems using FreeBSD kernel, e.g. Debian/kFreeBSD, which could be detected specifically by also checking for __GLIBC__ */
# define DC__OS_FreeBSD
#elif defined(__OpenBSD__)
# define DC__OS_OpenBSD
#elif defined(__NetBSD__)
# define DC__OS_NetBSD
#elif defined(__DragonFly__)
# define DC__OS_DragonFlyBSD
#elif defined(__sun__) || defined(__sun) || defined(sun)
# define DC__OS_SunOS
#elif defined(__nds__)
# define DC__OS_NDS
#elif defined(__psp__) || defined(PSP)
# define DC__OS_PSP
#elif defined(__HAIKU__)
# define DC__OS_BeOS
#elif defined(Plan9) || defined(__Plan9__)
# define DC__OS_Plan9
#elif defined(__vms)
# define DC__OS_VMS
#elif defined(__minix)
# define DC__OS_Minix
#else
# define DC__OS_UNKNOWN
#endif
#if defined(DC__OS_Win32) || defined(DC__OS_Win64)
# if defined(__CYGWIN__)
# define DC__OS_Cygwin
# elif defined(__MINGW32__) || defined(__MINGW64__)
# define DC__OS_MinGW
# endif
#endif
#if defined(__INTEL_COMPILER)
# define DC__C_Intel
#elif defined(_MSC_VER)
# define DC__C_MSVC
#elif defined(__clang__) || defined(__llvm__)
# define DC__C_CLANG
#elif defined(__GNUC__)
# define DC__C_GNU
#elif defined(__WATCOMC__)
# define DC__C_WATCOM
#elif defined(__PCC__)
# define DC__C_PCC
#elif defined(__SUNPRO_C)
# define DC__C_SUNPRO
#else
# define DC__C_UNKNOWN
#endif
#if defined(_M_X64_) || defined(_M_AMD64) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
# define DC__Arch_AMD64
#elif defined(_M_IX86) || defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__386__) || defined(__i386)
# define DC__Arch_Intel_x86
#elif defined(_M_IA64) || defined(__ia64__)
# define DC__Arch_Itanium
#elif defined(_M_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__ppc__) || defined(__power__)
# if defined(__ppc64__) || defined(_ARCH_PPC64) || defined(__power64__) || defined(__powerpc64__)
# define DC__Arch_PPC64
# else
# define DC__Arch_PPC32
# endif
#elif defined(__mips64__) || defined(__mips64)
# define DC__Arch_MIPS64
#elif defined(_M_MRX000) || defined(__mips__) || defined(__mips) || defined(_mips)
# define DC__Arch_MIPS
#elif defined(__arm__)
# define DC__Arch_ARM
#elif defined(_M_ARM64) || defined(__aarch64__) || defined(__arm64) || defined(__arm64__)
# define DC__Arch_ARM64
#elif defined(__sh__)
# define DC__Arch_SuperH
#elif defined(__sparc) || defined(__sparc__)
# if defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || defined(__arch64__)
# define DC__Arch_Sparc64
# else
# define DC__Arch_Sparc
# endif
#endif
#if defined(__MSVCRT__)
# define DC__RT_MSVCRT
#endif
#if defined(DC__OS_Win32) || defined(DC__OS_Win64)
# define DC_WINDOWS
#elif defined(DC__OS_Plan9)
# define DC_PLAN9
#elif defined(DC__OS_NDS) || defined(DC__OS_PSP)
# define DC_OTHER
#else
# define DC_UNIX
#endif
#if defined(__arm__) && !defined(__thumb__)
# define DC__Arch_ARM_ARM
#elif defined(__arm__) && defined(__thumb__)
# define DC__Arch_ARM_THUMB
#endif
#if defined(DC__Arch_ARM_ARM) || defined(DC__Arch_ARM_THUMB)
# if defined(__ARM_EABI__) || defined(DC__OS_NDS)
# if defined (__ARM_PCS_VFP) && (__ARM_PCS_VFP == 1)
# define DC__ABI_ARM_HF
# else
# define DC__ABI_ARM_EABI
# endif
# elif defined(__APCS_32__)
# define DC__ABI_ARM_OABI
# endif
#endif /* ARM */
#if defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64)
# if defined(_ABIO32) || defined(__mips_o32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2)
# define DC__ABI_MIPS_O32
# elif defined(_ABI64) || defined(__mips_n64)
# define DC__ABI_MIPS_N64
# elif defined(_ABIN32)
# define DC__ABI_MIPS_N32
# else
# define DC__ABI_MIPS_EABI
# endif
# if (defined(__mips_hard_float) && (__mips_hard_float == 1)) || !defined(__mips_soft_float) || (__mips_soft_float != 1)
# define DC__ABI_HARDFLOAT /* @@@ make this general for all archs? */
# else
# define DC__ABI_SOFTFLOAT
# endif
#endif /* MIPS */
#if defined(DC__Arch_PPC64)
# if defined(_CALL_ELF)
# define DC__ABI_PPC64_ELF_V _CALL_ELF
# else
# define DC__ABI_PPC64_ELF_V 0 /* 0 means not explicitly set, otherwise this is 1 (big endian) and 2 (little endian) */
# endif
#endif /* PPC64 */
#if defined(DC__Arch_Intel_x86) || defined(DC__Arch_AMD64) /* always little */
# define DC__Endian_LITTLE
#elif defined(DC__Arch_Sparc) /* always purely big until v9 */
# define DC__Endian_BIG
#else /* all others are bi-endian */
# if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(MIPSEB) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) || defined(__ARMEB__) || defined(__AARCH64EB__)
# define DC__Endian_BIG
# elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(MIPSEL) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(__ARMEL__) || defined(__AARCH64EL__)
# define DC__Endian_LITTLE
# elif defined(DC__Arch_Sparc64) && !defined(__BYTE_ORDER__) /* Sparc64 default is big-endian, except if explicitly defined */
# define DC__Endian_BIG
# elif defined(BYTE_ORDER) || defined(_BYTE_ORDER) || defined(__BYTE_ORDER__) /* explicitly set byte order, either through compiler or platform specific endian.h */
# if (defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || (defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN)) || (defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
# define DC__Endian_BIG
# elif (defined(LITTLE_ENDIAN) && (BYTE_ORDER == LITTLE_ENDIAN)) || (defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN)) || (defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
# define DC__Endian_LITTLE
# endif
# elif (defined(_BIG_ENDIAN) && (_BIG_ENDIAN == 1)) || (defined(__BIG_ENDIAN__) && (__BIG_ENDIAN__ == 1)) /* explicitly set as on/off */
# define DC__Endian_BIG
# elif (defined(_LITTLE_ENDIAN) && (_LITTLE_ENDIAN == 1)) || (defined(__LITTLE_ENDIAN__) && (__LITTLE_ENDIAN__ == 1)) /* explicitly set as on/off */
# define DC__Endian_LITTLE
# endif /* no else, leave unset if not sure */
#endif
#if !defined(DC_API)
# define DC_API
#endif
#if (defined(DC__Arch_Intel_x86) || (defined(DC__Arch_AMD64) && defined(DC_UNIX)) || defined(DC__Arch_PPC32) || defined(DC__Arch_PPC64)) && \
!defined(DC__OS_MacOSX) && !defined(DC__OS_Plan9) && !defined(DC__OS_NDS) && !defined(DC__OS_PSP) && !defined(DC__OS_Minix) && !defined(DC__OS_SunOS) && !defined(DC__OS_BeOS)
# define DC__Feature_Syscall
#endif
#if defined(DC__Arch_AMD64)
# define DC__Feature_AggrByVal
#endif
#endif /* DYNCALL_MACROS_H */