Improve OpenBSD support: Allow faster VMA determination.
[libsigsegv/ericb.git] / m4 / mmap-anon.m4
blob9e4ebe9ad9ff36434c73d6296dd5cf0950c92772
1 # mmap-anon.m4 serial 4 (libsigsegv-2.9)
2 dnl Copyright (C) 2002-2003, 2008, 2010 Bruno Haible <bruno@clisp.org>
3 dnl This file is free software, distributed under the terms of the GNU
4 dnl General Public License.  As a special exception to the GNU General
5 dnl Public License, this file may be distributed as part of a program
6 dnl that contains a configuration script generated by Autoconf, under
7 dnl the same distribution terms as the rest of that program.
9 # How to allocate fresh memory using mmap.
10 AC_DEFUN([SV_MMAP_ANON],
12   AC_REQUIRE([AC_PROG_CC])
13   AC_REQUIRE([AC_CANONICAL_HOST])
15   dnl 1) MAP_ANON
17   AC_CACHE_CHECK([for mmap with MAP_ANON], [sv_cv_func_mmap_anon], [
18     AC_RUN_IFELSE([
19       AC_LANG_SOURCE([[
20 #include <sys/types.h>
21 #include <sys/mman.h>
22 int main ()
24   void *p = mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
25   return (p == (void *)(-1));
26 }]])],
27       [sv_cv_func_mmap_anon=yes],
28       [sv_cv_func_mmap_anon=no],
29       [
30         dnl FIXME: Put in some more known values here.
31         case "$host_os" in
32           freebsd* | linux* | osf* | darwin*)
33             sv_cv_func_mmap_anon=yes ;;
34           *)
35             AC_LINK_IFELSE([
36               AC_LANG_PROGRAM([[
37 #include <sys/types.h>
38 #include <sys/mman.h>
39 ]],
40                 [[mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);]])],
41               [sv_cv_func_mmap_anon="guessing yes"],
42               [sv_cv_func_mmap_anon=no])
43             ;;
44         esac
45       ])
46   ])
47   if test "$sv_cv_func_mmap_anon" != no; then
48     AC_DEFINE([HAVE_MMAP_ANON], [1],
49       [Define if <sys/mman.h> defines MAP_ANON and mmaping with MAP_ANON works.])
50   fi
52   dnl 2) MAP_ANONYMOUS
54   AC_CACHE_CHECK([for mmap with MAP_ANONYMOUS], [sv_cv_func_mmap_anonymous], [
55     AC_RUN_IFELSE([
56       AC_LANG_SOURCE([[
57 #include <sys/types.h>
58 #include <sys/mman.h>
59 int main ()
61   void *p = mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
62   return (p == (void *)(-1));
63 }]])],
64       [sv_cv_func_mmap_anonymous=yes],
65       [sv_cv_func_mmap_anonymous=no],
66       [
67         dnl FIXME: Put in some more known values here.
68         case "$host_os" in
69           hpux* | linux* | osf*)
70             sv_cv_func_mmap_anonymous=yes ;;
71           darwin*)
72             sv_cv_func_mmap_anonymous=no ;;
73           *)
74             AC_LINK_IFELSE([
75               AC_LANG_PROGRAM([[
76 #include <sys/types.h>
77 #include <sys/mman.h>
78 ]],
79                 [[mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);]])],
80               [sv_cv_func_mmap_anonymous="guessing yes"],
81               [sv_cv_func_mmap_anonymous=no])
82             ;;
83         esac
84       ])
85   ])
86   if test "$sv_cv_func_mmap_anonymous" != no; then
87     AC_DEFINE([HAVE_MMAP_ANONYMOUS], [1],
88       [Define if <sys/mman.h> defines MAP_ANONYMOUS and mmaping with MAP_ANONYMOUS
89    works.])
90   fi
92   dnl 3) MAP_FILE of /dev/zero
94   AC_CACHE_CHECK([for mmap of /dev/zero], [sv_cv_func_mmap_devzero], [
95     AC_RUN_IFELSE([
96       AC_LANG_SOURCE([[
97 #include <sys/types.h>
98 #include <sys/mman.h>
99 #include <fcntl.h>
100 #ifndef MAP_FILE
101 #define MAP_FILE 0
102 #endif
103 int main ()
105   int fd;
106   void *p;
107   fd = open ("/dev/zero", O_RDONLY, 0666);
108   if (fd < 0) return 1;
109   p = mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_FILE | MAP_PRIVATE, fd, 0);
110   return (p == (void *)(-1));
111 }]])],
112       [sv_cv_func_mmap_devzero=yes],
113       [sv_cv_func_mmap_devzero=no],
114       [
115         dnl FIXME: Put in some more known values here.
116         case "$host_os" in
117           freebsd* | irix* | linux* | osf* | solaris* | sunos4*)
118             sv_cv_func_mmap_devzero=yes ;;
119           darwin*)
120             sv_cv_func_mmap_devzero=no ;;
121           *)
122             AC_LINK_IFELSE([
123               AC_LANG_PROGRAM([[
124 #include <sys/types.h>
125 #include <sys/mman.h>
126 #ifndef MAP_FILE
127 #define MAP_FILE 0
128 #endif
129 ]], [[mmap (0, 0x10000, PROT_READ | PROT_WRITE, MAP_FILE | MAP_PRIVATE, 7, 0);]])],
130               [sv_cv_func_mmap_devzero="guessing yes"],
131               [sv_cv_func_mmap_devzero=no])
132             ;;
133         esac
134       ])
135   ])
136   if test "$sv_cv_func_mmap_devzero" != no; then
137     AC_DEFINE([HAVE_MMAP_DEVZERO], [1],
138       [Define if mmaping of the special device /dev/zero works.])
139   fi