2011-06-27 Tristan Gingold <gingold@adacore.com>

* cache.c: Include bfd_stdint.h.
	(cache_bmmap): Change profile.  Return region start and size.
	* bfdio.c (struct bfd_iovec): Change bmmap profile.
	(bfd_mmap): Change profile and adjust.   Update comment.
	(memory_bmmap): Change profile.
	* opncls.c (opncls_bmmap): Change profile.
	* vms-lib.c (vms_lib_bmmap): Likewise.
	* libbfd.h: Regenerate.
	* bfd-in2.h: Regenerate.
This commit is contained in:
Tristan Gingold 2011-06-27 08:41:00 +00:00
parent 62a35308be
commit 4c95ab762c
7 changed files with 79 additions and 18 deletions

View file

@ -1,3 +1,15 @@
2011-06-27 Tristan Gingold <gingold@adacore.com>
* cache.c: Include bfd_stdint.h.
(cache_bmmap): Change profile. Return region start and size.
* bfdio.c (struct bfd_iovec): Change bmmap profile.
(bfd_mmap): Change profile and adjust. Update comment.
(memory_bmmap): Change profile.
* opncls.c (opncls_bmmap): Change profile.
* vms-lib.c (vms_lib_bmmap): Likewise.
* libbfd.h: Regenerate.
* bfd-in2.h: Regenerate.
2011-06-27 Tristan Gingold <gingold@adacore.com>
* vms-misc.c (vms_time_to_time_t): Adjust overflow detection.

View file

@ -1143,7 +1143,8 @@ long bfd_get_mtime (bfd *abfd);
file_ptr bfd_get_size (bfd *abfd);
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset);
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len);
/* Extracted from bfdwin.c. */
/* Extracted from section.c. */

View file

@ -158,9 +158,15 @@ DESCRIPTION
. int (*bclose) (struct bfd *abfd);
. int (*bflush) (struct bfd *abfd);
. int (*bstat) (struct bfd *abfd, struct stat *sb);
. {* Just like mmap: (void*)-1 on failure, mmapped address on success. *}
. {* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
. mmap parameter, except that LEN and OFFSET do not need to be page
. aligned. Returns (void *)-1 on failure, mmapped address on success.
. Also write in MAP_ADDR the address of the page aligned buffer and in
. MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
. MAP_LEN to unmap. *}
. void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
. int prot, int flags, file_ptr offset);
. int prot, int flags, file_ptr offset,
. void **map_addr, bfd_size_type *map_len);
.};
.extern const struct bfd_iovec _bfd_memory_iovec;
@ -423,23 +429,28 @@ FUNCTION
SYNOPSIS
void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset);
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len);
DESCRIPTION
Return mmap()ed region of the file, if possible and implemented.
LEN and OFFSET do not need to be page aligned. The page aligned
address and length are written to MAP_ADDR and MAP_LEN.
*/
void *
bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset)
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len)
{
void *ret = (void *)-1;
if (abfd->iovec == NULL)
return ret;
return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset);
return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset,
map_addr, map_len);
}
/* Memory file I/O operations. */
@ -586,7 +597,9 @@ memory_bstat (bfd *abfd, struct stat *statbuf)
static void *
memory_bmmap (bfd *abfd ATTRIBUTE_UNUSED, void *addr ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED, int prot ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED, file_ptr offset ATTRIBUTE_UNUSED)
int flags ATTRIBUTE_UNUSED, file_ptr offset ATTRIBUTE_UNUSED,
void **map_addr ATTRIBUTE_UNUSED,
bfd_size_type *map_len ATTRIBUTE_UNUSED)
{
return (void *)-1;
}

View file

@ -45,6 +45,7 @@ SUBSECTION
#include "bfd.h"
#include "libbfd.h"
#include "libiberty.h"
#include "bfd_stdint.h"
#ifdef HAVE_MMAP
#include <sys/mman.h>
@ -398,7 +399,9 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED,
int prot ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED,
file_ptr offset ATTRIBUTE_UNUSED)
file_ptr offset ATTRIBUTE_UNUSED,
void **map_addr ATTRIBUTE_UNUSED,
bfd_size_type *map_len ATTRIBUTE_UNUSED)
{
void *ret = (void *) -1;
@ -407,13 +410,35 @@ cache_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
#ifdef HAVE_MMAP
else
{
FILE *f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
static uintptr_t pagesize_m1;
FILE *f;
file_ptr pg_offset;
bfd_size_type pg_len;
f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
if (f == NULL)
return ret;
ret = mmap (addr, len, prot, flags, fileno (f), offset);
if (pagesize_m1 == 0)
pagesize_m1 = getpagesize () - 1;
/* Handle archive members. */
if (abfd->my_archive != NULL)
offset += abfd->origin;
/* Align. */
pg_offset = offset & ~pagesize_m1;
pg_len = (len + (offset - pg_offset) + pagesize_m1) & ~pagesize_m1;
ret = mmap (addr, pg_len, prot, flags, fileno (f), pg_offset);
if (ret == (void *) -1)
bfd_set_error (bfd_error_system_call);
else
{
*map_addr = ret;
*map_len = pg_len;
ret += offset & pagesize_m1;
}
}
#endif

View file

@ -850,9 +850,15 @@ struct bfd_iovec
int (*bclose) (struct bfd *abfd);
int (*bflush) (struct bfd *abfd);
int (*bstat) (struct bfd *abfd, struct stat *sb);
/* Just like mmap: (void*)-1 on failure, mmapped address on success. */
/* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
mmap parameter, except that LEN and OFFSET do not need to be page
aligned. Returns (void *)-1 on failure, mmapped address on success.
Also write in MAP_ADDR the address of the page aligned buffer and in
MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
MAP_LEN to unmap. */
void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
int prot, int flags, file_ptr offset);
int prot, int flags, file_ptr offset,
void **map_addr, bfd_size_type *map_len);
};
extern const struct bfd_iovec _bfd_memory_iovec;
/* Extracted from bfdwin.c. */

View file

@ -525,7 +525,9 @@ opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED,
int prot ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED,
file_ptr offset ATTRIBUTE_UNUSED)
file_ptr offset ATTRIBUTE_UNUSED,
void **map_addr ATTRIBUTE_UNUSED,
bfd_size_type *map_len ATTRIBUTE_UNUSED)
{
return (void *) -1;
}

View file

@ -1196,11 +1196,13 @@ vms_lib_bstat (struct bfd *abfd ATTRIBUTE_UNUSED,
static void *
vms_lib_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
void *addr ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED,
int prot ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED,
file_ptr offset ATTRIBUTE_UNUSED)
void *addr ATTRIBUTE_UNUSED,
bfd_size_type len ATTRIBUTE_UNUSED,
int prot ATTRIBUTE_UNUSED,
int flags ATTRIBUTE_UNUSED,
file_ptr offset ATTRIBUTE_UNUSED,
void **map_addr ATTRIBUTE_UNUSED,
bfd_size_type *map_len ATTRIBUTE_UNUSED)
{
return (void *) -1;
}