diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-11-23 08:39:23 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-11-23 08:39:23 -0800 |
commit | e2aadbf57d051f83f131b692d3fe1a95e5d532f2 (patch) | |
tree | 96f06fe28ccc39c8909758fc44d0f47e50a98c5b | |
parent | 04561d5e82286884d0ae9a9c9d7bd8153027a301 (diff) | |
download | binutils-hjl/lto/error.tar.gz |
Improve plugin error handlinghjl/lto/error
This patch improves plugin error handling:
1. Use dlerror to report error whenerve possible.
2. Report plugin error code on error.
3. Only issue cleanup error during cleanup.
-rw-r--r-- | ld/ChangeLog.error | 16 | ||||
-rw-r--r-- | ld/ldmain.c | 3 | ||||
-rw-r--r-- | ld/lexsup.c | 4 | ||||
-rw-r--r-- | ld/plugin.c | 37 | ||||
-rw-r--r-- | ld/plugin.h | 6 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog.error | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/plugin-2.d | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-plugin/plugin-4.d | 2 |
8 files changed, 51 insertions, 23 deletions
diff --git a/ld/ChangeLog.error b/ld/ChangeLog.error new file mode 100644 index 000000000..dce90ef29 --- /dev/null +++ b/ld/ChangeLog.error @@ -0,0 +1,16 @@ +2012-11-22 H.J. Lu <hongjiu.lu@intel.com> + + * ldmain.c (main): Don't check plugin_load_plugins return. + + * lexsup.c (parse_args): Don't check plugin_opt_plugin return. + + * plugin.c (dl_error): New. + (plugin_opt_plugin): Change return type to void. Stop on + dlopen error and report error with dl_error (). + (plugin_load_plugins): Change return type to void. Stop on + dlsym error and report error with dl_error (). Don't use + set_plugin_error. + (plugin_call_cleanup): Issue an error for each plugin. + + * plugin.h (plugin_opt_plugin): Change return type to void. + (plugin_load_plugins): Likewise. diff --git a/ld/ldmain.c b/ld/ldmain.c index 07f5f0923..c23c55444 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -308,8 +308,7 @@ main (int argc, char **argv) #ifdef ENABLE_PLUGINS /* Now all the plugin arguments have been gathered, we can load them. */ - if (plugin_load_plugins ()) - einfo (_("%P%F: %s: error loading plugin\n"), plugin_error_plugin ()); + plugin_load_plugins (); #endif /* ENABLE_PLUGINS */ ldemul_set_symbols (); diff --git a/ld/lexsup.c b/ld/lexsup.c index c6baebe88..be8a8974b 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -954,9 +954,7 @@ parse_args (unsigned argc, char **argv) break; #ifdef ENABLE_PLUGINS case OPTION_PLUGIN: - if (plugin_opt_plugin (optarg)) - einfo (_("%P%F: %s: error loading plugin\n"), - plugin_error_plugin ()); + plugin_opt_plugin (optarg); break; case OPTION_PLUGIN_OPT: if (plugin_opt_plugin_arg (optarg)) diff --git a/ld/plugin.c b/ld/plugin.c index 8902ef4ea..a11ccdee3 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -155,6 +155,20 @@ dlclose (void *handle) #endif /* !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H) */ +#ifdef HAVE_DLFCN_H +static const char * +dl_error (const char *plugin ATTRIBUTE_UNUSED) +{ + return dlerror (); +} +#else +static const char * +dl_error (const * char plugin) +{ + return plugin; +} +#endif + /* Helper function for exiting with error status. */ static int set_plugin_error (const char *plugin) @@ -178,7 +192,7 @@ plugin_error_plugin (void) } /* Handle -plugin arg: find and load plugin, or return error. */ -int +void plugin_opt_plugin (const char *plugin) { plugin_t *newplug; @@ -188,7 +202,7 @@ plugin_opt_plugin (const char *plugin) newplug->name = plugin; newplug->dlhandle = dlopen (plugin, RTLD_NOW); if (!newplug->dlhandle) - return set_plugin_error (plugin); + einfo (_("%P%F: error loading plugin: %s\n"), dl_error (plugin)); /* Chain on end, so when we run list it is in command-line order. */ *plugins_tail_chain_ptr = newplug; @@ -197,7 +211,6 @@ plugin_opt_plugin (const char *plugin) /* Record it as current plugin for receiving args. */ last_plugin = newplug; last_plugin_args_tail_chain_ptr = &newplug->args; - return 0; } /* Accumulate option arguments for last-loaded plugin, or return @@ -771,7 +784,7 @@ plugin_active_plugins_p (void) } /* Load up and initialise all plugins after argument parsing. */ -int +void plugin_load_plugins (void) { struct ld_plugin_tv *my_tv; @@ -780,7 +793,7 @@ plugin_load_plugins (void) /* If there are no plugins, we need do nothing this run. */ if (!curplug) - return 0; + return; /* First pass over plugins to find max # args needed so that we can size and allocate the tv array. */ @@ -806,13 +819,15 @@ plugin_load_plugins (void) if (!onloadfn) onloadfn = (ld_plugin_onload) dlsym (curplug->dlhandle, "_onload"); if (!onloadfn) - return set_plugin_error (curplug->name); + einfo (_("%P%F: error loading plugin: %s\n"), + dl_error (curplug->name)); set_tv_plugin_args (curplug, &my_tv[tv_header_size]); called_plugin = curplug; rv = (*onloadfn) (my_tv); called_plugin = NULL; if (rv != LDPS_OK) - return set_plugin_error (curplug->name); + einfo (_("%P%F: %s: error loading plugin: %d\n"), + curplug->name, rv); curplug = curplug->next; } @@ -825,8 +840,6 @@ plugin_load_plugins (void) plugin_callbacks.notice = &plugin_notice; link_info.notice_all = TRUE; link_info.callbacks = &plugin_callbacks; - - return 0; } /* Call 'claim file' hook for all plugins. */ @@ -929,14 +942,12 @@ plugin_call_cleanup (void) rv = (*curplug->cleanup_handler) (); called_plugin = NULL; if (rv != LDPS_OK) - set_plugin_error (curplug->name); + info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), + curplug->name, rv); dlclose (curplug->dlhandle); } curplug = curplug->next; } - if (plugin_error_p ()) - info_msg (_("%P: %s: error in plugin cleanup (ignored)\n"), - plugin_error_plugin ()); } /* To determine which symbols should be resolved LDPR_PREVAILING_DEF diff --git a/ld/plugin.h b/ld/plugin.h index dc32295b0..a227575f7 100644 --- a/ld/plugin.h +++ b/ld/plugin.h @@ -32,8 +32,8 @@ extern bfd_boolean no_more_claiming; to include the plugin-api.h header in order to use this file. */ struct ld_plugin_input_file; -/* Handle -plugin arg: find and load plugin, or return error. */ -extern int plugin_opt_plugin (const char *plugin); +/* Handle -plugin arg: find and load plugin. */ +extern void plugin_opt_plugin (const char *plugin); /* Accumulate option arguments for last-loaded plugin, or return error if none. */ @@ -44,7 +44,7 @@ extern int plugin_opt_plugin_arg (const char *arg); extern bfd_boolean plugin_active_plugins_p (void); /* Load up and initialise all plugins after argument parsing. */ -extern int plugin_load_plugins (void); +extern void plugin_load_plugins (void); /* Return name of plugin which caused an error in any of the above. */ extern const char *plugin_error_plugin (void); diff --git a/ld/testsuite/ChangeLog.error b/ld/testsuite/ChangeLog.error new file mode 100644 index 000000000..67a0b096c --- /dev/null +++ b/ld/testsuite/ChangeLog.error @@ -0,0 +1,4 @@ +2012-11-22 H.J. Lu <hongjiu.lu@intel.com> + + * ld-plugin/plugin-2.d: Update expected error message. + * ld-plugin/plugin-4.d: Likewise. diff --git a/ld/testsuite/ld-plugin/plugin-2.d b/ld/testsuite/ld-plugin/plugin-2.d index 0ce111f10..983f1cf9d 100644 --- a/ld/testsuite/ld-plugin/plugin-2.d +++ b/ld/testsuite/ld-plugin/plugin-2.d @@ -18,5 +18,5 @@ Hello from testplugin. .*: LDPT_OPTION 'failonload' .*: LDPT_NULL value 0x0 \(0\) #... -.*ld.*:.*ldtestplug.*: error loading plugin +.*ld.*:.*ldtestplug.*: error loading plugin: 3 #... diff --git a/ld/testsuite/ld-plugin/plugin-4.d b/ld/testsuite/ld-plugin/plugin-4.d index e17565e54..9f25fc682 100644 --- a/ld/testsuite/ld-plugin/plugin-4.d +++ b/ld/testsuite/ld-plugin/plugin-4.d @@ -20,5 +20,5 @@ Hello from testplugin. .*: LDPT_NULL value 0x0 \(0\) #... hook called: cleanup. -.*ld.*:.*ldtestplug.*: error in plugin cleanup \(ignored\) +.*ld.*:.*ldtestplug.*: error in plugin cleanup: 3 \(ignored\) #... |