re PR pch/14940 (PCH largefile test fails on various platforms)

2005-02-15  James A. Morrison  <phython@gcc.gnu.org>

       PR pch/14940
       PR target/19300
       * config/host-linux.c (linux_gt_pch_use_address): Copy from
       config/pa/pa-host.c:pa_gt_pch_use_address.

From-SVN: r95073
This commit is contained in:
James A. Morrison 2005-02-15 20:52:13 +00:00
parent eace8c18aa
commit 14be52a22c
2 changed files with 73 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
PR pch/14940
PR target/19300
* config/host-linux.c (linux_gt_pch_use_address): Copy from
config/pa/pa-host.c:pa_gt_pch_use_address.
2005-02-15 Daniel Berlin <dberlin@dberlin.org>
* tree-vn.c (get_value_handle): Make sure that given an

View File

@ -61,6 +61,9 @@
#undef HOST_HOOKS_GT_PCH_GET_ADDRESS
#define HOST_HOOKS_GT_PCH_GET_ADDRESS linux_gt_pch_get_address
#undef HOST_HOOKS_GT_PCH_USE_ADDRESS
#define HOST_HOOKS_GT_PCH_USE_ADDRESS linux_gt_pch_use_address
/* For various ports, try to guess a fixed spot in the vm space
that's probably free. */
#if defined(__alpha)
@ -143,5 +146,68 @@ linux_gt_pch_get_address (size_t size, int fd)
return addr;
}
/* Map SIZE bytes of FD+OFFSET at BASE. Return 1 if we succeeded at
mapping the data at BASE, -1 if we couldn't.
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 private mmap since the
kernel is more likely to honor the BASE address in anonymous maps.
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. */
static int
linux_gt_pch_use_address (void *base, size_t size, int fd, size_t offset)
{
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
we might have allocated at link time. */
if (size == 0)
return -1;
/* Try to map the file with MAP_PRIVATE. */
addr = mmap (base, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset);
if (addr == base)
return 1;
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;
while (size)
{
ssize_t nbytes;
nbytes = read (fd, base, MIN (size, SSIZE_MAX));
if (nbytes <= 0)
return -1;
base = (char *) base + nbytes;
size -= nbytes;
}
return 1;
}
const struct host_hooks host_hooks = HOST_HOOKS_INITIALIZER;