github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libffi/testsuite/libffi.special/ffitestcxx.h (about) 1 #include <stdlib.h> 2 #include <stdio.h> 3 #include <fcntl.h> 4 #include <ffi.h> 5 #include "fficonfig.h" 6 7 #define MAX_ARGS 256 8 9 10 /* Define __UNUSED__ that also other compilers than gcc can run the tests. */ 11 #undef __UNUSED__ 12 #if defined(__GNUC__) 13 #define __UNUSED__ __attribute__((__unused__)) 14 #else 15 #define __UNUSED__ 16 #endif 17 18 #define CHECK(x) (!(x) ? abort() : (void)0) 19 20 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a 21 file open. */ 22 #ifdef HAVE_MMAP_ANON 23 # undef HAVE_MMAP_DEV_ZERO 24 25 # include <sys/mman.h> 26 # ifndef MAP_FAILED 27 # define MAP_FAILED -1 28 # endif 29 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) 30 # define MAP_ANONYMOUS MAP_ANON 31 # endif 32 # define USING_MMAP 33 34 #endif 35 36 #ifdef HAVE_MMAP_DEV_ZERO 37 38 # include <sys/mman.h> 39 # ifndef MAP_FAILED 40 # define MAP_FAILED -1 41 # endif 42 # define USING_MMAP 43 44 #endif 45 46 47 /* MinGW kludge. */ 48 #ifdef _WIN64 49 #define PRIdLL "I64d" 50 #define PRIuLL "I64u" 51 #else 52 #define PRIdLL "lld" 53 #define PRIuLL "llu" 54 #endif 55 56 #ifdef USING_MMAP 57 static inline void * 58 allocate_mmap (size_t size) 59 { 60 void *page; 61 #if defined (HAVE_MMAP_DEV_ZERO) 62 static int dev_zero_fd = -1; 63 #endif 64 65 #ifdef HAVE_MMAP_DEV_ZERO 66 if (dev_zero_fd == -1) 67 { 68 dev_zero_fd = open ("/dev/zero", O_RDONLY); 69 if (dev_zero_fd == -1) 70 { 71 perror ("open /dev/zero: %m"); 72 exit (1); 73 } 74 } 75 #endif 76 77 78 #ifdef HAVE_MMAP_ANON 79 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, 80 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 81 #endif 82 #ifdef HAVE_MMAP_DEV_ZERO 83 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, 84 MAP_PRIVATE, dev_zero_fd, 0); 85 #endif 86 87 if (page == (char *) MAP_FAILED) 88 { 89 perror ("virtual memory exhausted"); 90 exit (1); 91 } 92 93 return page; 94 } 95 96 #endif