On Wed, 3 Dec 2025, Senthil Kumar wrote:
> >
> > Hello,
> >
> > As part of jobserver detection, the jobserver_info constructor looks
> > for the last occurence of "--jobserver-auth=", and parses the argument
> > for that option to look for either a named pipe (has a "fifo:" prefix)
> > or read and write pipe fds separated by a comma.
> >
> > With GNU Make 4.4 and above, named pipes are used by default because
> > anonymous pipe fds cannot be used reliably (see
> > https://savannah.gnu.org/bugs/?57242), but it still supports a
> > --jobserver-style=pipe option for compatibility reasons. With that
> > flag enabled, or with older GNU Make versions, the jobserver detection
> > code checks if the provided fds are greater than 0 and valid. If
> > invalid, it drops them from MAKEFLAGS used for subsequent child
> > processes.
> >
> > However, GNU Make explicitly provides negative jobserver pipe fds if
> > the command is not marked as recursive (i.e is missing a '+' prefix in
> > the Makefile) - see https://savannah.gnu.org/bugs/?57242#comment13.
> >
> > The MAKEFLAGS look like this in that case.
> >
> > -j4 --jobserver-auth=3,4 --jobserver-auth=-2,-2
> >
> > Stripping off the final --jobserver-auth with negative fds undoes this
> > helpful hint from GNU Make, and exposes child processes (like
> > lto-wrapper) to all the issues with anonymous pipe fds that forced GNU
> > Make to switch to named pipes by default.
> >
> > This patch prevents that stripping if jobserver communication is *not*
> > via a named pipe *and* file descriptors are negative. As a result,
> > child processes receive MAKEFLAGS with negative file descriptors too,
> > and correctly decide that a jobserver is not available.
> >
> > Ok for master?
OK.
Thanks,
Richard.
> > Regards
> > Senthil
> >
> > gcc/ChangeLog:
> >
> > * opts-common.cc (jobserver_info::jobserver_info): Do not strip
> > jobserver
> > auth flags with negative file descriptors.
> >
> > diff --git gcc/opts-common.cc gcc/opts-common.cc
> > index 379402e68a6..aaed63d1344 100644
> > --- gcc/opts-common.cc
> > +++ gcc/opts-common.cc
> > @@ -2110,7 +2110,8 @@ jobserver_info::jobserver_info ()
> > if (n != string::npos)
> > {
> > string ending = makeflags.substr (n + js_needle.size ());
> > - if (ending.find (fifo_prefix) == 0)
> > + bool is_named_pipe = ending.find (fifo_prefix) == 0;
> > + if (is_named_pipe)
> > {
> > ending = ending.substr (fifo_prefix.size ());
> > pipe_path = ending.substr (0, ending.find (' '));
> > @@ -2125,11 +2126,15 @@ jobserver_info::jobserver_info ()
> > is_active = true;
> > else
> > {
> > - string dup = makeflags.substr (0, n);
> > - size_t pos = makeflags.find (' ', n);
> > - if (pos != string::npos)
> > - dup += makeflags.substr (pos);
> > - skipped_makeflags = "MAKEFLAGS=" + dup;
> > + bool negative_fds = !is_named_pipe && rfd < 0 && wfd < 0;
> > + if (!negative_fds)
> > + {
> > + string dup = makeflags.substr (0, n);
> > + size_t pos = makeflags.find (' ', n);
> > + if (pos != string::npos)
> > + dup += makeflags.substr (pos);
> > + skipped_makeflags = "MAKEFLAGS=" + dup;
> > + }
> > error_msg
> > = "cannot access %<" + js_needle + "%> file descriptors";
>
--
Richard Biener <[email protected]>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Jochen Jaser, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)