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. > 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)
