]> git.ipfire.org Git - thirdparty/gcc.git/blob - libffi/testsuite/libffi.special/ffitestcxx.h
acinclude.m4: Add AC_FUNC_MMAP_BLACKLIST.
[thirdparty/gcc.git] / libffi / testsuite / libffi.special / ffitestcxx.h
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <ffi.h>
4 #include "fficonfig.h"
5
6 #define MAX_ARGS 256
7
8 #define CHECK(x) (!(x) ? abort() : (void)0)
9
10 /* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a
11 file open. */
12 #ifdef HAVE_MMAP_ANON
13 # undef HAVE_MMAP_DEV_ZERO
14
15 # include <sys/mman.h>
16 # ifndef MAP_FAILED
17 # define MAP_FAILED -1
18 # endif
19 # if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
20 # define MAP_ANONYMOUS MAP_ANON
21 # endif
22 # define USING_MMAP
23
24 #endif
25
26 #ifdef HAVE_MMAP_DEV_ZERO
27
28 # include <sys/mman.h>
29 # ifndef MAP_FAILED
30 # define MAP_FAILED -1
31 # endif
32 # define USING_MMAP
33
34 #endif
35
36 #ifdef USING_MMAP
37 static inline void *
38 allocate_mmap (size_t size)
39 {
40 void *page;
41 #if defined (HAVE_MMAP_DEV_ZERO)
42 static int dev_zero_fd = -1;
43 #endif
44
45 #ifdef HAVE_MMAP_DEV_ZERO
46 if (dev_zero_fd == -1)
47 {
48 dev_zero_fd = open ("/dev/zero", O_RDONLY);
49 if (dev_zero_fd == -1)
50 {
51 perror ("open /dev/zero: %m");
52 exit (1);
53 }
54 }
55 #endif
56
57
58 #ifdef HAVE_MMAP_ANON
59 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
60 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
61 #endif
62 #ifdef HAVE_MMAP_DEV_ZERO
63 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC,
64 MAP_PRIVATE, dev_zero_fd, 0);
65 #endif
66
67 if (page == MAP_FAILED)
68 {
69 perror ("virtual memory exhausted");
70 exit (1);
71 }
72
73 return page;
74 }
75
76 #endif