diff mbox series

LTO: fallback to -flto=N if -flto=jobserver does not work.

Message ID 11a45856-44b3-754d-5a42-19a348d0d59d@suse.cz
State New
Headers show
Series LTO: fallback to -flto=N if -flto=jobserver does not work. | expand

Commit Message

Martin Liška April 21, 2021, 11:50 a.m. UTC
When -flto=jobserver is used and we cannot detect job server, then we can
still fallbackto -flto=N mode.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

	* lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
	makeserver cannot be detected, then use -flto=N fallback.
---
 gcc/lto-wrapper.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Jeff Law April 21, 2021, 3:11 p.m. UTC | #1
On 4/21/2021 5:50 AM, Martin Liška wrote:
> When -flto=jobserver is used and we cannot detect job server, then we can
> still fallbackto -flto=N mode.
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?
> Thanks,
> Martin
>
> gcc/ChangeLog:
>
> 	* lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
> 	makeserver cannot be detected, then use -flto=N fallback.

OK

jeff
Richard Biener April 22, 2021, 8:04 a.m. UTC | #2
On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
>
> When -flto=jobserver is used and we cannot detect job server, then we can
> still fallbackto -flto=N mode.
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?

I think this behavior needs to be documented - it falls back to a less
conservative (possibly system overloading) mode - which IMHO is
non-obvious and IMHO we shouldn't do.

Richard.

> Thanks,
> Martin
>
> gcc/ChangeLog:
>
>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
>         makeserver cannot be detected, then use -flto=N fallback.
> ---
>  gcc/lto-wrapper.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
> index 03a5922f8ea..0b626d7c811 100644
> --- a/gcc/lto-wrapper.c
> +++ b/gcc/lto-wrapper.c
> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
>        if (jobserver && jobserver_error != NULL)
>         {
>           warning (0, jobserver_error);
> -         parallel = 0;
> +         /* Fall back to auto parallelism.  */
>           jobserver = 0;
> +         auto_parallel = 1;
>         }
>        else if (!jobserver && jobserver_error == NULL)
>         {
> --
> 2.31.1
>
Martin Liška April 22, 2021, 9:02 a.m. UTC | #3
On 4/22/21 10:04 AM, Richard Biener wrote:
> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
>>
>> When -flto=jobserver is used and we cannot detect job server, then we can
>> still fallbackto -flto=N mode.
>>
>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>
>> Ready to be installed?
> 
> I think this behavior needs to be documented - it falls back to a less
> conservative (possibly system overloading) mode - which IMHO is
> non-obvious and IMHO we shouldn't do.

Sure, I'm sending corresponding patch. Note that it's quite common mistake
that '+' is missing in Makefile rule. That was motivation for my change.

Martin

> 
> Richard.
> 
>> Thanks,
>> Martin
>>
>> gcc/ChangeLog:
>>
>>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
>>         makeserver cannot be detected, then use -flto=N fallback.
>> ---
>>  gcc/lto-wrapper.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
>> index 03a5922f8ea..0b626d7c811 100644
>> --- a/gcc/lto-wrapper.c
>> +++ b/gcc/lto-wrapper.c
>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
>>        if (jobserver && jobserver_error != NULL)
>>         {
>>           warning (0, jobserver_error);
>> -         parallel = 0;
>> +         /* Fall back to auto parallelism.  */
>>           jobserver = 0;
>> +         auto_parallel = 1;
>>         }
>>        else if (!jobserver && jobserver_error == NULL)
>>         {
>> --
>> 2.31.1
>>
Richard Biener April 22, 2021, 11:19 a.m. UTC | #4
On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
>
> On 4/22/21 10:04 AM, Richard Biener wrote:
> > On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
> >>
> >> When -flto=jobserver is used and we cannot detect job server, then we can
> >> still fallbackto -flto=N mode.
> >>
> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>
> >> Ready to be installed?
> >
> > I think this behavior needs to be documented - it falls back to a less
> > conservative (possibly system overloading) mode - which IMHO is
> > non-obvious and IMHO we shouldn't do.
>
> Sure, I'm sending corresponding patch. Note that it's quite common mistake
> that '+' is missing in Makefile rule. That was motivation for my change.

Sure, but that change won't get this fixed.  IMHO we should eventually
emit diagnostic like

warning: could not find jobserver, compiling N jobs serially

once N > 1 (or 2?).  Likewise if people just use -flto and auto-detection
finds nothing:

warning: using serial compilation of N LTRANS jobs
note: refer to http://.... for how to use parallel compile

using the URL diagnostics to point to -flto=... documentation.

That is, teach users rather than second-guessing and eventually
blowing things up.  IMHO only the jobserver mode is safe to
automatically use.

Richard.

> Martin
>
> >
> > Richard.
> >
> >> Thanks,
> >> Martin
> >>
> >> gcc/ChangeLog:
> >>
> >>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
> >>         makeserver cannot be detected, then use -flto=N fallback.
> >> ---
> >>  gcc/lto-wrapper.c | 3 ++-
> >>  1 file changed, 2 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
> >> index 03a5922f8ea..0b626d7c811 100644
> >> --- a/gcc/lto-wrapper.c
> >> +++ b/gcc/lto-wrapper.c
> >> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
> >>        if (jobserver && jobserver_error != NULL)
> >>         {
> >>           warning (0, jobserver_error);
> >> -         parallel = 0;
> >> +         /* Fall back to auto parallelism.  */
> >>           jobserver = 0;
> >> +         auto_parallel = 1;
> >>         }
> >>        else if (!jobserver && jobserver_error == NULL)
> >>         {
> >> --
> >> 2.31.1
> >>
>
Martin Liška April 22, 2021, 12:21 p.m. UTC | #5
On 4/22/21 1:19 PM, Richard Biener wrote:
> On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
>>
>> On 4/22/21 10:04 AM, Richard Biener wrote:
>>> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
>>>>
>>>> When -flto=jobserver is used and we cannot detect job server, then we can
>>>> still fallbackto -flto=N mode.
>>>>
>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>>>
>>>> Ready to be installed?
>>>
>>> I think this behavior needs to be documented - it falls back to a less
>>> conservative (possibly system overloading) mode - which IMHO is
>>> non-obvious and IMHO we shouldn't do.
>>
>> Sure, I'm sending corresponding patch. Note that it's quite common mistake
>> that '+' is missing in Makefile rule. That was motivation for my change.
> 
> Sure, but that change won't get this fixed.

It will as linker command line will contain (-flto=jobserver) and LTO will fallback to -flto=N.

> IMHO we should eventually
> emit diagnostic like
> 
> warning: could not find jobserver, compiling N jobs serially
> 
> once N > 1 (or 2?).

We do that now (for all N):
lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset


> Likewise if people just use -flto and auto-detection
> finds nothing:

-flto != -flto=auto

Yes, -flto is a serial linking and we can emit a warning.

> 
> warning: using serial compilation of N LTRANS jobs
> note: refer to http://.... for how to use parallel compile
> 
> using the URL diagnostics to point to -flto=... documentation.

What about making that a proper warning (-Wlto)? We have diagnostics infrastructure
that prints URL links.

> 
> That is, teach users rather than second-guessing and eventually
> blowing things up.  IMHO only the jobserver mode is safe to
> automatically use.

Well, -flto=auto is also fine and document. I think there is no possibility
auto CPU deduction can fail. So -flto=jobserver (with missing make job server)
and -flto (equal to -flto=1) worth emitting a warning.

What do you think?
Martin

> 
> Richard.
> 
>> Martin
>>
>>>
>>> Richard.
>>>
>>>> Thanks,
>>>> Martin
>>>>
>>>> gcc/ChangeLog:
>>>>
>>>>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
>>>>         makeserver cannot be detected, then use -flto=N fallback.
>>>> ---
>>>>  gcc/lto-wrapper.c | 3 ++-
>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
>>>> index 03a5922f8ea..0b626d7c811 100644
>>>> --- a/gcc/lto-wrapper.c
>>>> +++ b/gcc/lto-wrapper.c
>>>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
>>>>        if (jobserver && jobserver_error != NULL)
>>>>         {
>>>>           warning (0, jobserver_error);
>>>> -         parallel = 0;
>>>> +         /* Fall back to auto parallelism.  */
>>>>           jobserver = 0;
>>>> +         auto_parallel = 1;
>>>>         }
>>>>        else if (!jobserver && jobserver_error == NULL)
>>>>         {
>>>> --
>>>> 2.31.1
>>>>
>>
Richard Biener April 22, 2021, 12:47 p.m. UTC | #6
On Thu, Apr 22, 2021 at 2:21 PM Martin Liška <mliska@suse.cz> wrote:
>
> On 4/22/21 1:19 PM, Richard Biener wrote:
> > On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
> >>
> >> On 4/22/21 10:04 AM, Richard Biener wrote:
> >>> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
> >>>>
> >>>> When -flto=jobserver is used and we cannot detect job server, then we can
> >>>> still fallbackto -flto=N mode.
> >>>>
> >>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>>>
> >>>> Ready to be installed?
> >>>
> >>> I think this behavior needs to be documented - it falls back to a less
> >>> conservative (possibly system overloading) mode - which IMHO is
> >>> non-obvious and IMHO we shouldn't do.
> >>
> >> Sure, I'm sending corresponding patch. Note that it's quite common mistake
> >> that '+' is missing in Makefile rule. That was motivation for my change.
> >
> > Sure, but that change won't get this fixed.
>
> It will as linker command line will contain (-flto=jobserver) and LTO will fallback to -flto=N.
>
> > IMHO we should eventually
> > emit diagnostic like
> >
> > warning: could not find jobserver, compiling N jobs serially
> >
> > once N > 1 (or 2?).
>
> We do that now (for all N):
> lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
>
>
> > Likewise if people just use -flto and auto-detection
> > finds nothing:
>
> -flto != -flto=auto
>
> Yes, -flto is a serial linking and we can emit a warning.

I'd avoid warning if there's just a single ltrans unit.

> > warning: using serial compilation of N LTRANS jobs
> > note: refer to http://.... for how to use parallel compile
> >
> > using the URL diagnostics to point to -flto=... documentation.
>
> What about making that a proper warning (-Wlto)? We have diagnostics infrastructure
> that prints URL links.

Note that drivers like lto-wrapper do not have fully initialized diagnostic
machinery and use a "different" set of overloads (likewise gen* programs).

> >
> > That is, teach users rather than second-guessing and eventually
> > blowing things up.  IMHO only the jobserver mode is safe to
> > automatically use.
>
> Well, -flto=auto is also fine and document. I think there is no possibility
> auto CPU deduction can fail. So -flto=jobserver (with missing make job server)
> and -flto (equal to -flto=1) worth emitting a warning.
>
> What do you think?

Yes, that sounds reasonable.  I suspect that people might want to see
-flto default to -flto=auto but then I don't think that's good because there's
no system wide job scheduler limiting things (systemd-jobserver anyone?)

Richard.

> Martin
>
> >
> > Richard.
> >
> >> Martin
> >>
> >>>
> >>> Richard.
> >>>
> >>>> Thanks,
> >>>> Martin
> >>>>
> >>>> gcc/ChangeLog:
> >>>>
> >>>>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
> >>>>         makeserver cannot be detected, then use -flto=N fallback.
> >>>> ---
> >>>>  gcc/lto-wrapper.c | 3 ++-
> >>>>  1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
> >>>> index 03a5922f8ea..0b626d7c811 100644
> >>>> --- a/gcc/lto-wrapper.c
> >>>> +++ b/gcc/lto-wrapper.c
> >>>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
> >>>>        if (jobserver && jobserver_error != NULL)
> >>>>         {
> >>>>           warning (0, jobserver_error);
> >>>> -         parallel = 0;
> >>>> +         /* Fall back to auto parallelism.  */
> >>>>           jobserver = 0;
> >>>> +         auto_parallel = 1;
> >>>>         }
> >>>>        else if (!jobserver && jobserver_error == NULL)
> >>>>         {
> >>>> --
> >>>> 2.31.1
> >>>>
> >>
>
Martin Liška April 22, 2021, 2:30 p.m. UTC | #7
On 4/22/21 2:47 PM, Richard Biener wrote:
> On Thu, Apr 22, 2021 at 2:21 PM Martin Liška <mliska@suse.cz> wrote:
>>
>> On 4/22/21 1:19 PM, Richard Biener wrote:
>>> On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
>>>>
>>>> On 4/22/21 10:04 AM, Richard Biener wrote:
>>>>> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
>>>>>>
>>>>>> When -flto=jobserver is used and we cannot detect job server, then we can
>>>>>> still fallbackto -flto=N mode.
>>>>>>
>>>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>>>>>
>>>>>> Ready to be installed?
>>>>>
>>>>> I think this behavior needs to be documented - it falls back to a less
>>>>> conservative (possibly system overloading) mode - which IMHO is
>>>>> non-obvious and IMHO we shouldn't do.
>>>>
>>>> Sure, I'm sending corresponding patch. Note that it's quite common mistake
>>>> that '+' is missing in Makefile rule. That was motivation for my change.
>>>
>>> Sure, but that change won't get this fixed.
>>
>> It will as linker command line will contain (-flto=jobserver) and LTO will fallback to -flto=N.
>>
>>> IMHO we should eventually
>>> emit diagnostic like
>>>
>>> warning: could not find jobserver, compiling N jobs serially
>>>
>>> once N > 1 (or 2?).
>>
>> We do that now (for all N):
>> lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
>>
>>
>>> Likewise if people just use -flto and auto-detection
>>> finds nothing:
>>
>> -flto != -flto=auto
>>
>> Yes, -flto is a serial linking and we can emit a warning.
> 
> I'd avoid warning if there's just a single ltrans unit.

That's doable and I've just done that in the attached patch.
Two disadvantages:
- one needs waiting for the warning after WPA
- source change (>1 LTRANS) can trigger the warning

> 
>>> warning: using serial compilation of N LTRANS jobs
>>> note: refer to http://.... for how to use parallel compile
>>>
>>> using the URL diagnostics to point to -flto=... documentation.
>>
>> What about making that a proper warning (-Wlto)? We have diagnostics infrastructure
>> that prints URL links.
> 
> Note that drivers like lto-wrapper do not have fully initialized diagnostic
> machinery and use a "different" set of overloads (likewise gen* programs).

I managed printing the warning:

lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset

lto-wrapper: note: see the ‘-flto’ option documentation for more information


and

lto-wrapper: warning: using serial compilation of 128 LTRANS jobs

lto-wrapper: note: see the ‘-flto’ option documentation for more information


> 
>>>
>>> That is, teach users rather than second-guessing and eventually
>>> blowing things up.  IMHO only the jobserver mode is safe to
>>> automatically use.
>>
>> Well, -flto=auto is also fine and document. I think there is no possibility
>> auto CPU deduction can fail. So -flto=jobserver (with missing make job server)
>> and -flto (equal to -flto=1) worth emitting a warning.
>>
>> What do you think?
> 
> Yes, that sounds reasonable.  I suspect that people might want to see
> -flto default to -flto=auto but then I don't think that's good because there's
> no system wide job scheduler limiting things (systemd-jobserver anyone?)

Done that.

Thoughts?
Martin

> 
> Richard.
> 
>> Martin
>>
>>>
>>> Richard.
>>>
>>>> Martin
>>>>
>>>>>
>>>>> Richard.
>>>>>
>>>>>> Thanks,
>>>>>> Martin
>>>>>>
>>>>>> gcc/ChangeLog:
>>>>>>
>>>>>>         * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
>>>>>>         makeserver cannot be detected, then use -flto=N fallback.
>>>>>> ---
>>>>>>  gcc/lto-wrapper.c | 3 ++-
>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
>>>>>> index 03a5922f8ea..0b626d7c811 100644
>>>>>> --- a/gcc/lto-wrapper.c
>>>>>> +++ b/gcc/lto-wrapper.c
>>>>>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
>>>>>>        if (jobserver && jobserver_error != NULL)
>>>>>>         {
>>>>>>           warning (0, jobserver_error);
>>>>>> -         parallel = 0;
>>>>>> +         /* Fall back to auto parallelism.  */
>>>>>>           jobserver = 0;
>>>>>> +         auto_parallel = 1;
>>>>>>         }
>>>>>>        else if (!jobserver && jobserver_error == NULL)
>>>>>>         {
>>>>>> --
>>>>>> 2.31.1
>>>>>>
>>>>
>>
Martin Liška May 12, 2021, 9:10 a.m. UTC | #8
May I please ping this Richi?

Thanks,
Martin

On 4/22/21 4:30 PM, Martin Liška wrote:
> On 4/22/21 2:47 PM, Richard Biener wrote:
>> On Thu, Apr 22, 2021 at 2:21 PM Martin Liška <mliska@suse.cz> wrote:
>>>
>>> On 4/22/21 1:19 PM, Richard Biener wrote:
>>>> On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
>>>>>
>>>>> On 4/22/21 10:04 AM, Richard Biener wrote:
>>>>>> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
>>>>>>>
>>>>>>> When -flto=jobserver is used and we cannot detect job server, then we can
>>>>>>> still fallbackto -flto=N mode.
>>>>>>>
>>>>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>>>>>>
>>>>>>> Ready to be installed?
>>>>>>
>>>>>> I think this behavior needs to be documented - it falls back to a less
>>>>>> conservative (possibly system overloading) mode - which IMHO is
>>>>>> non-obvious and IMHO we shouldn't do.
>>>>>
>>>>> Sure, I'm sending corresponding patch. Note that it's quite common mistake
>>>>> that '+' is missing in Makefile rule. That was motivation for my change.
>>>>
>>>> Sure, but that change won't get this fixed.
>>>
>>> It will as linker command line will contain (-flto=jobserver) and LTO will fallback to -flto=N.
>>>
>>>> IMHO we should eventually
>>>> emit diagnostic like
>>>>
>>>> warning: could not find jobserver, compiling N jobs serially
>>>>
>>>> once N > 1 (or 2?).
>>>
>>> We do that now (for all N):
>>> lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
>>>
>>>
>>>> Likewise if people just use -flto and auto-detection
>>>> finds nothing:
>>>
>>> -flto != -flto=auto
>>>
>>> Yes, -flto is a serial linking and we can emit a warning.
>>
>> I'd avoid warning if there's just a single ltrans unit.
> 
> That's doable and I've just done that in the attached patch.
> Two disadvantages:
> - one needs waiting for the warning after WPA
> - source change (>1 LTRANS) can trigger the warning
> 
>>
>>>> warning: using serial compilation of N LTRANS jobs
>>>> note: refer to http://.... for how to use parallel compile
>>>>
>>>> using the URL diagnostics to point to -flto=... documentation.
>>>
>>> What about making that a proper warning (-Wlto)? We have diagnostics infrastructure
>>> that prints URL links.
>>
>> Note that drivers like lto-wrapper do not have fully initialized diagnostic
>> machinery and use a "different" set of overloads (likewise gen* programs).
> 
> I managed printing the warning:
> 
> lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
> 
> lto-wrapper: note: see the ‘-flto’ option documentation for more information
> 
> 
> and
> 
> lto-wrapper: warning: using serial compilation of 128 LTRANS jobs
> 
> lto-wrapper: note: see the ‘-flto’ option documentation for more information
> 
> 
>>
>>>>
>>>> That is, teach users rather than second-guessing and eventually
>>>> blowing things up.  IMHO only the jobserver mode is safe to
>>>> automatically use.
>>>
>>> Well, -flto=auto is also fine and document. I think there is no possibility
>>> auto CPU deduction can fail. So -flto=jobserver (with missing make job server)
>>> and -flto (equal to -flto=1) worth emitting a warning.
>>>
>>> What do you think?
>>
>> Yes, that sounds reasonable.  I suspect that people might want to see
>> -flto default to -flto=auto but then I don't think that's good because there's
>> no system wide job scheduler limiting things (systemd-jobserver anyone?)
> 
> Done that.
> 
> Thoughts?
> Martin
> 
>>
>> Richard.
>>
>>> Martin
>>>
>>>>
>>>> Richard.
>>>>
>>>>> Martin
>>>>>
>>>>>>
>>>>>> Richard.
>>>>>>
>>>>>>> Thanks,
>>>>>>> Martin
>>>>>>>
>>>>>>> gcc/ChangeLog:
>>>>>>>
>>>>>>>          * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
>>>>>>>          makeserver cannot be detected, then use -flto=N fallback.
>>>>>>> ---
>>>>>>>   gcc/lto-wrapper.c | 3 ++-
>>>>>>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
>>>>>>> index 03a5922f8ea..0b626d7c811 100644
>>>>>>> --- a/gcc/lto-wrapper.c
>>>>>>> +++ b/gcc/lto-wrapper.c
>>>>>>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
>>>>>>>         if (jobserver && jobserver_error != NULL)
>>>>>>>          {
>>>>>>>            warning (0, jobserver_error);
>>>>>>> -         parallel = 0;
>>>>>>> +         /* Fall back to auto parallelism.  */
>>>>>>>            jobserver = 0;
>>>>>>> +         auto_parallel = 1;
>>>>>>>          }
>>>>>>>         else if (!jobserver && jobserver_error == NULL)
>>>>>>>          {
>>>>>>> --
>>>>>>> 2.31.1
>>>>>>>
>>>>>
>>>
>
Richard Biener May 12, 2021, 9:21 a.m. UTC | #9
On Wed, May 12, 2021 at 11:10 AM Martin Liška <mliska@suse.cz> wrote:
>
> May I please ping this Richi?

OK.

Thanks,
Richard.



> Thanks,
> Martin
>
> On 4/22/21 4:30 PM, Martin Liška wrote:
> > On 4/22/21 2:47 PM, Richard Biener wrote:
> >> On Thu, Apr 22, 2021 at 2:21 PM Martin Liška <mliska@suse.cz> wrote:
> >>>
> >>> On 4/22/21 1:19 PM, Richard Biener wrote:
> >>>> On Thu, Apr 22, 2021 at 11:02 AM Martin Liška <mliska@suse.cz> wrote:
> >>>>>
> >>>>> On 4/22/21 10:04 AM, Richard Biener wrote:
> >>>>>> On Wed, Apr 21, 2021 at 3:08 PM Martin Liška <mliska@suse.cz> wrote:
> >>>>>>>
> >>>>>>> When -flto=jobserver is used and we cannot detect job server, then we can
> >>>>>>> still fallbackto -flto=N mode.
> >>>>>>>
> >>>>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>>>>>>
> >>>>>>> Ready to be installed?
> >>>>>>
> >>>>>> I think this behavior needs to be documented - it falls back to a less
> >>>>>> conservative (possibly system overloading) mode - which IMHO is
> >>>>>> non-obvious and IMHO we shouldn't do.
> >>>>>
> >>>>> Sure, I'm sending corresponding patch. Note that it's quite common mistake
> >>>>> that '+' is missing in Makefile rule. That was motivation for my change.
> >>>>
> >>>> Sure, but that change won't get this fixed.
> >>>
> >>> It will as linker command line will contain (-flto=jobserver) and LTO will fallback to -flto=N.
> >>>
> >>>> IMHO we should eventually
> >>>> emit diagnostic like
> >>>>
> >>>> warning: could not find jobserver, compiling N jobs serially
> >>>>
> >>>> once N > 1 (or 2?).
> >>>
> >>> We do that now (for all N):
> >>> lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
> >>>
> >>>
> >>>> Likewise if people just use -flto and auto-detection
> >>>> finds nothing:
> >>>
> >>> -flto != -flto=auto
> >>>
> >>> Yes, -flto is a serial linking and we can emit a warning.
> >>
> >> I'd avoid warning if there's just a single ltrans unit.
> >
> > That's doable and I've just done that in the attached patch.
> > Two disadvantages:
> > - one needs waiting for the warning after WPA
> > - source change (>1 LTRANS) can trigger the warning
> >
> >>
> >>>> warning: using serial compilation of N LTRANS jobs
> >>>> note: refer to http://.... for how to use parallel compile
> >>>>
> >>>> using the URL diagnostics to point to -flto=... documentation.
> >>>
> >>> What about making that a proper warning (-Wlto)? We have diagnostics infrastructure
> >>> that prints URL links.
> >>
> >> Note that drivers like lto-wrapper do not have fully initialized diagnostic
> >> machinery and use a "different" set of overloads (likewise gen* programs).
> >
> > I managed printing the warning:
> >
> > lto-wrapper: warning: jobserver is not available: ‘MAKEFLAGS’ environment variable is unset
> >
> > lto-wrapper: note: see the ‘-flto’ option documentation for more information
> >
> >
> > and
> >
> > lto-wrapper: warning: using serial compilation of 128 LTRANS jobs
> >
> > lto-wrapper: note: see the ‘-flto’ option documentation for more information
> >
> >
> >>
> >>>>
> >>>> That is, teach users rather than second-guessing and eventually
> >>>> blowing things up.  IMHO only the jobserver mode is safe to
> >>>> automatically use.
> >>>
> >>> Well, -flto=auto is also fine and document. I think there is no possibility
> >>> auto CPU deduction can fail. So -flto=jobserver (with missing make job server)
> >>> and -flto (equal to -flto=1) worth emitting a warning.
> >>>
> >>> What do you think?
> >>
> >> Yes, that sounds reasonable.  I suspect that people might want to see
> >> -flto default to -flto=auto but then I don't think that's good because there's
> >> no system wide job scheduler limiting things (systemd-jobserver anyone?)
> >
> > Done that.
> >
> > Thoughts?
> > Martin
> >
> >>
> >> Richard.
> >>
> >>> Martin
> >>>
> >>>>
> >>>> Richard.
> >>>>
> >>>>> Martin
> >>>>>
> >>>>>>
> >>>>>> Richard.
> >>>>>>
> >>>>>>> Thanks,
> >>>>>>> Martin
> >>>>>>>
> >>>>>>> gcc/ChangeLog:
> >>>>>>>
> >>>>>>>          * lto-wrapper.c (run_gcc): When -flto=jobserver is used, but the
> >>>>>>>          makeserver cannot be detected, then use -flto=N fallback.
> >>>>>>> ---
> >>>>>>>   gcc/lto-wrapper.c | 3 ++-
> >>>>>>>   1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>>>
> >>>>>>> diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
> >>>>>>> index 03a5922f8ea..0b626d7c811 100644
> >>>>>>> --- a/gcc/lto-wrapper.c
> >>>>>>> +++ b/gcc/lto-wrapper.c
> >>>>>>> @@ -1585,8 +1585,9 @@ run_gcc (unsigned argc, char *argv[])
> >>>>>>>         if (jobserver && jobserver_error != NULL)
> >>>>>>>          {
> >>>>>>>            warning (0, jobserver_error);
> >>>>>>> -         parallel = 0;
> >>>>>>> +         /* Fall back to auto parallelism.  */
> >>>>>>>            jobserver = 0;
> >>>>>>> +         auto_parallel = 1;
> >>>>>>>          }
> >>>>>>>         else if (!jobserver && jobserver_error == NULL)
> >>>>>>>          {
> >>>>>>> --
> >>>>>>> 2.31.1
> >>>>>>>
> >>>>>
> >>>
> >
>
diff mbox series

Patch

diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index 03a5922f8ea..0b626d7c811 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -1585,8 +1585,9 @@  run_gcc (unsigned argc, char *argv[])
       if (jobserver && jobserver_error != NULL)
 	{
 	  warning (0, jobserver_error);
-	  parallel = 0;
+	  /* Fall back to auto parallelism.  */
 	  jobserver = 0;
+	  auto_parallel = 1;
 	}
       else if (!jobserver && jobserver_error == NULL)
 	{