diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2003-06-04 22:21:21 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2003-06-04 22:21:21 +0000 |
commit | 1072ec3fdc48a1fe16084bdb046077bbb43e1216 (patch) | |
tree | 4ea4a5a16922d570cbaeba85a4ea51dc9bcd29d5 /gcc/aclocal.m4 | |
parent | 88d5a16e0b42cb6871bf30e770ee75feb0da967b (diff) | |
download | gcc-1072ec3fdc48a1fe16084bdb046077bbb43e1216.tar.gz |
re PR bootstrap/3163 ([3.3 Only] gcc/aclocal.m4 mmap test fails on UnixWare 7.1.1)
PR bootstrap/3163
* aclocal.m4 (AC_FUNC_MMAP_ANYWHERE, AC_FUNC_MMAP_FILE): Delete.
(gcc_AC_FUNC_MMAP_BLACKLIST): New.
* configure.in: Check for sys/mman.h and mmap in AC_CHECK_HEADERS
and AC_CHECK_FUNCS lists, respectively. Use
gcc_AC_FUNC_MMAP_BLACKLIST, not AC_FUNC_MMAP_ANYWHERE nor
AC_FUNC_MMAP_FILE.
* configure, config.in: Regenerate.
From-SVN: r67467
Diffstat (limited to 'gcc/aclocal.m4')
-rw-r--r-- | gcc/aclocal.m4 | 422 |
1 files changed, 79 insertions, 343 deletions
diff --git a/gcc/aclocal.m4 b/gcc/aclocal.m4 index 34690faf41b..12848de9f4e 100644 --- a/gcc/aclocal.m4 +++ b/gcc/aclocal.m4 @@ -398,357 +398,93 @@ fi AC_SUBST($1)dnl ]) -# Check whether mmap can map an arbitrary page from /dev/zero or with -# MAP_ANONYMOUS, without MAP_FIXED. -AC_DEFUN([AC_FUNC_MMAP_ANYWHERE], -[AC_CHECK_FUNCS(getpagesize) -# The test program for the next two tests is the same except for one -# set of ifdefs. -changequote({{{,}}})dnl -{{{cat >ct-mmap.inc <<'EOF' -#include <sys/types.h> +# mmap(2) blacklisting. Some platforms provide the mmap library routine +# but don't support all of the features we need from it. +AC_DEFUN([gcc_AC_FUNC_MMAP_BLACKLIST], +[if test $ac_cv_header_sys_mman_h != yes \ + || test $ac_cv_func_mmap != yes; then + gcc_cv_func_mmap_file=no + gcc_cv_func_mmap_dev_zero=no + gcc_cv_func_mmap_anon=no +else + AC_CACHE_CHECK([whether read-only mmap of a plain file works], + gcc_cv_func_mmap_file, + [# Add a system to this blacklist if + # mmap(0, stat_size, PROT_READ, MAP_PRIVATE, fd, 0) doesn't return a + # memory area containing the same data that you'd get if you applied + # read() to the same fd. The only system known to have a problem here + # is VMS, where text files have record structure. + case "$host_os" in + vms*) + gcc_cv_func_mmap_file=no ;; + *) + gcc_cv_func_mmap_file=yes;; + esac]) + AC_CACHE_CHECK([whether mmap from /dev/zero works], + gcc_cv_func_mmap_dev_zero, + [# Add a system to this blacklist if it has mmap() but /dev/zero + # does not exist, or if mmapping /dev/zero does not give anonymous + # zeroed pages with both the following properties: + # 1. If you map N consecutive pages in with one call, and then + # unmap any subset of those pages, the pages that were not + # explicitly unmapped remain accessible. + # 2. If you map two adjacent blocks of memory and then unmap them + # both at once, they must both go away. + # Systems known to be in this category are Windows (all variants), + # VMS, and Darwin. + case "$host_os" in + vms* | cygwin* | pe | mingw* | darwin*) + gcc_cv_func_mmap_dev_zero=no ;; + *) + gcc_cv_func_mmap_dev_zero=yes;; + esac]) + + # Unlike /dev/zero, the MAP_ANON(YMOUS) defines can be probed for. + AC_CACHE_CHECK([for MAP_ANON(YMOUS)], gcc_cv_decl_map_anon, + [AC_TRY_COMPILE( +[#include <sys/types.h> #include <sys/mman.h> -#include <fcntl.h> -#include <signal.h> -#include <setjmp.h> -#include <stdio.h> - -#if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) -# define MAP_ANONYMOUS MAP_ANON -#endif - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef HAVE_UNISTD_H -# include <unistd.h> -# endif - -/* Assume that all systems that can run configure have sys/param.h. */ -# ifndef HAVE_SYS_PARAM_H -# define HAVE_SYS_PARAM_H 1 -# endif - -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -#ifndef MAP_FAILED -# define MAP_FAILED -1 -#endif - -#undef perror_exit -#define perror_exit(str, val) \ - do { perror(str); exit(val); } while (0) - -/* Some versions of cygwin mmap require that munmap is called with the - same parameters as mmap. GCC expects that this is not the case. - Test for various forms of this problem. Warning - icky signal games. */ - -static sigset_t unblock_sigsegv; -static jmp_buf r; -static size_t pg; -static int devzero; - -static char * -anonmap (size) - size_t size; -{ -#ifdef USE_MAP_ANON - return (char *) mmap (0, size, PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); -#else - return (char *) mmap (0, size, PROT_READ|PROT_WRITE, - MAP_PRIVATE, devzero, 0); -#endif -} - -static void -sigsegv (unused) - int unused; -{ - sigprocmask (SIG_UNBLOCK, &unblock_sigsegv, 0); - longjmp (r, 1); -} - -/* Basic functionality test. */ -void -test_0 () -{ - char *x = anonmap (pg); - if (x == (char *) MAP_FAILED) - perror_exit("test 0 mmap", 2); - - *(int *)x += 1; - - if (munmap(x, pg) < 0) - perror_exit("test 0 munmap", 3); -} - -/* 1. If we map a 2-page region and unmap its second page, the first page - must remain. */ -static void -test_1 () -{ - char *x = anonmap (pg * 2); - if (x == (char *)MAP_FAILED) - perror_exit ("test 1 mmap", 4); - - signal (SIGSEGV, sigsegv); - if (setjmp (r)) - perror_exit ("test 1 fault", 5); - - x[0] = 1; - x[pg] = 1; - - if (munmap (x + pg, pg) < 0) - perror_exit ("test 1 munmap 1", 6); - x[0] = 2; - - if (setjmp (r) == 0) - { - x[pg] = 1; - perror_exit ("test 1 no fault", 7); - } - if (munmap (x, pg) < 0) - perror_exit ("test 1 munmap 2", 8); -} - -/* 2. If we map a 2-page region and unmap its first page, the second - page must remain. */ -static void -test_2 () -{ - char *x = anonmap (pg * 2); - if (x == (char *)MAP_FAILED) - perror_exit ("test 2 mmap", 9); - - signal (SIGSEGV, sigsegv); - if (setjmp (r)) - perror_exit ("test 2 fault", 10); - - x[0] = 1; - x[pg] = 1; - - if (munmap (x, pg) < 0) - perror_exit ("test 2 munmap 1", 11); - - x[pg] = 2; - - if (setjmp (r) == 0) - { - x[0] = 1; - perror_exit ("test 2 no fault", 12); - } - - if (munmap (x+pg, pg) < 0) - perror_exit ("test 2 munmap 2", 13); -} +#include <unistd.h> -/* 3. If we map two adjacent 1-page regions and unmap them both with - one munmap, both must go away. - - Getting two adjacent 1-page regions with two mmap calls is slightly - tricky. All OS's tested skip over already-allocated blocks; therefore - we have been careful to unmap all allocated regions in previous tests. - HP/UX allocates pages backward in memory. No OS has yet been observed - to be so perverse as to leave unmapped space between consecutive calls - to mmap. */ - -static void -test_3 () -{ - char *x, *y, *z; - - x = anonmap (pg); - if (x == (char *)MAP_FAILED) - perror_exit ("test 3 mmap 1", 14); - y = anonmap (pg); - if (y == (char *)MAP_FAILED) - perror_exit ("test 3 mmap 2", 15); - - if (y != x + pg) - { - if (y == x - pg) - z = y, y = x, x = z; - else - { - fprintf (stderr, "test 3 nonconsecutive pages - %lx, %lx\n", - (unsigned long)x, (unsigned long)y); - exit (16); - } - } - - signal (SIGSEGV, sigsegv); - if (setjmp (r)) - perror_exit ("test 3 fault", 17); - - x[0] = 1; - y[0] = 1; - - if (munmap (x, pg*2) < 0) - perror_exit ("test 3 munmap", 18); - - if (setjmp (r) == 0) - { - x[0] = 1; - perror_exit ("test 3 no fault 1", 19); - } - - signal (SIGSEGV, sigsegv); - if (setjmp (r) == 0) - { - y[0] = 1; - perror_exit ("test 3 no fault 2", 20); - } -} - -int -main () -{ - sigemptyset (&unblock_sigsegv); - sigaddset (&unblock_sigsegv, SIGSEGV); - pg = getpagesize (); -#ifndef USE_MAP_ANON - devzero = open ("/dev/zero", O_RDWR); - if (devzero < 0) - perror_exit ("open /dev/zero", 1); +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON #endif - - test_0(); - test_1(); - test_2(); - test_3(); - - exit(0); -} -EOF}}} -changequote([,])dnl - -AC_CACHE_CHECK(for working mmap from /dev/zero, - ac_cv_func_mmap_dev_zero, -[AC_TRY_RUN( - [#include "ct-mmap.inc"], - ac_cv_func_mmap_dev_zero=yes, - [if test $? -lt 4 - then ac_cv_func_mmap_dev_zero=no - else ac_cv_func_mmap_dev_zero=buggy - fi], - # When cross-building, assume that this works, unless we know it - # doesn't. Of course, we have no way of knowing if there even is a /dev/zero - # on the host, let alone whether mmap will work on it. - [case "$host_os" in - cygwin* | win32 | pe | mingw* ) ac_cv_func_mmap_dev_zero=buggy ;; - darwin* ) ac_cv_func_mmap_dev_zero=no ;; - * ) ac_cv_func_mmap_dev_zero=yes ;; - esac]) -]) -if test $ac_cv_func_mmap_dev_zero = yes; then - AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, - [Define if mmap can get us zeroed pages from /dev/zero.]) -fi - -AC_CACHE_CHECK([for working mmap with MAP_ANON(YMOUS)], - ac_cv_func_mmap_anon, -[AC_TRY_RUN( - [#define USE_MAP_ANON -#include "ct-mmap.inc"], - ac_cv_func_mmap_anon=yes, - [if test $? -lt 4 - then ac_cv_func_mmap_anon=no - else ac_cv_func_mmap_anon=buggy - fi], - # Unlike /dev/zero, it is not safe to assume MAP_ANON(YMOUS) works - # just because it's there. Some SCO Un*xen define it but don't implement it. - [case "$host_os" in - darwin* ) ac_cv_func_mmap_anon=yes ;; - * ) ac_cv_func_mmap_anon=no ;; - esac]) -]) -if test $ac_cv_func_mmap_anon = yes; then - AC_DEFINE(HAVE_MMAP_ANON, 1, - [Define if mmap can get us zeroed pages using MAP_ANON(YMOUS).]) +], +[int n = MAP_ANONYMOUS;], + gcc_cv_decl_map_anon=yes, + gcc_cv_decl_map_anon=no)]) + + if test $gcc_cv_decl_map_anon = no; then + gcc_cv_func_mmap_anon=no + else + AC_CACHE_CHECK([whether mmap with MAP_ANON(YMOUS) works], + gcc_cv_func_mmap_anon, + [# Add a system to this blacklist if it has mmap() and MAP_ANON or + # MAP_ANONYMOUS, but using mmap(..., MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + # doesn't give anonymous zeroed pages with the same properties listed + # above for use of /dev/zero. + # Systems known to be in this category are Windows, VMS, and SCO Unix. + case "$host_os" in + vms* | cygwin* | pe | mingw* | sco* | udk* ) + gcc_cv_func_mmap_anon=no ;; + *) + gcc_cv_func_mmap_anon=yes;; + esac]) + fi fi -rm -f ct-mmap.inc -]) - -# Check whether mmap can map a plain file, without MAP_FIXED. -AC_DEFUN([AC_FUNC_MMAP_FILE], -[AC_CACHE_CHECK(for working mmap of a file, ac_cv_func_mmap_file, -[# Create a file one thousand bytes long. -for i in 1 2 3 4 5 6 7 8 9 0 -do for j in 1 2 3 4 5 6 7 8 9 0 -do echo $i $j xxxxx -done -done > conftestdata$$ - -AC_TRY_RUN([ -/* Test by Zack Weinberg. Modified from MMAP_ANYWHERE test by - Richard Henderson and Alexandre Oliva. - Check whether read-only mmap of a plain file works. */ -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <sys/mman.h> -int main() -{ - char *x; - int fd; - struct stat st; - - fd = open("conftestdata$$", O_RDONLY); - if (fd < 0) - exit(1); - - if (fstat (fd, &st)) - exit(2); - - x = (char*)mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (x == (char *) -1) - exit(3); - - if (x[0] != '1' || x[1] != ' ' || x[2] != '1' || x[3] != ' ') - exit(4); - - if (munmap(x, st.st_size) < 0) - exit(5); - - exit(0); -}], ac_cv_func_mmap_file=yes, ac_cv_func_mmap_file=no, - [case "$host_os" in - darwin* ) ac_cv_func_mmap_file=yes ;; - * ) ac_cv_func_mmap_file=no ;; - esac])]) -if test $ac_cv_func_mmap_file = yes; then +if test $gcc_cv_func_mmap_file = yes; then AC_DEFINE(HAVE_MMAP_FILE, 1, [Define if read-only mmap of a plain file works.]) fi +if test $gcc_cv_func_mmap_dev_zero = yes; then + AC_DEFINE(HAVE_MMAP_DEV_ZERO, 1, + [Define if mmap of /dev/zero works.]) +fi +if test $gcc_cv_func_mmap_anon = yes; then + AC_DEFINE(HAVE_MMAP_ANON, 1, + [Define if mmap with MAP_ANON(YMOUS) works.]) +fi ]) dnl Locate a program and check that its version is acceptable. |