aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-06-08 06:41:28 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-06-08 06:41:28 +0000
commit8eb6a092cabdf4dbf91224ed32b63935a30766dd (patch)
tree88ecf2cfe1c6969a132fe87f02608ce70f8f7757
parent2236275562e5a37fa3e8d14aa65d5708d5cc0dac (diff)
downloadgcc-8eb6a092cabdf4dbf91224ed32b63935a30766dd.zip
gcc-8eb6a092cabdf4dbf91224ed32b63935a30766dd.tar.gz
gcc-8eb6a092cabdf4dbf91224ed32b63935a30766dd.tar.bz2
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
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/config.in3
-rwxr-xr-xgcc/configure2
-rw-r--r--gcc/configure.in2
-rw-r--r--gcc/ggc-common.c49
5 files changed, 64 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2cab6c6..4bddae4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config.in b/gcc/config.in
index 0bb8e6a..76b2920 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 3f53e24..597fd80 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 183fcf6..d7e08b9 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 8e5be8c..4d1889c 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 <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