From: Eric Botcazou Date: Sun, 8 Jun 2003 06:41:28 +0000 (+0000) Subject: re PR pch/9830 (PCH not working on Solaris) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8eb6a092cabdf4dbf91224ed32b63935a30766dd;p=gcc.git re PR pch/9830 (PCH not working on Solaris) PR pch/9830 * ggc-common.c (HAVE_MMAP_FILE): Include sys/types.h if HAVE_MINCORE is defined. (MAP_FAILED): Define if not defined. (gt_pch_save): Test against MAP_FAILED. (gt_pch_restore): If HAVE_MINCORE, use MAP_FIXED to force the mapping address to the preferred base after checking it is possible to do so. Test against MAP_FAILED. * configure.in: Test for the presence of mincore in libc. * config.in: Regenerate. * configure: Regenerate. From-SVN: r67614 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2cab6c69463..4bddae4d12b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2003-06-07  Eric Botcazou   +            Ulrich Weigand + + PR pch/9830 + * ggc-common.c (HAVE_MMAP_FILE): Include sys/types.h + if HAVE_MINCORE is defined. + (MAP_FAILED): Define if not defined. + (gt_pch_save): Test against MAP_FAILED. + (gt_pch_restore): If HAVE_MINCORE, use MAP_FIXED to force + the mapping address to the preferred base after checking it + is possible to do so. Test against MAP_FAILED. + * configure.in: Test for the presence of mincore in libc. + * config.in: Regenerate. + * configure: Regenerate. + 2003-06-07 Richard Henderson * config/alpha/alpha.c (alpha_setup_incoming_varargs): Fix diff --git a/gcc/config.in b/gcc/config.in index 0bb8e6aa37f..76b29200d46 100644 --- a/gcc/config.in +++ b/gcc/config.in @@ -165,6 +165,9 @@ /* Define if you have the mempcpy function. */ #undef HAVE_MEMPCPY +/* Define if you have the mincore function. */ +#undef HAVE_MINCORE + /* Define if you have the mmap function. */ #undef HAVE_MMAP diff --git a/gcc/configure b/gcc/configure index 3f53e246ff9..597fd80312b 100755 --- a/gcc/configure +++ b/gcc/configure @@ -3726,7 +3726,7 @@ fi for ac_func in times clock dup2 kill getrlimit setrlimit atoll atoq \ sysconf strsignal putc_unlocked fputc_unlocked fputs_unlocked \ fwrite_unlocked fprintf_unlocked getrusage nl_langinfo lstat \ - scandir alphasort gettimeofday mbstowcs wcswidth mmap + scandir alphasort gettimeofday mbstowcs wcswidth mmap mincore do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo "configure:3733: checking for $ac_func" >&5 diff --git a/gcc/configure.in b/gcc/configure.in index 183fcf6949d..d7e08b90702 100644 --- a/gcc/configure.in +++ b/gcc/configure.in @@ -797,7 +797,7 @@ dnl gcc_AC_C_ENUM_BF_UNSIGNED AC_CHECK_FUNCS(times clock dup2 kill getrlimit setrlimit atoll atoq \ sysconf strsignal putc_unlocked fputc_unlocked fputs_unlocked \ fwrite_unlocked fprintf_unlocked getrusage nl_langinfo lstat \ - scandir alphasort gettimeofday mbstowcs wcswidth mmap) + scandir alphasort gettimeofday mbstowcs wcswidth mmap mincore) if test x$ac_cv_func_mbstowcs = xyes; then AC_CACHE_CHECK(whether mbstowcs works, gcc_cv_func_mbstowcs_works, diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c index 8e5be8ca299..4d1889c41d0 100644 --- a/gcc/ggc-common.c +++ b/gcc/ggc-common.c @@ -36,6 +36,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef HAVE_MMAP_FILE # include +# ifdef HAVE_MINCORE +/* This is on Solaris. */ +# include +# endif +#endif + +#ifndef MAP_FAILED +# define MAP_FAILED ((void *)-1) #endif #ifdef ENABLE_VALGRIND_CHECKING @@ -449,7 +457,7 @@ gt_pch_save (FILE *f) mmi.preferred_base = mmap (NULL, mmi.size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileno (state.f), 0); - if (mmi.preferred_base == (void *)-1) + if (mmi.preferred_base == MAP_FAILED) mmi.preferred_base = NULL; else munmap (mmi.preferred_base, mmi.size); @@ -567,10 +575,41 @@ gt_pch_restore (FILE *f) addr = mmap (mmi.preferred_base, mmi.size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileno (f), mmi.offset); -#else - addr = (void *)-1; -#endif - if (addr == (void *)-1) + +#if HAVE_MINCORE + if (addr != mmi.preferred_base) + { + size_t page_size = getpagesize(); + char one_byte; + + if (addr != MAP_FAILED) + munmap (addr, mmi.size); + + /* We really want to be mapped at mmi.preferred_base + so we're going to resort to MAP_FIXED. But before, + make sure that we can do so without destroying a + previously mapped area, by looping over all pages + that would be affected by the fixed mapping. */ + errno = 0; + + for (i = 0; i < mmi.size; i+= page_size) + if (mincore ((char *)mmi.preferred_base + i, page_size, (void *)&one_byte) == -1 + && errno == ENOMEM) + continue; /* The page is not mapped. */ + else + break; + + if (i >= mmi.size) + addr = mmap (mmi.preferred_base, mmi.size, + PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, + fileno (f), mmi.offset); + } +#endif /* HAVE_MINCORE */ + +#else /* HAVE_MMAP_FILE */ + addr = MAP_FAILED; +#endif /* HAVE_MMAP_FILE */ + if (addr == MAP_FAILED) { addr = xmalloc (mmi.size); if (fseek (f, mmi.offset, SEEK_SET) != 0