diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-05 01:22:58 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-05 01:22:58 +0000 |
commit | 48443f83f3a90e3f8d7f0ba5f7eb139ed1c1637d (patch) | |
tree | bd936bab9777a92f642e62c30d1de8e9f715ed63 /gcc/ggc-common.c | |
parent | 110f993e1200d44a12f436553171c0592f26380d (diff) | |
download | gcc-48443f83f3a90e3f8d7f0ba5f7eb139ed1c1637d.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78957 138bc75d-0d04-0410-961f-82ee72b054a4
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 70a0d084c81..ba951f46ed9 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 (); |