From: H.J. Lu Date: Mon, 26 Oct 2020 11:36:59 +0000 (-0700) Subject: ld: Add -plugin-save-temps X-Git-Tag: gdb-15-branchpoint~953 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d9511b64b85296f39ded68f82f7f25ee7d6b25fb;p=thirdparty%2Fbinutils-gdb.git ld: Add -plugin-save-temps Add -plugin-save-temps to store plugin intermediate files permanently. It can be used to exam the final input object files generated from IR inputs. * NEWS: Mention -plugin-save-temps. * ld.h (ld_config_type): Add plugin_save_temps. * ld.texi: Document -plugin-save-temps. * ldlex.h (option_values): Add OPTION_PLUGIN_SAVE_TEMPS. * lexsup.c (ld_options): Add -plugin-save-temps. (parse_args): Handle OPTION_PLUGIN_SAVE_TEMPS. * plugin.c (plugin_call_cleanup): Don't call plugin cleanup_handler for -plugin-save-temps. --- diff --git a/ld/NEWS b/ld/NEWS index a5a5b9faee2..f70d2157339 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* Add -plugin-save-temps to store plugin intermediate files permanently. + Changes in 2.42: * Add -z mark-plt/-z nomark-plt options to x86-64 ELF linker to mark PLT diff --git a/ld/ld.h b/ld/ld.h index 54d9079678c..fcdd9a2c083 100644 --- a/ld/ld.h +++ b/ld/ld.h @@ -300,6 +300,9 @@ typedef struct /* The size of the hash table to use. */ unsigned long hash_table_size; + /* If set, store plugin intermediate files permanently. */ + bool plugin_save_temps; + /* If set, print discarded sections in map file output. */ bool print_map_discarded; diff --git a/ld/ld.texi b/ld/ld.texi index 4fda259a552..3cba778c9fb 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -1140,6 +1140,10 @@ Omit debugger symbol information (but not all symbols) from the output file. Omit (or do not omit) global symbols defined in discarded sections. Enabled by default. +@kindex -plugin-save-temps +@item -plugin-save-temps +Store the plugin ``temporary'' intermediate files permanently. + @kindex -t @kindex --trace @cindex input files, displaying diff --git a/ld/ldlex.h b/ld/ldlex.h index e5ac2fa7fca..d575562a357 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -146,6 +146,7 @@ enum option_values #if BFD_SUPPORTS_PLUGINS OPTION_PLUGIN, OPTION_PLUGIN_OPT, + OPTION_PLUGIN_SAVE_TEMPS, #endif /* BFD_SUPPORTS_PLUGINS */ OPTION_DEFAULT_SCRIPT, OPTION_PRINT_OUTPUT_FORMAT, diff --git a/ld/lexsup.c b/ld/lexsup.c index 099dff8ecde..dad3b6059ed 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -187,6 +187,9 @@ static const struct ld_option ld_options[] = '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH }, { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT}, '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH }, + { {"plugin-save-temps", no_argument, NULL, OPTION_PLUGIN_SAVE_TEMPS}, + '\0', NULL, N_("Store plugin intermediate files permanently"), + ONE_DASH }, { {"flto", optional_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for GCC LTO option compatibility"), ONE_DASH }, @@ -1211,6 +1214,9 @@ parse_args (unsigned argc, char **argv) if (plugin_opt_plugin_arg (optarg)) einfo (_("%F%P: bad -plugin-opt option\n")); break; + case OPTION_PLUGIN_SAVE_TEMPS: + config.plugin_save_temps = true; + break; #endif /* BFD_SUPPORTS_PLUGINS */ case 'q': link_info.emitrelocations = true; diff --git a/ld/plugin.c b/ld/plugin.c index f81ab02b3a6..13d29d6b09f 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -1367,14 +1367,17 @@ plugin_call_cleanup (void) { if (curplug->cleanup_handler && !curplug->cleanup_done) { - enum ld_plugin_status rv; - curplug->cleanup_done = true; - called_plugin = curplug; - rv = (*curplug->cleanup_handler) (); - called_plugin = NULL; - if (rv != LDPS_OK) - info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), - curplug->name, rv); + if (!config.plugin_save_temps) + { + enum ld_plugin_status rv; + curplug->cleanup_done = true; + called_plugin = curplug; + rv = (*curplug->cleanup_handler) (); + called_plugin = NULL; + if (rv != LDPS_OK) + info_msg (_("%P: %s: error in plugin cleanup: %d (ignored)\n"), + curplug->name, rv); + } dlclose (curplug->dlhandle); } curplug = curplug->next;