aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2004-12-11 02:08:26 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2004-12-11 02:08:26 +0000
commitb990f4bcb845926f6723af08e660170906b443f3 (patch)
tree665d79492cd373dd8c81c6479c14a49b532855a2 /gcc
parent3e5bcef316b5e5562490257735d9c6be0529652c (diff)
downloadgcc-b990f4bcb845926f6723af08e660170906b443f3.zip
gcc-b990f4bcb845926f6723af08e660170906b443f3.tar.gz
gcc-b990f4bcb845926f6723af08e660170906b443f3.tar.bz2
pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH file to anonymous private map.
* pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH file to anonymous private map. From-SVN: r92027
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/pa/pa-host.c30
2 files changed, 21 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4656a74..61951ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-10 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ * pa-host.c (pa_gt_pch_use_address): Use lseek and read to copy PCH
+ file to anonymous private map.
+
2004-12-10 Roger Sayle <roger@eyesopen.com>
PR target/18002
diff --git a/gcc/config/pa/pa-host.c b/gcc/config/pa/pa-host.c
index 14f587c..fed18f9 100644
--- a/gcc/config/pa/pa-host.c
+++ b/gcc/config/pa/pa-host.c
@@ -22,6 +22,7 @@
#include "system.h"
#include "coretypes.h"
#include <sys/mman.h>
+#include <unistd.h>
#include "hosthooks.h"
#include "hosthooks-def.h"
@@ -70,11 +71,11 @@ pa_gt_pch_get_address (size_t size, int fd)
It's not possibly to reliably mmap a file using MAP_PRIVATE to
a specific START address on either hpux or linux. First we see
if mmap with MAP_PRIVATE works. If it does, we are off to the
- races. If it doesn't, we try an anonymous MAP_PRIVATE since the
+ races. If it doesn't, we try an anonymous private mmap since the
kernel is more likely to honor the BASE address in anonymous maps.
- We then mmap the file to an arbitrary location and copy the data
- to the anonymous private map. This assumes of course that we
- don't need to change the PCH data after the file is created.
+ We then copy the data to the anonymous private map. This assumes
+ of course that we don't need to change the data in the PCH file
+ after it is created.
This approach obviously causes a performance penalty but there is
little else we can do given the current PCH implementation. */
@@ -82,7 +83,7 @@ pa_gt_pch_get_address (size_t size, int fd)
static int
pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{
- void *addr, *faddr;
+ void *addr;
/* We're called with size == 0 if we're not planning to load a PCH
file at all. This allows the hook to free any static space that
@@ -91,8 +92,7 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
return -1;
/* Try to map the file with MAP_PRIVATE. */
- addr = mmap (base, size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE, fd, offset);
+ addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
if (addr == base)
return 1;
@@ -100,20 +100,22 @@ pa_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
+ /* Try to make an anonymous private mmap at the desired location. */
addr = mmap (base, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (addr != base)
- return -1;
+ {
+ if (addr != (void *) MAP_FAILED)
+ munmap (addr, size);
+ return -1;
+ }
- faddr = mmap (NULL, size, PROT_READ, MAP_PRIVATE,
- fd, offset);
-
- if (faddr == (void *) MAP_FAILED)
+ if (lseek (fd, offset, SEEK_SET) == (off_t)-1)
return -1;
- memcpy (addr, faddr, size);
- munmap (faddr, size);
+ if (read (fd, base, size) == -1)
+ return -1;
return 1;
}