diff options
author | John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | 2004-12-11 02:08:26 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2004-12-11 02:08:26 +0000 |
commit | b990f4bcb845926f6723af08e660170906b443f3 (patch) | |
tree | 665d79492cd373dd8c81c6479c14a49b532855a2 /gcc | |
parent | 3e5bcef316b5e5562490257735d9c6be0529652c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/pa/pa-host.c | 30 |
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; } |