#include #include #include #include #include #include "fficonfig.h" #if defined HAVE_STDINT_H #include #endif #if defined HAVE_INTTYPES_H #include #endif #define MAX_ARGS 256 #define CHECK(x) !(x) ? abort() : 0 /* Define __UNUSED__ that also other compilers than gcc can run the tests. */ #undef __UNUSED__ #if defined(__GNUC__) #define __UNUSED__ __attribute__((__unused__)) #else #define __UNUSED__ #endif /* Define __FASTCALL__ so that other compilers than gcc can run the tests. */ #undef __FASTCALL__ #if defined _MSC_VER #define __FASTCALL__ __fastcall #else #define __FASTCALL__ __attribute__((fastcall)) #endif /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a file open. */ #ifdef HAVE_MMAP_ANON # undef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) # define MAP_ANONYMOUS MAP_ANON # endif # define USING_MMAP #endif #ifdef HAVE_MMAP_DEV_ZERO # include # ifndef MAP_FAILED # define MAP_FAILED -1 # endif # define USING_MMAP #endif /* MinGW kludge. */ #ifdef _WIN64 #define PRIdLL "I64d" #define PRIuLL "I64u" #else #define PRIdLL "lld" #define PRIuLL "llu" #endif /* Tru64 UNIX kludge. */ #if defined(__alpha__) && defined(__osf__) /* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ #undef PRIdLL #define PRIdLL "ld" #undef PRIuLL #define PRIuLL "lu" #define PRId8 "hd" #define PRIu8 "hu" #define PRId64 "ld" #define PRIu64 "lu" #define PRIuPTR "lu" #endif /* PA HP-UX kludge. */ #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) #define PRIuPTR "lu" #endif /* IRIX kludge. */ #if defined(__sgi) /* IRIX 6.5 provides all definitions, but only for C99 compilations. */ #define PRId8 "hhd" #define PRIu8 "hhu" #if (_MIPS_SZLONG == 32) #define PRId64 "lld" #define PRIu64 "llu" #endif /* This doesn't match , which always has "lld" here, but the arguments are uint64_t, int64_t, which are unsigned long, long for 64-bit in . */ #if (_MIPS_SZLONG == 64) #define PRId64 "ld" #define PRIu64 "lu" #endif /* This doesn't match , which has "u" here, but the arguments are uintptr_t, which is always unsigned long. */ #define PRIuPTR "lu" #endif /* Solaris < 10 kludge. */ #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) #if defined(__arch64__) || defined (__x86_64__) #define PRIuPTR "lu" #else #define PRIuPTR "u" #endif #endif /* MSVC kludge. */ #if defined _MSC_VER #define PRIuPTR "lu" #define PRIu8 "u" #define PRId8 "d" #define PRIu64 "I64u" #define PRId64 "I64d" #endif #ifdef USING_MMAP static inline void * allocate_mmap (size_t size) { void *page; #if defined (HAVE_MMAP_DEV_ZERO) static int dev_zero_fd = -1; #endif #ifdef HAVE_MMAP_DEV_ZERO if (dev_zero_fd == -1) { dev_zero_fd = open ("/dev/zero", O_RDONLY); if (dev_zero_fd == -1) { perror ("open /dev/zero: %m"); exit (1); } } #endif #ifdef HAVE_MMAP_ANON page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); #endif #ifdef HAVE_MMAP_DEV_ZERO page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, dev_zero_fd, 0); #endif if (page == (void *) MAP_FAILED) { perror ("virtual memory exhausted"); exit (1); } return page; } #endif