LTO: merge -flto=foo both from IL and linker cmdline

gcc/ChangeLog:

	* lto-wrapper.c (merge_flto_options): Factor out a new function.
	(merge_and_complain): Use it.
	(run_gcc): Merge also linker command line -flto=foo argument
	with IL files.
This commit is contained in:
Martin Liska 2021-05-13 13:41:17 +02:00
parent b050cf6a4d
commit 3cbcb5d0cf

View File

@ -189,6 +189,37 @@ find_option (vec<cl_decoded_option> &options, cl_decoded_option *option)
return find_option (options, option->opt_index);
}
/* Merge -flto FOPTION into vector of DECODED_OPTIONS. */
static void
merge_flto_options (vec<cl_decoded_option> &decoded_options,
cl_decoded_option *foption)
{
int existing_opt = find_option (decoded_options, foption);
if (existing_opt == -1)
decoded_options.safe_push (*foption);
else
{
if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
{
/* -flto=auto is preferred. */
if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
;
else if (strcmp (foption->arg, "auto") == 0
|| strcmp (foption->arg, "jobserver") == 0)
decoded_options[existing_opt].arg = foption->arg;
else if (strcmp (decoded_options[existing_opt].arg,
"jobserver") != 0)
{
int n = atoi (foption->arg);
int original_n = atoi (decoded_options[existing_opt].arg);
if (n > original_n)
decoded_options[existing_opt].arg = foption->arg;
}
}
}
}
/* Try to merge and complain about options FDECODED_OPTIONS when applied
ontop of DECODED_OPTIONS. */
@ -427,28 +458,7 @@ merge_and_complain (vec<cl_decoded_option> decoded_options,
break;
case OPT_flto_:
if (existing_opt == -1)
decoded_options.safe_push (*foption);
else
{
if (strcmp (foption->arg, decoded_options[existing_opt].arg) != 0)
{
/* -flto=auto is preferred. */
if (strcmp (decoded_options[existing_opt].arg, "auto") == 0)
;
else if (strcmp (foption->arg, "auto") == 0
|| strcmp (foption->arg, "jobserver") == 0)
decoded_options[existing_opt].arg = foption->arg;
else if (strcmp (decoded_options[existing_opt].arg,
"jobserver") != 0)
{
int n = atoi (foption->arg);
int original_n = atoi (decoded_options[existing_opt].arg);
if (n > original_n)
decoded_options[existing_opt].arg = foption->arg;
}
}
}
merge_flto_options (decoded_options, foption);
break;
}
}
@ -1515,37 +1525,6 @@ run_gcc (unsigned argc, char *argv[])
append_compiler_options (&argv_obstack, fdecoded_options);
append_linker_options (&argv_obstack, decoded_options);
/* Process LTO-related options on merged options. */
for (j = 1; j < fdecoded_options.length (); ++j)
{
cl_decoded_option *option = &fdecoded_options[j];
switch (option->opt_index)
{
case OPT_flto_:
if (strcmp (option->arg, "jobserver") == 0)
{
parallel = 1;
jobserver = 1;
}
else if (strcmp (option->arg, "auto") == 0)
{
parallel = 1;
auto_parallel = 1;
}
else
{
parallel = atoi (option->arg);
if (parallel <= 1)
parallel = 0;
}
/* Fallthru. */
case OPT_flto:
lto_mode = LTO_MODE_WHOPR;
break;
}
}
/* Scan linker driver arguments for things that are of relevance to us. */
for (j = 1; j < decoded_options.length (); ++j)
{
@ -1574,6 +1553,8 @@ run_gcc (unsigned argc, char *argv[])
break;
case OPT_flto_:
/* Merge linker -flto= option with what we have in IL files. */
merge_flto_options (fdecoded_options, option);
if (strcmp (option->arg, "jobserver") == 0)
jobserver_requested = true;
break;
@ -1596,6 +1577,37 @@ run_gcc (unsigned argc, char *argv[])
}
}
/* Process LTO-related options on merged options. */
for (j = 1; j < fdecoded_options.length (); ++j)
{
cl_decoded_option *option = &fdecoded_options[j];
switch (option->opt_index)
{
case OPT_flto_:
if (strcmp (option->arg, "jobserver") == 0)
{
parallel = 1;
jobserver = 1;
}
else if (strcmp (option->arg, "auto") == 0)
{
parallel = 1;
auto_parallel = 1;
}
else
{
parallel = atoi (option->arg);
if (parallel <= 1)
parallel = 0;
}
/* Fallthru. */
case OPT_flto:
lto_mode = LTO_MODE_WHOPR;
break;
}
}
/* Output lto-wrapper invocation command. */
if (verbose)
{