On Thu, May 13, 2021 at 1:49 PM Martin Liška <[email protected]> wrote:
>
> Hello.
>
> In g:3835aa0eb90292d652dd6b200f302f3cac7e643f, I changed logic that the output
> -flto=foo argument is taken from IL file command lines. However, it should be
> also
> merged with linker command line. One can use -flto for compilation and
> -flto=16 for linking.
>
> Ready after it finishes tests?
OK.
Richard.
> Thanks,
> Martin
>
> 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.
> ---
> gcc/lto-wrapper.c | 118 +++++++++++++++++++++++++---------------------
> 1 file changed, 65 insertions(+), 53 deletions(-)
>
> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
> index a71d6147152..1c2643984f9 100644
> --- a/gcc/lto-wrapper.c
> +++ b/gcc/lto-wrapper.c
> @@ -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)
> {
> --
> 2.31.1
>