aboutsummaryrefslogtreecommitdiff
path: root/bfd/cache.c
diff options
context:
space:
mode:
authorPaul Pluzhnikov <ppluzhnikov@google.com>2009-06-11 00:41:03 +0000
committerPaul Pluzhnikov <ppluzhnikov@google.com>2009-06-11 00:41:03 +0000
commit25b88f335af1b8c7a4428710ffd9066338b167c0 (patch)
treefd707bda1bcc8d4d609622b5da49451b5c2e3303 /bfd/cache.c
parente433f867b0ffb2181886a9c2b3281ad5931ef31b (diff)
downloadgdb-25b88f335af1b8c7a4428710ffd9066338b167c0.zip
gdb-25b88f335af1b8c7a4428710ffd9066338b167c0.tar.gz
gdb-25b88f335af1b8c7a4428710ffd9066338b167c0.tar.bz2
2009-06-10 Paul Pluzhnikov <ppluzhnikov@google.com>
* bfd-in2.h: bfd_mmap prototype * bfdio.c (bfd_mmap): New function. * libbfd.h (bfd_iovec): Add bmmap. * cache.c (cache_bmap): New function. (cache_iovec): Initialize bmmap member. * opencls.c (opncls_bmmap): New function. (opncls_iovec): Initialize bmmap member.
Diffstat (limited to 'bfd/cache.c')
-rw-r--r--bfd/cache.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/bfd/cache.c b/bfd/cache.c
index 50674e8..c6873a9 100644
--- a/bfd/cache.c
+++ b/bfd/cache.c
@@ -46,6 +46,10 @@ SUBSECTION
#include "libbfd.h"
#include "libiberty.h"
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+#endif
+
/* In some cases we can optimize cache operation when reopening files.
For instance, a flush is entirely unnecessary if the file is already
closed, so a flush would use CACHE_NO_OPEN. Similarly, a seek using
@@ -388,10 +392,38 @@ cache_bstat (struct bfd *abfd, struct stat *sb)
return sts;
}
+static void *
+cache_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 *ret = (void *) -1;
+
+ if ((abfd->flags & BFD_IN_MEMORY) != 0)
+ abort ();
+#ifdef HAVE_MMAP
+ else
+ {
+ FILE *f = bfd_cache_lookup (abfd, CACHE_NO_SEEK_ERROR);
+ if (f == NULL)
+ return ret;
+
+ ret = mmap (addr, len, prot, flags, fileno (f), offset);
+ if (ret == (void *) -1)
+ bfd_set_error (bfd_error_system_call);
+ }
+#endif
+
+ return ret;
+}
+
static const struct bfd_iovec cache_iovec =
{
&cache_bread, &cache_bwrite, &cache_btell, &cache_bseek,
- &cache_bclose, &cache_bflush, &cache_bstat
+ &cache_bclose, &cache_bflush, &cache_bstat, &cache_bmmap
};
/*