This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Update plugin_maybe_claim


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=35a1e5f3055fc28f129e4d5d0a993218d8af1baf

commit 35a1e5f3055fc28f129e4d5d0a993218d8af1baf
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sat Feb 7 11:01:22 2015 -0800

    Update plugin_maybe_claim
    
    This patch removes the argument of pointer to struct ld_plugin_input_file.
    This is the first step to extract a plugin_object_p out of
    plugin_maybe_claim for BFD.
    
    	* plugin.c: Include "libbfd.h".
    	(plugin_strdup): New.
    	(plugin_maybe_claim): Remove the argument of pointer to struct
    	ld_plugin_input_file.  Open and handle input entry.
    	* plugin.h (plugin_maybe_claim): Updated.
    	* ldfile.c (ldfile_try_open_bfd): Call plugin_maybe_claim directly
    	without passing a pointer to struct ld_plugin_input_file.
    	* ldmain.c: Don't include "libbfd.h".
    	(add_archive_element): Call plugin_maybe_claim directly without
    	passing a pointer to struct ld_plugin_input_file.

Diff:
---
 ld/ChangeLog | 13 ++++++++++
 ld/ldfile.c  | 14 +---------
 ld/ldmain.c  | 25 +++---------------
 ld/plugin.c  | 85 +++++++++++++++++++++++++++++++++++++++++++++---------------
 ld/plugin.h  |  3 +--
 5 files changed, 83 insertions(+), 57 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 52c3ba0..d7125ff 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,16 @@
+2015-02-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* plugin.c: Include "libbfd.h".
+	(plugin_strdup): New.
+	(plugin_maybe_claim): Remove the argument of pointer to struct
+	ld_plugin_input_file.  Open and handle input entry.
+	* plugin.h (plugin_maybe_claim): Updated.
+	* ldfile.c (ldfile_try_open_bfd): Call plugin_maybe_claim directly
+	without passing a pointer to struct ld_plugin_input_file.
+	* ldmain.c: Don't include "libbfd.h".
+	(add_archive_element): Call plugin_maybe_claim directly without
+	passing a pointer to struct ld_plugin_input_file.
+
 2015-02-06  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* ld.texinfo: Document -z text, -z notext and -z textoff.
diff --git a/ld/ldfile.c b/ld/ldfile.c
index c9c9541..05889f2 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -304,19 +304,7 @@ success:
   if (bfd_check_format (entry->the_bfd, bfd_object)
       && link_info.lto_plugin_active
       && !no_more_claiming)
-    {
-      int fd = open (attempt, O_RDONLY | O_BINARY);
-      if (fd >= 0)
-	{
-	  struct ld_plugin_input_file file;
-
-	  file.name = attempt;
-	  file.offset = 0;
-	  file.filesize = lseek (fd, 0, SEEK_END);
-	  file.fd = fd;
-	  plugin_maybe_claim (&file, entry);
-	}
-    }
+    plugin_maybe_claim (entry);
 #endif /* ENABLE_PLUGINS */
 
   /* It opened OK, the format checked out, and the plugins have had
diff --git a/ld/ldmain.c b/ld/ldmain.c
index 86f02a6..4b41288 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -41,7 +41,6 @@
 #ifdef ENABLE_PLUGINS
 #include "plugin.h"
 #include "plugin-api.h"
-#include "libbfd.h"
 #endif /* ENABLE_PLUGINS */
 
 /* Somewhere above, sys/stat.h got included.  */
@@ -793,27 +792,11 @@ add_archive_element (struct bfd_link_info *info,
   if (link_info.lto_plugin_active && !no_more_claiming)
     {
       /* We must offer this archive member to the plugins to claim.  */
-      const char *filename = (bfd_my_archive (abfd) != NULL
-			      ? bfd_my_archive (abfd)->filename : abfd->filename);
-      int fd = open (filename, O_RDONLY | O_BINARY);
-      if (fd >= 0)
+      plugin_maybe_claim (input);
+      if (input->flags.claimed)
 	{
-	  struct ld_plugin_input_file file;
-
-	  /* Offset and filesize must refer to the individual archive
-	     member, not the whole file, and must exclude the header.
-	     Fortunately for us, that is how the data is stored in the
-	     origin field of the bfd and in the arelt_data.  */
-	  file.name = filename;
-	  file.offset = abfd->origin;
-	  file.filesize = arelt_size (abfd);
-	  file.fd = fd;
-	  plugin_maybe_claim (&file, input);
-	  if (input->flags.claimed)
-	    {
-	      input->flags.claim_archive = TRUE;
-	      *subsbfd = input->the_bfd;
-	    }
+	  input->flags.claim_archive = TRUE;
+	  *subsbfd = input->the_bfd;
 	}
     }
 #endif /* ENABLE_PLUGINS */
diff --git a/ld/plugin.c b/ld/plugin.c
index 7ee45a2..30e4ab4 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -21,6 +21,7 @@
 #include "sysdep.h"
 #include "libiberty.h"
 #include "bfd.h"
+#include "libbfd.h"
 #include "bfdlink.h"
 #include "bfdver.h"
 #include "ld.h"
@@ -980,41 +981,83 @@ plugin_call_claim_file (const struct ld_plugin_input_file *file, int *claimed)
   return plugin_error_p () ? -1 : 0;
 }
 
+/* Duplicates a character string with memory attached to ABFD.  */
+
+static char *
+plugin_strdup (bfd *abfd, const char *str)
+{
+  size_t strlength;
+  char *copy;
+  strlength = strlen (str) + 1;
+  copy = bfd_alloc (abfd, strlength);
+  if (copy == NULL)
+    einfo (_("%P%F: plugin_strdup failed to allocate memory: %s\n"),
+	   bfd_get_error ());
+  memcpy (copy, str, strlength);
+  return copy;
+}
+
 void
-plugin_maybe_claim (struct ld_plugin_input_file *file,
-		    lang_input_statement_type *entry)
+plugin_maybe_claim (lang_input_statement_type *entry)
 {
   int claimed = 0;
   plugin_input_file_t *input;
-  size_t namelength;
+  off_t offset, filesize;
+  struct ld_plugin_input_file file;
+  bfd *abfd;
+  bfd *ibfd = entry->the_bfd;
+  bfd_boolean inarchive = bfd_my_archive (ibfd) != NULL;
+  const char *name
+    = inarchive ? bfd_my_archive (ibfd)->filename : ibfd->filename;
+  int fd = open (name, O_RDONLY | O_BINARY);
+
+  if (fd < 0)
+    return;
 
   /* We create a dummy BFD, initially empty, to house whatever symbols
      the plugin may want to add.  */
-  bfd *abfd = plugin_get_ir_dummy_bfd (entry->the_bfd->filename,
-				       entry->the_bfd);
+  abfd = plugin_get_ir_dummy_bfd (ibfd->filename, ibfd);
 
   input = bfd_alloc (abfd, sizeof (*input));
   if (input == NULL)
     einfo (_("%P%F: plugin failed to allocate memory for input: %s\n"),
 	   bfd_get_error ());
 
+  if (inarchive)
+    {
+      /* Offset and filesize must refer to the individual archive
+	 member, not the whole file, and must exclude the header.
+	 Fortunately for us, that is how the data is stored in the
+	 origin field of the bfd and in the arelt_data.  */
+      offset = ibfd->origin;
+      filesize = arelt_size (ibfd);
+    }
+  else
+    {
+      offset = 0;
+      filesize = lseek (fd, 0, SEEK_END);
+
+      /* We must copy filename attached to ibfd if it is not an archive
+	 member since it may be freed by bfd_close below.  */
+      name = plugin_strdup (abfd, name);
+    }
+
+  file.name = name;
+  file.offset = offset;
+  file.filesize = filesize;
+  file.fd = fd;
+  file.handle = input;
+
   input->abfd = abfd;
   input->view_buffer.addr = NULL;
   input->view_buffer.filesize = 0;
   input->view_buffer.offset = 0;
-  input->fd = file->fd;
-  input->offset  = file->offset;
-  input->filesize = file->filesize;
-  namelength = strlen (entry->the_bfd->filename) + 1;
-  input->name = bfd_alloc (abfd, namelength);
-  if (input->name == NULL)
-    einfo (_("%P%F: plugin failed to allocate memory for input filename: %s\n"),
-	   bfd_get_error ());
-  memcpy (input->name, entry->the_bfd->filename, namelength);
-
-  file->handle = input;
+  input->fd = fd;
+  input->offset = offset;
+  input->filesize = filesize;
+  input->name = plugin_strdup (abfd, ibfd->filename);
 
-  if (plugin_call_claim_file (file, &claimed))
+  if (plugin_call_claim_file (&file, &claimed))
     einfo (_("%P%F: %s: plugin reported error claiming file\n"),
 	   plugin_error_plugin ());
 
@@ -1028,7 +1071,7 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
 	 calls release_input_file after it is done, is stored in
 	 non-bfd_object file.  This scheme doesn't work when a plugin
 	 needs fd and its IR is stored in bfd_object file.  */
-      close (file->fd);
+      close (fd);
       input->fd = -1;
     }
 
@@ -1038,11 +1081,11 @@ plugin_maybe_claim (struct ld_plugin_input_file *file,
 
       /* BFD archive handling caches elements so we can't call
 	 bfd_close for archives.  */
-      if (entry->the_bfd->my_archive == NULL)
-	bfd_close (entry->the_bfd);
+      if (!inarchive)
+	bfd_close (ibfd);
+      bfd_make_readable (abfd);
       entry->the_bfd = abfd;
       entry->flags.claimed = TRUE;
-      bfd_make_readable (entry->the_bfd);
     }
   else
     {
diff --git a/ld/plugin.h b/ld/plugin.h
index 15532cd..59c0df7 100644
--- a/ld/plugin.h
+++ b/ld/plugin.h
@@ -46,8 +46,7 @@ extern void plugin_load_plugins (void);
 extern const char *plugin_error_plugin (void);
 
 /* Call 'claim file' hook for all plugins.  */
-extern void plugin_maybe_claim (struct ld_plugin_input_file *,
-				lang_input_statement_type *);
+extern void plugin_maybe_claim (lang_input_statement_type *);
 
 /* Call 'all symbols read' hook for all plugins.  */
 extern int plugin_call_all_symbols_read (void);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]