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
This commit is contained in:
John David Anglin 2004-12-11 02:08:26 +00:00 committed by John David Anglin
parent 3e5bcef316
commit b990f4bcb8
2 changed files with 21 additions and 14 deletions

View File

@ -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

View File

@ -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,21 +100,23 @@ 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)
{
if (addr != (void *) MAP_FAILED)
munmap (addr, size);
return -1;
}
if (lseek (fd, offset, SEEK_SET) == (off_t)-1)
return -1;
faddr = mmap (NULL, size, PROT_READ, MAP_PRIVATE,
fd, offset);
if (faddr == (void *) MAP_FAILED)
if (read (fd, base, size) == -1)
return -1;
memcpy (addr, faddr, size);
munmap (faddr, size);
return 1;
}