From 8eb6a092cabdf4dbf91224ed32b63935a30766dd Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 8 Jun 2003 06:41:28 +0000 Subject: 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 --- gcc/ggc-common.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) (limited to 'gcc/ggc-common.c') 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 +# 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 -- cgit v1.1