Mark ChangeLog
[official-gcc.git] / libffi / testsuite / libffi.special / ffitestcxx.h
blob01414cc1b0b9952efdf2035549acbc8d116af091
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <fcntl.h>
4 #include <ffi.h>
5 #include "fficonfig.h"
7 #define MAX_ARGS 256
9 #define CHECK(x) (!(x) ? abort() : (void)0)
11 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
12 file open. */
13 #ifdef HAVE_MMAP_ANON
14 # undef HAVE_MMAP_DEV_ZERO
16 # include <sys/mman.h>
17 # ifndef MAP_FAILED
18 # define MAP_FAILED -1
19 # endif
20 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
21 # define MAP_ANONYMOUS MAP_ANON
22 # endif
23 # define USING_MMAP
25 #endif
27 #ifdef HAVE_MMAP_DEV_ZERO
29 # include <sys/mman.h>
30 # ifndef MAP_FAILED
31 # define MAP_FAILED -1
32 # endif
33 # define USING_MMAP
35 #endif
37 #ifdef USING_MMAP
38 static inline void *
39 allocate_mmap (size_t size)
41 void *page;
42 #if defined (HAVE_MMAP_DEV_ZERO)
43 static int dev_zero_fd = -1;
44 #endif
46 #ifdef HAVE_MMAP_DEV_ZERO
47 if (dev_zero_fd == -1)
49 dev_zero_fd = open ("/dev/zero", O_RDONLY);
50 if (dev_zero_fd == -1)
52 perror ("open /dev/zero: %m");
53 exit (1);
56 #endif
59 #ifdef HAVE_MMAP_ANON
60 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
61 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
62 #endif
63 #ifdef HAVE_MMAP_DEV_ZERO
64 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
65 MAP_PRIVATE, dev_zero_fd, 0);
66 #endif
68 if (page == MAP_FAILED)
70 perror ("virtual memory exhausted");
71 exit (1);
74 return page;
77 #endif