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