Hi Richard, > On 16 Sep 2026, at 11:20, Richard Biener <[email protected]> wrote: > > On Wed, 16 Sep 2026, [email protected] wrote: > >> From: Kyrylo Tkachov <[email protected]> >> >> Parallel LTRANS emits make targets without prerequisites. With >> -save-temps, a later link can select the same output name. Make then >> accepts the old object as current. Profile generation followed by >> profile use can therefore link an instrumented LTRANS object without >> libgcov. >> >> Mark each persistent non-cache LTRANS output as phony in the generated >> makefile. Make then runs its recipe for the current link. Temporary >> outputs and LTRANS cache entries keep their current behavior. >> >> Add a tree-profile test that forces parallel LTRANS with -flto=2 and >> reuses the saved output name between profile generation and profile use. >> >> The test reproduced the stale object failure on x86_64 before the change >> and passed after it. On AArch64, this test and the six affected LTO >> profile tests passed in both PGO and AutoFDO modes. >> >> Bootstrapped and tested on aarch64-none-linux-gnu. >> Ok for trunk? > > LGTM, but wouldn't enabling the cache still break the very same > testcase? I suppose -save-temps needs to be used with care.
The cache overrides the -save-temps naming AFAICT so it should be safe. Thanks for the review, Kyrill > >> Thanks, >> Kyrill >> >> gcc/ChangeLog: >> >> * lto-wrapper.cc (run_gcc): Make saved parallel LTRANS outputs phony. >> >> gcc/testsuite/ChangeLog: >> >> * gcc.dg/tree-prof/lto-save-temps-profile-use.c: New test. >> >> Signed-off-by: Kyrylo Tkachov <[email protected]> >> --- >> gcc/lto-wrapper.cc | 3 +++ >> .../tree-prof/lto-save-temps-profile-use.c | 27 +++++++++++++++++++ >> 2 files changed, 30 insertions(+) >> create mode 100644 >> gcc/testsuite/gcc.dg/tree-prof/lto-save-temps-profile-use.c >> >> diff --git a/gcc/lto-wrapper.cc b/gcc/lto-wrapper.cc >> index bd25185c218..333f0ad1d1d 100644 >> --- a/gcc/lto-wrapper.cc >> +++ b/gcc/lto-wrapper.cc >> @@ -2149,6 +2149,9 @@ cont: >> argv_ptr[6] = NULL; >> if (parallel) >> { >> + /* Saved LTRANS outputs can exist from an earlier link. */ >> + if (save_temps && !ltrans_cache) >> + fprintf (mstream, ".PHONY: %s\n", output_name); >> fprintf (mstream, "%s:\n\t@%s ", output_name, new_argv[0]); >> for (j = 1; new_argv[j] != NULL; ++j) >> fprintf (mstream, " '%s'", new_argv[j]); >> diff --git a/gcc/testsuite/gcc.dg/tree-prof/lto-save-temps-profile-use.c >> b/gcc/testsuite/gcc.dg/tree-prof/lto-save-temps-profile-use.c >> new file mode 100644 >> index 00000000000..760dd7cfe73 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/tree-prof/lto-save-temps-profile-use.c >> @@ -0,0 +1,27 @@ >> +/* { dg-require-effective-target lto } */ >> +/* { dg-options "-O2 -flto=2 -flto-partition=one -save-temps" } */ >> + >> +static int __attribute__ ((noinline, noipa)) >> +identity (int value) >> +{ >> + return value; >> +} >> + >> +static int (*volatile indirect_call) (int) = identity; >> + >> +int >> +main (void) >> +{ >> + int result = 0; >> + >> +#ifdef FOR_AUTOFDO_TESTING >> + const int iterations = 1000000; >> +#else >> + const int iterations = 1; >> +#endif >> + >> + for (int i = 0; i < iterations; ++i) >> + result |= indirect_call (0); >> + >> + return result; >> +} >> > > -- > Richard Biener <[email protected]> > SUSE Software Solutions Germany GmbH, > Frankenstrasse 146, 90461 Nuernberg, Germany; > GF: Stefan Gaiser, Jochen Jaser, Abhinav Puri; (HRB 36809, AG Nuernberg)
