This is the mail archive of the binutils@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]

Re: PATCH: PR ld/12289: Plugin's cleanup hook should be probably registered with xatexit()


On Sun, Dec 5, 2010 at 9:39 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> I checked in this patch as an obvious fix to call plugin_call_cleanup on
> fatal error.
>
>
> H.J.
> ---
> diff --git a/ld/ChangeLog b/ld/ChangeLog
> index 63858ee..55e320e 100644
> --- a/ld/ChangeLog
> +++ b/ld/ChangeLog
> @@ -1,5 +1,11 @@
> ?2010-12-05 ?H.J. Lu ?<hongjiu.lu@intel.com>
>
> + ? ? ? PR ld/12289
> + ? ? ? * plugin.c (message): Call plugin_call_cleanup on fatal
> + ? ? ? error.
> +
> +2010-12-05 ?H.J. Lu ?<hongjiu.lu@intel.com>
> +
> ? ? ? ?* plugin.c (message): Add a space after `:' in error message.

We should use xatexit.  I checked in this patch.


H.J.
---
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 55e320e..3d20061 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,13 @@
+2010-12-06  H.J. Lu  <hongjiu.lu@intel.com>
+	    Dmitry Gorbachev  <d.g.gorbachev@gmail.com>
+
+	PR ld/12289
+	* ldmain.c (main): Don't call plugin_call_cleanup.
+
+	* plugin.c (plugin_call_cleanup): Make it static.
+	(message): Don't call plugin_call_cleanup.
+	(plugin_load_plugins): Call xatexit with plugin_call_cleanup.
+
 2010-12-05  H.J. Lu  <hongjiu.lu@intel.com>

 	PR ld/12289
diff --git a/ld/ldmain.c b/ld/ldmain.c
index c5b7d88..5530dca 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -479,13 +479,6 @@ main (int argc, char **argv)

   lang_finish ();

-#ifdef ENABLE_PLUGINS
-  /* Now everything is finished, we can tell the plugins to clean up.  */
-  if (plugin_call_cleanup ())
-    info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
-	      plugin_error_plugin ());
-#endif /* ENABLE_PLUGINS */
-
   /* Even if we're producing relocatable output, some non-fatal errors should
      be reported in the exit status.  (What non-fatal errors, if any, do we
      want to ignore for relocatable output?)  */
diff --git a/ld/plugin.c b/ld/plugin.c
index 3d7809c..2950295 100644
--- a/ld/plugin.c
+++ b/ld/plugin.c
@@ -108,6 +108,9 @@ static bfd_boolean no_more_claiming = FALSE;
    TRUE is returned from the hook.  */
 static bfd_boolean plugin_cached_allow_multiple_defs = FALSE;

+/* Call 'cleanup' hook for all plugins at exit.  */
+static void plugin_call_cleanup (void);
+
 /* List of tags to set in the constant leading part of the tv array. */
 static const enum ld_plugin_tag tv_header_tags[] =
 {
@@ -590,9 +593,6 @@ message (int level, const char *format, ...)
 	  char *newfmt = ACONCAT ((level == LDPL_FATAL
 				   ? "%P%F: " : "%P%X: ",
 				   format, "\n", NULL));
-	  if (plugin_call_cleanup ())
-	    info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
-		      plugin_error_plugin ());
 	  vfinfo (stderr, newfmt, args, TRUE);
 	}
       break;
@@ -716,6 +716,8 @@ plugin_load_plugins (void)
   if (!curplug)
     return 0;

+  xatexit (plugin_call_cleanup);
+
   /* First pass over plugins to find max # args needed so that we
      can size and allocate the tv array.  */
   while (curplug)
@@ -812,8 +814,8 @@ plugin_call_all_symbols_read (void)
   return plugin_error_p () ? -1 : 0;
 }

-/* Call 'cleanup' hook for all plugins.  */
-int
+/* Call 'cleanup' hook for all plugins at exit.  */
+static void
 plugin_call_cleanup (void)
 {
   plugin_t *curplug = plugins_list;
@@ -832,7 +834,9 @@ plugin_call_cleanup (void)
 	}
       curplug = curplug->next;
     }
-  return plugin_error_p () ? -1 : 0;
+  if (plugin_error_p ())
+    info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"),
+	      plugin_error_plugin ());
 }

 /* Lazily init the non_ironly hash table.  */
diff --git a/ld/plugin.h b/ld/plugin.h
index e95c3ee..fc5f37f 100644
--- a/ld/plugin.h
+++ b/ld/plugin.h
@@ -50,9 +50,6 @@ extern int plugin_call_claim_file (const struct
ld_plugin_input_file *file,
 /* Call 'all symbols read' hook for all plugins.  */
 extern int plugin_call_all_symbols_read (void);

-/* Call 'cleanup' hook for all plugins.  */
-extern int plugin_call_cleanup (void);
-
 /* Generate a dummy BFD to represent an IR file, for any callers of
    plugin_call_claim_file to use as the handle in the ld_plugin_input_file
    struct that they build to pass in.  The BFD is initially writable, so


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