re PR pch/9830 (PCH not working on Solaris)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Sun, 8 Jun 2003 06:41:28 +0000 (06:41 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 8 Jun 2003 06:41:28 +0000 (06:41 +0000)
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

gcc/ChangeLog
gcc/config.in
gcc/configure
gcc/configure.in
gcc/ggc-common.c

index 2cab6c69463a5304b241d9b0aab39da981995807..4bddae4d12bd0244b402b5f42004db5603f728df 100644 (file)
@@ -1,3 +1,18 @@
+2003-06-07  Eric Botcazou  <ebotcazou@libertysurf.fr>
+            Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       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  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_setup_incoming_varargs): Fix
index 0bb8e6aa37f4c19d09890e267a217d11d9053b3d..76b29200d46d2a9380139751ae61528090c54acd 100644 (file)
 /* 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
 
index 3f53e246ff9c74cb8213e0aab47f881c14dfe832..597fd80312b639d5794e974a191cfcdd03b73ca5 100755 (executable)
@@ -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
index 183fcf6949d5d8eb993254e3b02ba1233c694786..d7e08b90702899135659dc8b593eb70a0c77e8d4 100644 (file)
@@ -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,
index 8e5be8ca299b7c2873f770e08395255e86020477..4d1889c41d031c599638b15c12fcb8692de2e75c 100644 (file)
@@ -36,6 +36,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #ifdef HAVE_MMAP_FILE
 # include <sys/mman.h>
+# ifdef HAVE_MINCORE
+/* This is on Solaris.  */
+#  include <sys/types.h> 
+# 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