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.
This commit is contained in:
Michal Jires 2025-01-13 04:08:03 +01:00
parent d6f1961e68
commit ed1233115c
2 changed files with 12 additions and 31 deletions

View File

@ -1571,6 +1571,8 @@ run_gcc (unsigned argc, char *argv[])
/* Exists. */ /* Exists. */
if (access (option->arg, W_OK) == 0) if (access (option->arg, W_OK) == 0)
ltrans_cache_dir = option->arg; ltrans_cache_dir = option->arg;
else
fatal_error (input_location, "missing directory: %s", option->arg);
break; break;
case OPT_flto_incremental_cache_size_: case OPT_flto_incremental_cache_size_:
@ -2218,39 +2220,13 @@ cont:
{ {
for (i = 0; i < nr; ++i) for (i = 0; i < nr; ++i)
{ {
char *input_name = input_names[i];
char const *output_name = output_names[i];
ltrans_file_cache::item* item; 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 (); 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 (); item->lock.unlock ();
} }
} }

View File

@ -214,6 +214,7 @@ static char *ltrans_objects = NULL;
static bool debug; static bool debug;
static bool save_temps; static bool save_temps;
static bool flto_incremental;
static bool verbose; static bool verbose;
static char nop; static char nop;
static char *resolution_file = NULL; static char *resolution_file = NULL;
@ -941,8 +942,9 @@ cleanup_handler (void)
if (arguments_file_name) if (arguments_file_name)
maybe_unlink (arguments_file_name); maybe_unlink (arguments_file_name);
for (i = 0; i < num_output_files; i++) if (!flto_incremental)
maybe_unlink (output_files[i]); for (i = 0; i < num_output_files; i++)
maybe_unlink (output_files[i]);
free_2 (); free_2 ();
return LDPS_OK; return LDPS_OK;
@ -1615,6 +1617,9 @@ onload (struct ld_plugin_tv *tv)
if (strstr (collect_gcc_options, "'-save-temps'")) if (strstr (collect_gcc_options, "'-save-temps'"))
save_temps = true; save_temps = true;
if (strstr (collect_gcc_options, "'-flto-incremental="))
flto_incremental = true;
if (strstr (collect_gcc_options, "'-v'") if (strstr (collect_gcc_options, "'-v'")
|| strstr (collect_gcc_options, "'--verbose'")) || strstr (collect_gcc_options, "'--verbose'"))
verbose = true; verbose = true;