+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
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?) */
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[] =
{
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;
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)
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;
}
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. */
/* 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