Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Paul Pluzhnikov <ppluzhnikov@google.com>
To: Dave Korn <dave.korn.cygwin@googlemail.com>
Cc: binutils@sourceware.org, Tom Tromey <tromey@redhat.com>,
	        gdb-patches ml <gdb-patches@sourceware.org>
Subject: Re: How to get file descriptor from abfd?
Date: Tue, 02 Jun 2009 05:55:00 -0000	[thread overview]
Message-ID: <8ac60eac0906012254o57756790y9bb4eb23d1d6e5a1@mail.gmail.com> (raw)
In-Reply-To: <4A22CB56.3070704@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 726 bytes --]

On Sun, May 31, 2009 at 11:24 AM, Dave Korn
<dave.korn.cygwin@googlemail.com> wrote:

> The cleanest design would be to add an mmap member function to bfd_iovec.

Thanks.

Would attached patch be acceptable?

Tested by building with and without HAVE_MMAP on Linux/x86_64, and by
building GDB against this and running its tests.


-- 
Paul Pluzhnikov

2009-06-01  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.

[-- Attachment #2: bfd-mmap-patch-20090601.txt --]
[-- Type: text/plain, Size: 4912 bytes --]

Index: bfd-in2.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in2.h,v
retrieving revision 1.482
diff -u -p -u -r1.482 bfd-in2.h
--- bfd-in2.h	1 Jun 2009 13:11:51 -0000	1.482
+++ bfd-in2.h	2 Jun 2009 05:30:15 -0000
@@ -463,6 +463,7 @@ extern int bfd_seek (bfd *, file_ptr, in
 extern file_ptr bfd_tell (bfd *);
 extern int bfd_flush (bfd *);
 extern int bfd_stat (bfd *, struct stat *);
+extern void *bfd_mmap (bfd *, void *, bfd_size_type, int, int, file_ptr);
 
 /* Deprecated old routines.  */
 #if __GNUC__
Index: bfdio.c
===================================================================
RCS file: /cvs/src/src/bfd/bfdio.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 bfdio.c
--- bfdio.c	24 May 2009 11:47:27 -0000	1.21
+++ bfdio.c	2 Jun 2009 05:30:15 -0000
@@ -158,6 +158,8 @@ DESCRIPTION
 .  int (*bclose) (struct bfd *abfd);
 .  int (*bflush) (struct bfd *abfd);
 .  int (*bstat) (struct bfd *abfd, struct stat *sb);
+.  void (*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
+.                 int prot, int flags, file_ptr offset);
 .};
 
 */
@@ -511,3 +513,31 @@ bfd_get_size (bfd *abfd)
 
   return buf.st_size;
 }
+
+
+/*
+FUNCTION
+	bfd_mmap
+
+SYNOPSIS
+	void *bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
+	                int prot, int flags, file_ptr offset);
+
+DESCRIPTION
+	Return mmap()ed region of the file, if possible and implemented.
+
+*/
+
+void *
+bfd_mmap (bfd *abfd, void *addr, bfd_size_type len,
+	  int prot, int flags, file_ptr offset)
+{
+  void *ret = (void *)-1;
+  if ((abfd->flags & BFD_IN_MEMORY) != 0)
+    return ret;
+
+  if (abfd->iovec == NULL)
+    return ret;
+
+  return abfd->iovec->bmmap (abfd, addr, len, prot, flags, offset);
+}
Index: cache.c
===================================================================
RCS file: /cvs/src/src/bfd/cache.c,v
retrieving revision 1.34
diff -u -p -u -r1.34 cache.c
--- cache.c	30 Oct 2008 09:05:32 -0000	1.34
+++ cache.c	2 Jun 2009 05:30:15 -0000
@@ -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 st
   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
 };
 
 /*
Index: libbfd.h
===================================================================
RCS file: /cvs/src/src/bfd/libbfd.h,v
retrieving revision 1.216
diff -u -p -u -r1.216 libbfd.h
--- libbfd.h	1 Jun 2009 13:11:52 -0000	1.216
+++ libbfd.h	2 Jun 2009 05:30:15 -0000
@@ -773,6 +773,9 @@ 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.  */
+  void *(*bmmap) (struct bfd *abfd, void *addr, bfd_size_type len,
+                  int prot, int flags, file_ptr offset);
 };
 /* Extracted from bfdwin.c.  */
 struct _bfd_window_internal {
Index: opncls.c
===================================================================
RCS file: /cvs/src/src/bfd/opncls.c,v
retrieving revision 1.53
diff -u -p -u -r1.53 opncls.c
--- opncls.c	23 Aug 2008 08:08:58 -0000	1.53
+++ opncls.c	2 Jun 2009 05:30:15 -0000
@@ -505,9 +505,20 @@ opncls_bstat (struct bfd *abfd, struct s
   return (vec->stat) (abfd, vec->stream, sb);
 }
 
+static void *
+opncls_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)
+{
+  return (void *)-1;
+}
+
 static const struct bfd_iovec opncls_iovec = {
   &opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
-  &opncls_bclose, &opncls_bflush, &opncls_bstat
+  &opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
 };
 
 bfd *

  reply	other threads:[~2009-06-02  5:55 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-31 17:56 Paul Pluzhnikov
2009-05-31 18:12 ` Dave Korn
2009-06-02  5:55   ` Paul Pluzhnikov [this message]
2009-06-08 16:10     ` Paul Pluzhnikov
2009-06-10 15:14       ` Dave Korn
2009-06-10 17:09         ` Paul Pluzhnikov
2009-06-10 23:59           ` Alan Modra
2009-06-11  0:42             ` Paul Pluzhnikov
2009-06-11  2:14           ` Dave Korn
2009-06-11  3:28           ` Dave Korn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8ac60eac0906012254o57756790y9bb4eb23d1d6e5a1@mail.gmail.com \
    --to=ppluzhnikov@google.com \
    --cc=binutils@sourceware.org \
    --cc=dave.korn.cygwin@googlemail.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox