From 48443f83f3a90e3f8d7f0ba5f7eb139ed1c1637d Mon Sep 17 00:00:00 2001 From: ian Date: Fri, 5 Mar 2004 01:22:58 +0000 Subject: [PATCH] * 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 --- gcc/ChangeLog | 6 ++++++ gcc/ggc-common.c | 28 +++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74fe101..46e93c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-03-04 Ian Lance Taylor + + * 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. + 2004-03-04 Bob Wilson * config/xtensa/xtensa.c (xtensa_return_in_msb): New function. 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 (); -- 2.7.4