]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: Add -plugin-save-temps
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 26 Oct 2020 11:36:59 +0000 (04:36 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 16 Feb 2024 13:03:06 +0000 (05:03 -0800)
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.

ld/NEWS
ld/ld.h
ld/ld.texi
ld/ldlex.h
ld/lexsup.c
ld/plugin.c

diff --git a/ld/NEWS b/ld/NEWS
index a5a5b9faee21ec981cc01b33330cbcd401646a11..f70d21573399b4a914cc6070f209ce71907ed70e 100644 (file)
--- 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 54d9079678cadddfd82921e50b1aea4994d1b46a..fcdd9a2c083b3f5819df8ecc9e35523be16b3e4d 100644 (file)
--- 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;
 
index 4fda259a552f15216adcc1390a8ab0c2025d2ac5..3cba778c9fbca1e92edd502d023639cbd7759f7a 100644 (file)
@@ -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
index e5ac2fa7fcaffd3e69f41f2859999c5165c70b0e..d575562a357f410c222f7bb58407d9ac95aa21d4 100644 (file)
@@ -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,
index 099dff8ecde20fb8facad4eb144095718c6276ea..dad3b6059edfe1fe31f46c454fdc90d55b0aed5b 100644 (file)
@@ -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;
index f81ab02b3a63cdf85258707f51eceddd19813daf..13d29d6b09ffa9a6fd6c736f69ef2a426e8247c6 100644 (file)
@@ -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;