aboutsummaryrefslogtreecommitdiff
path: root/gcc/ggc-common.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@wasabisystems.com>2004-03-05 01:22:58 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2004-03-05 01:22:58 +0000
commitee0d75efea863e2d9b9e60b249d1e57ec771d038 (patch)
treebd936bab9777a92f642e62c30d1de8e9f715ed63 /gcc/ggc-common.c
parent6e5ff6e7fba04bf828f7440f6248306b28dae94c (diff)
downloadgcc-ee0d75efea863e2d9b9e60b249d1e57ec771d038.zip
gcc-ee0d75efea863e2d9b9e60b249d1e57ec771d038.tar.gz
gcc-ee0d75efea863e2d9b9e60b249d1e57ec771d038.tar.bz2
ggc-common.c (gt_pch_restore): Don't unmap addr unless we are going to call mmap again.
* ggc-common.c (gt_pch_restore): Don't unmap addr unless we are going to call mmap again. Read the file into the right place. Give a fatal error if we have to relocate. From-SVN: r78957
Diffstat (limited to 'gcc/ggc-common.c')
-rw-r--r--gcc/ggc-common.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c
index 70a0d08..ba951f4 100644
--- a/gcc/ggc-common.c
+++ b/gcc/ggc-common.c
@@ -607,23 +607,20 @@ gt_pch_restore (FILE *f)
addr = mmap (mmi.preferred_base, mmi.size,
PROT_READ | PROT_WRITE, MAP_PRIVATE,
fileno (f), mmi.offset);
-
+
#if HAVE_MINCORE
if (addr != mmi.preferred_base)
{
size_t page_size = getpagesize();
char one_byte;
-
- if (addr != (void *) 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
@@ -631,14 +628,19 @@ gt_pch_restore (FILE *f)
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);
+ {
+ if (addr != (void *) MAP_FAILED)
+ munmap (addr, mmi.size);
+
+ addr = mmap (mmi.preferred_base, mmi.size,
+ PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED,
+ fileno (f), mmi.offset);
+ }
}
#endif /* HAVE_MINCORE */
-
+
needs_read = addr == (void *) MAP_FAILED;
#else /* HAVE_MMAP_FILE */
@@ -651,7 +653,7 @@ gt_pch_restore (FILE *f)
if (needs_read)
{
if (fseek (f, mmi.offset, SEEK_SET) != 0
- || fread (&mmi, mmi.size, 1, f) != 1)
+ || fread (addr, mmi.size, 1, f) != 1)
fatal_error ("can't read PCH file: %m");
}
else if (fseek (f, mmi.offset + mmi.size, SEEK_SET) != 0)
@@ -679,7 +681,7 @@ gt_pch_restore (FILE *f)
*ptr += (size_t)addr - (size_t)mmi.preferred_base;
}
- sorry ("had to relocate PCH");
+ fatal_error ("had to relocate PCH");
}
gt_pch_restore_stringpool ();