https://gcc.gnu.org/g:ed1233115c9c60b0174fa99913ba6bd61e81edd7

commit r15-6904-ged1233115c9c60b0174fa99913ba6bd61e81edd7
Author: Michal Jires <mji...@suse.cz>
Date:   Mon Jan 13 04:08:03 2025 +0100

    lto: Remove link() to fix build with MinGW [PR118238]
    
    I used link() to create cheap copies of Incremental LTO cache contents
    to prevent their deletion once linking is finished.
    This is unnecessary, since output_files are deleted in our lto-plugin
    and not in the linker itself.
    
    Bootstrapped/regtested on x86_64-linux.
    lto-wrapper now again builds on MinGW. Though so far I have not setup
    MinGW to be able to do full bootstrap.
    Ok for trunk?
    
            PR lto/118238
    
    gcc/ChangeLog:
    
            * lto-wrapper.cc (run_gcc): Remove link() copying.
    
    lto-plugin/ChangeLog:
    
            * lto-plugin.c (cleanup_handler):
            Keep output_files when using Incremental LTO.
            (onload): Detect Incremental LTO.

Diff:
---
 gcc/lto-wrapper.cc      | 34 +++++-----------------------------
 lto-plugin/lto-plugin.c |  9 +++++++--
 2 files changed, 12 insertions(+), 31 deletions(-)

diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc
index f9b2511c38ec..a980b208783a 100644
--- a/gcc/lto-wrapper.cc
+++ b/gcc/lto-wrapper.cc
@@ -1571,6 +1571,8 @@ run_gcc (unsigned argc, char *argv[])
          /* Exists.  */
          if (access (option->arg, W_OK) == 0)
            ltrans_cache_dir = option->arg;
+         else
+           fatal_error (input_location, "missing directory: %s", option->arg);
          break;
 
        case OPT_flto_incremental_cache_size_:
@@ -2218,39 +2220,13 @@ cont:
        {
          for (i = 0; i < nr; ++i)
            {
-             char *input_name = input_names[i];
-             char const *output_name = output_names[i];
-
              ltrans_file_cache::item* item;
-             item = ltrans_cache.get_item (input_name);
+             item = ltrans_cache.get_item (input_names[i]);
 
-             if (item && !save_temps)
+             if (item)
                {
+                 /* Ensure LTRANS for this item finished.  */
                  item->lock.lock_read ();
-                 /* Ensure that cached compiled file is not deleted.
-                    Create copy.  */
-
-                 obstack_grow (&env_obstack, output_name,
-                               strlen (output_name) - 2);
-                 obstack_grow (&env_obstack, ".cache_copy.XXX.o",
-                               sizeof (".cache_copy.XXX.o"));
-
-                 char* output_name_link = XOBFINISH (&env_obstack, char *);
-                 char* name_idx = output_name_link + strlen (output_name_link)
-                                  - strlen ("XXX.o");
-
-                 /* lto-wrapper can run in parallel and access
-                    the same partition.  */
-                 for (int j = 0; ; j++)
-                   {
-                     gcc_assert (j < 1000);
-                     sprintf (name_idx, "%03d.o", j);
-
-                     if (link (output_name, output_name_link) != EEXIST)
-                       break;
-                   }
-
-                 output_names[i] = output_name_link;
                  item->lock.unlock ();
                }
            }
diff --git a/lto-plugin/lto-plugin.c b/lto-plugin/lto-plugin.c
index 6bccb56291c5..3d272551fed5 100644
--- a/lto-plugin/lto-plugin.c
+++ b/lto-plugin/lto-plugin.c
@@ -214,6 +214,7 @@ static char *ltrans_objects = NULL;
 
 static bool debug;
 static bool save_temps;
+static bool flto_incremental;
 static bool verbose;
 static char nop;
 static char *resolution_file = NULL;
@@ -941,8 +942,9 @@ cleanup_handler (void)
   if (arguments_file_name)
     maybe_unlink (arguments_file_name);
 
-  for (i = 0; i < num_output_files; i++)
-    maybe_unlink (output_files[i]);
+  if (!flto_incremental)
+    for (i = 0; i < num_output_files; i++)
+      maybe_unlink (output_files[i]);
 
   free_2 ();
   return LDPS_OK;
@@ -1615,6 +1617,9 @@ onload (struct ld_plugin_tv *tv)
       if (strstr (collect_gcc_options, "'-save-temps'"))
        save_temps = true;
 
+      if (strstr (collect_gcc_options, "'-flto-incremental="))
+       flto_incremental = true;
+
       if (strstr (collect_gcc_options, "'-v'")
           || strstr (collect_gcc_options, "'--verbose'"))
        verbose = true;

Reply via email to