1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <fcntl.h> 5 #include <ffi.h> 6 #include "fficonfig.h" 7 8 #if defined HAVE_STDINT_H 9 #include <stdint.h> 10 #endif 11 12 #if defined HAVE_INTTYPES_H 13 #include <inttypes.h> 14 #endif 15 16 #define MAX_ARGS 256 17 18 #define CHECK(x) (void)(!(x) ? (abort(), 1) : 0) 19 20 /* Define macros so that compilers other than gcc can run the tests. */ 21 #undef __UNUSED__ 22 #if defined(__GNUC__) 23 #define __UNUSED__ __attribute__((__unused__)) 24 #define __STDCALL__ __attribute__((stdcall)) 25 #define __THISCALL__ __attribute__((thiscall)) 26 #define __FASTCALL__ __attribute__((fastcall)) 27 #else 28 #define __UNUSED__ 29 #define __STDCALL__ __stdcall 30 #define __THISCALL__ __thiscall 31 #define __FASTCALL__ __fastcall 32 #endif 33 34 #ifndef ABI_NUM 35 #define ABI_NUM FFI_DEFAULT_ABI 36 #define ABI_ATTR 37 #endif 38 39 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a 40 file open. */ 41 #ifdef HAVE_MMAP_ANON 42 # undef HAVE_MMAP_DEV_ZERO 43 44 # include <sys/mman.h> 45 # ifndef MAP_FAILED 46 # define MAP_FAILED -1 47 # endif 48 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) 49 # define MAP_ANONYMOUS MAP_ANON 50 # endif 51 # define USING_MMAP 52 53 #endif 54 55 #ifdef HAVE_MMAP_DEV_ZERO 56 57 # include <sys/mman.h> 58 # ifndef MAP_FAILED 59 # define MAP_FAILED -1 60 # endif 61 # define USING_MMAP 62 63 #endif 64 65 /* MinGW kludge. */ 66 #ifdef _WIN64 67 #define PRIdLL "I64d" 68 #define PRIuLL "I64u" 69 #else 70 #define PRIdLL "lld" 71 #define PRIuLL "llu" 72 #endif 73 74 /* Tru64 UNIX kludge. */ 75 #if defined(__alpha__) && defined(__osf__) 76 /* Tru64 UNIX V4.0 doesn't support %lld/%lld, but long is 64-bit. */ 77 #undef PRIdLL 78 #define PRIdLL "ld" 79 #undef PRIuLL 80 #define PRIuLL "lu" 81 #define PRId8 "hd" 82 #define PRIu8 "hu" 83 #define PRId64 "ld" 84 #define PRIu64 "lu" 85 #define PRIuPTR "lu" 86 #endif 87 88 /* PA HP-UX kludge. */ 89 #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR) 90 #define PRIuPTR "lu" 91 #endif 92 93 /* IRIX kludge. */ 94 #if defined(__sgi) 95 /* IRIX 6.5 <inttypes.h> provides all definitions, but only for C99 96 compilations. */ 97 #define PRId8 "hhd" 98 #define PRIu8 "hhu" 99 #if (_MIPS_SZLONG == 32) 100 #define PRId64 "lld" 101 #define PRIu64 "llu" 102 #endif 103 /* This doesn't match <inttypes.h>, which always has "lld" here, but the 104 arguments are uint64_t, int64_t, which are unsigned long, long for 105 64-bit in <sgidefs.h>. */ 106 #if (_MIPS_SZLONG == 64) 107 #define PRId64 "ld" 108 #define PRIu64 "lu" 109 #endif 110 /* This doesn't match <inttypes.h>, which has "u" here, but the arguments 111 are uintptr_t, which is always unsigned long. */ 112 #define PRIuPTR "lu" 113 #endif 114 115 /* Solaris < 10 kludge. */ 116 #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR) 117 #if defined(__arch64__) || defined (__x86_64__) 118 #define PRIuPTR "lu" 119 #else 120 #define PRIuPTR "u" 121 #endif 122 #endif 123 124 /* MSVC kludge. */ 125 #if defined _MSC_VER 126 #define PRIuPTR "lu" 127 #define PRIu8 "u" 128 #define PRId8 "d" 129 #define PRIu64 "I64u" 130 #define PRId64 "I64d" 131 #endif 132 133 #ifndef PRIuPTR 134 #define PRIuPTR "u" 135 #endif 136