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;