Call xatexit with plugin_call_cleanup.
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 6 Dec 2010 12:44:51 +0000 (12:44 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 6 Dec 2010 12:44:51 +0000 (12:44 +0000)
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.

ld/ChangeLog
ld/ldmain.c
ld/plugin.c
ld/plugin.h

index 55e320e98f39e7245372a4b508a997b339a37b41..3d200613bffcee843edb480cdd8a39e3d48d3359 100644 (file)
@@ -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
index c5b7d889ff8a619be0c31a7fc5c9a963eec7392e..5530dcaed1f05a844df4974a91fc8b12353539a1 100644 (file)
@@ -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?)  */
index 3d7809c2c40336db90530c2dad7bc20b806de196..2950295b243076def99f1bf9739171428b17ea8b 100644 (file)
@@ -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.  */
index e95c3eecf46ada73d17890af096cc775e7b4eb66..fc5f37f2dabd355f0c867bc58ba35015992042f3 100644 (file)
@@ -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