Properly detect working jobserver in gcc driver.
authorMartin Liska <mliska@suse.cz>
Fri, 2 Aug 2019 09:23:56 +0000 (11:23 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 2 Aug 2019 09:23:56 +0000 (09:23 +0000)
2019-08-02  Martin Liska  <mliska@suse.cz>

PR lto/91313
* gcc.c (driver::maybe_run_linker): Call detect_jobserver
to detect working job server.
(driver::detect_jobserver): Test whether jobserver
is active from GCC driver. That will prevent situation where
GCC is invoked from a LD plugin and the linker already uses
file descriptors suggested by make.  That leads to a wrong
detection.
* gcc.h (driver): Add detect_jobserver.
* lto-wrapper.c (jobserver_active_p): Simplify sscanf by
not scanning for --jobserver-auth prefix.

From-SVN: r274003

gcc/ChangeLog
gcc/gcc.c
gcc/gcc.h
gcc/lto-wrapper.c

index 1909d87a330e73db8b5524fc4ea3ad1defaa986c..096716a0c93de94461f23cfa8068cc133f7b5b49 100644 (file)
@@ -1,3 +1,17 @@
+2019-08-02  Martin Liska  <mliska@suse.cz>
+
+       PR lto/91313
+       * gcc.c (driver::maybe_run_linker): Call detect_jobserver
+       to detect working job server.
+       (driver::detect_jobserver): Test whether jobserver
+       is active from GCC driver. That will prevent situation where
+       GCC is invoked from a LD plugin and the linker already uses
+       file descriptors suggested by make.  That leads to a wrong
+       detection.
+       * gcc.h (driver): Add detect_jobserver.
+       * lto-wrapper.c (jobserver_active_p): Simplify sscanf by
+       not scanning for --jobserver-auth prefix.
+
 2019-08-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/91201
index a4323eb146edfd07a3c9817e65e84bcc4168a222..18a07426290cfa76647c0f6c11cf2f1cf27a6d44 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -8268,6 +8268,8 @@ driver::maybe_run_linker (const char *argv0) const
     {
       int tmp = execution_count;
 
+      detect_jobserver ();
+
       if (! have_c)
        {
 #if HAVE_LTO_PLUGIN > 0
@@ -8357,6 +8359,46 @@ driver::final_actions () const
     }
 }
 
+/* Detect whether jobserver is active and working.  If not drop
+   --jobserver-auth from MAKEFLAGS.  */
+
+void
+driver::detect_jobserver () const
+{
+  /* Detect jobserver and drop it if it's not working.  */
+  const char *makeflags = env.get ("MAKEFLAGS");
+  if (makeflags != NULL)
+    {
+      const char *needle = "--jobserver-auth=";
+      const char *n = strstr (makeflags, needle);
+      if (n != NULL)
+       {
+         int rfd = -1;
+         int wfd = -1;
+
+         bool jobserver
+           = (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
+              && rfd > 0
+              && wfd > 0
+              && fcntl (rfd, F_GETFD) >= 0
+              && fcntl (wfd, F_GETFD) >= 0);
+
+         /* Drop the jobserver if it's not working now.  */
+         if (!jobserver)
+           {
+             unsigned offset = n - makeflags;
+             char *dup = xstrdup (makeflags);
+             dup[offset] = '\0';
+
+             const char *space = strchr (makeflags + offset, ' ');
+             if (space != NULL)
+               strcpy (dup + offset, space);
+             xputenv (concat ("MAKEFLAGS=", dup, NULL));
+           }
+       }
+    }
+}
+
 /* Determine what the exit code of the driver should be.  */
 
 int
index a0a1d94c6e64e70a0fb63286aaa241a4db4ed8e7..dc77dba67fb3aceb8a4afa4230b9b6ce07d27863 100644 (file)
--- a/gcc/gcc.h
+++ b/gcc/gcc.h
@@ -51,6 +51,7 @@ class driver
   void do_spec_on_infiles () const;
   void maybe_run_linker (const char *argv0) const;
   void final_actions () const;
+  void detect_jobserver () const;
   int get_exit_code () const;
 
  private:
index 353187c60434f43a445e708dcfbf53c857f8cdc1..3414adedd26c469c1face0dda6779540c484e4f8 100644 (file)
@@ -1234,7 +1234,7 @@ jobserver_active_p (void)
   int rfd = -1;
   int wfd = -1;
 
-  return ((sscanf(n, "--jobserver-auth=%d,%d", &rfd, &wfd) == 2)
+  return (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
          && rfd > 0
          && wfd > 0
          && fcntl (rfd, F_GETFD) >= 0