Home | History | Annotate | Download | only in libffi.call
      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