On Mon, 13 Jan 2025, Michal Jires wrote: > 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?
OK. Richard. > 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. > --- > 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 f9b2511c38e..a980b208783 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 6bccb56291c..6c78d019cf1 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; > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)