diff options
author | Ian Lance Taylor <ian@wasabisystems.com> | 2004-03-05 01:22:58 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2004-03-05 01:22:58 +0000 |
commit | ee0d75efea863e2d9b9e60b249d1e57ec771d038 (patch) | |
tree | bd936bab9777a92f642e62c30d1de8e9f715ed63 /gcc/ggc-common.c | |
parent | 6e5ff6e7fba04bf828f7440f6248306b28dae94c (diff) | |
download | gcc-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.c | 28 |
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 (); |