commit:     a535dea3848bd10f950f72281bb7d1563586d1d8
Author:     Arsen Arsenović <arsen <AT> aarsen <DOT> me>
AuthorDate: Fri Dec  9 14:37:14 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sat Dec 17 04:54:04 2022 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=a535dea3

10.5.0: backport make 4.4 jobserver fixes

Bug: https://bugs.gentoo.org/884633
Signed-off-by: Arsen Arsenović <arsen <AT> aarsen.me>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 .../77_all_Factor-out-jobserver_active_p.patch     | 320 +++++++++++++++++++++
 ...-jobserver-style-fifo-for-recent-GNU-make.patch |  66 +++++
 10.5.0/gentoo/README.history                       |   4 +
 3 files changed, 390 insertions(+)

diff --git a/10.5.0/gentoo/77_all_Factor-out-jobserver_active_p.patch 
b/10.5.0/gentoo/77_all_Factor-out-jobserver_active_p.patch
new file mode 100644
index 0000000..5658a1b
--- /dev/null
+++ b/10.5.0/gentoo/77_all_Factor-out-jobserver_active_p.patch
@@ -0,0 +1,320 @@
+https://bugs.gentoo.org/884633
+
+https://build.opensuse.org/package/view_file/devel:gcc/gcc12/gcc12-fifo-jobserver-support.patch
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1270ccda70ca09f7d4fe76b5156dca8992bd77a6
+
+Rebased by Arsen Arsenović <[email protected]>.
+
+From f8ca9e3ea075f5a3743fc74ae227a361f355c0f0 Mon Sep 17 00:00:00 2001
+From: Martin Liska <[email protected]>
+Date: Tue, 9 Aug 2022 13:59:32 +0200
+Subject: [PATCH 1/2] Factor out jobserver_active_p.
+
+gcc/ChangeLog:
+
+       * gcc.cc (driver::detect_jobserver): Remove and move to
+       jobserver.h.
+       * lto-wrapper.cc (jobserver_active_p): Likewise.
+       (run_gcc): Likewise.
+       * opts-jobserver.h: New file.
+       * opts-common.cc (jobserver_info::jobserver_info): New function.
+--- a/gcc/gcc.c
++++ b/gcc/gcc.c
+@@ -27,6 +27,7 @@ CC recognizes how to compile each input file by suffixes in 
the file names.
+ Once it knows which kind of compilation to perform, the procedure for
+ compilation is specified by a string called a "spec".  */
+ 
++#define INCLUDE_STRING
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+@@ -43,6 +44,7 @@ compilation is specified by a string called a "spec".  */
+ #include "opts.h"
+ #include "filenames.h"
+ #include "spellcheck.h"
++#include "opts-jobserver.h"
+ 
+ 
+ 
+@@ -8399,38 +8401,9 @@ driver::final_actions () const
+ 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
+-             && is_valid_fd (rfd)
+-             && is_valid_fd (wfd));
+-
+-        /* 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));
+-          }
+-      }
+-    }
++  jobserver_info jinfo;
++  if (!jinfo.is_active && !jinfo.skipped_makeflags.empty ())
++    xputenv (jinfo.skipped_makeflags.c_str ());
+ }
+ 
+ /* Determine what the exit code of the driver should be.  */
+--- a/gcc/lto-wrapper.c
++++ b/gcc/lto-wrapper.c
+@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3.  If not see
+    ./ccCJuXGv.lto.ltrans.o
+ */
+ 
++#define INCLUDE_STRING
+ #include "config.h"
+ #include "system.h"
+ #include "coretypes.h"
+@@ -48,6 +49,8 @@ along with GCC; see the file COPYING3.  If not see
+ #include "simple-object.h"
+ #include "lto-section-names.h"
+ #include "collect-utils.h"
++#include "opts-diagnostic.h"
++#include "opts-jobserver.h"
+ 
+ /* Environment variable, used for passing the names of offload targets from 
GCC
+    driver to lto-wrapper.  */
+@@ -1295,32 +1298,43 @@ init_num_threads (void)
+ #endif
+ }
+ 
+-/* FIXME: once using -std=c++11, we can use 
std::thread::hardware_concurrency.  */
+-
+-/* Return true when a jobserver is running and can accept a job.  */
+-
+-static bool
+-jobserver_active_p (void)
++void
++print_lto_docs_link ()
+ {
+-  const char *makeflags = getenv ("MAKEFLAGS");
+-  if (makeflags == NULL)
+-    return false;
++  bool print_url = global_dc->printer->url_format != URL_FORMAT_NONE;
++  const char *url = global_dc->get_option_url (global_dc, OPT_flto);
+ 
+-  const char *needle = "--jobserver-auth=";
+-  const char *n = strstr (makeflags, needle);
+-  if (n == NULL)
+-    return false;
+-
+-  int rfd = -1;
+-  int wfd = -1;
+-
+-  return (sscanf (n + strlen (needle), "%d,%d", &rfd, &wfd) == 2
+-        && rfd > 0
+-        && wfd > 0
+-        && is_valid_fd (rfd)
+-        && is_valid_fd (wfd));
++  pretty_printer pp;
++  pp.url_format = URL_FORMAT_DEFAULT;
++  pp_string (&pp, "see the ");
++  if (print_url)
++    pp_begin_url (&pp, url);
++  pp_string (&pp, "%<-flto%> option documentation");
++  if (print_url)
++    pp_end_url (&pp);
++  pp_string (&pp, " for more information");
++  inform (UNKNOWN_LOCATION, pp_formatted_text (&pp));
+ }
+ 
++/* Test that a make command is present and working, return true if so.  */
++
++static bool
++make_exists (void)
++{
++  const char *make = "make";
++  char **make_argv = buildargv (getenv ("MAKE"));
++  if (make_argv)
++    make = make_argv[0];
++  const char *make_args[] = {make, "--version", NULL};
++
++  int exit_status = 0;
++  int err = 0;
++  const char *errmsg
++    = pex_one (PEX_SEARCH, make_args[0], CONST_CAST (char **, make_args),
++             "make", NULL, NULL, &exit_status, &err);
++  freeargv (make_argv);
++  return errmsg == NULL && exit_status == 0 && err == 0;
++}
+ /* Execute gcc. ARGC is the number of arguments. ARGV contains the arguments. 
*/
+ 
+ static void
+@@ -1535,10 +1549,20 @@ run_gcc (unsigned argc, char *argv[])
+       auto_parallel = 0;
+       parallel = 0;
+     }
+-  else if (!jobserver && jobserver_active_p ())
++  else
+     {
+-      parallel = 1;
+-      jobserver = 1;
++      jobserver_info jinfo;
++      if (jobserver && !jinfo.is_active)
++      {
++        /* Fall back to auto parallelism.  */
++        jobserver = 0;
++        auto_parallel = 1;
++      }
++      else if (!jobserver && jinfo.is_active)
++      {
++        parallel = 1;
++        jobserver = 1;
++      }
+     }
+ 
+   if (linker_output)
+@@ -1861,6 +1885,20 @@ cont:
+       maybe_unlink (ltrans_output_file);
+       ltrans_output_file = NULL;
+ 
++      if (nr > 1)
++      {
++        if (jobserver_requested && !jinfo.is_active)
++          {
++            warning (0, jinfo.error_msg.c_str ());
++            print_lto_docs_link ();
++          }
++        else if (parallel == 0)
++          {
++            warning (0, "using serial compilation of %d LTRANS jobs", nr);
++            print_lto_docs_link ();
++          }
++      }
++
+       if (parallel)
+       {
+         makefile = make_temp_file (".mk");
+--- a/gcc/opts-common.c
++++ b/gcc/opts-common.c
+@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public 
License
+ along with GCC; see the file COPYING3.  If not see
+ <http://www.gnu.org/licenses/>.  */
+ 
++#define INCLUDE_STRING
+ #include "config.h"
+ #include "system.h"
+ #include "intl.h"
+@@ -25,6 +26,7 @@ along with GCC; see the file COPYING3.  If not see
+ #include "options.h"
+ #include "diagnostic.h"
+ #include "spellcheck.h"
++#include "opts-jobserver.h"
+ 
+ static void prune_options (struct cl_decoded_option **, unsigned int *);
+ 
+@@ -1805,3 +1807,42 @@ void prepend_xassembler_to_collect_as_options (const 
char *collect_as_options,
+       obstack_1grow (o, '\'');
+     }
+ }
++
++jobserver_info::jobserver_info ()
++{
++  /* Detect jobserver and drop it if it's not working.  */
++  string js_needle = "--jobserver-auth=";
++
++  const char *envval = getenv ("MAKEFLAGS");
++  if (envval != NULL)
++    {
++      string makeflags = envval;
++      size_t n = makeflags.rfind (js_needle);
++      if (n != string::npos)
++      {
++        if (sscanf (makeflags.c_str () + n + js_needle.size (),
++                    "%d,%d", &rfd, &wfd) == 2
++            && rfd > 0
++            && wfd > 0
++            && is_valid_fd (rfd)
++            && is_valid_fd (wfd))
++          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;
++            error_msg
++              = "cannot access %<" + js_needle + "%> file descriptors";
++          }
++      }
++      error_msg = "%<" + js_needle + "%> is not present in %<MAKEFLAGS%>";
++    }
++  else
++    error_msg = "%<MAKEFLAGS%> environment variable is unset";
++
++  if (!error_msg.empty ())
++    error_msg = "jobserver is not available: " + error_msg;
++}
+--- /dev/null
++++ b/gcc/opts-jobserver.h
+@@ -0,0 +1,44 @@
++/* GNU make's jobserver related functionality.
++   Copyright (C) 2022 Free Software Foundation, Inc.
++
++This file is part of GCC.
++
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 3, or (at your option) any later
++version.
++
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3.  If not see
++<http://www.gnu.org/licenses/>.
++
++See dbgcnt.def for usage information.  */
++
++#ifndef GCC_JOBSERVER_H
++#define GCC_JOBSERVER_H
++
++using namespace std;
++
++struct jobserver_info
++{
++  /* Default constructor.  */
++  jobserver_info ();
++
++  /* Error message if there is a problem.  */
++  string error_msg = "";
++  /* Skipped MAKEFLAGS where --jobserver-auth is skipped.  */
++  string skipped_makeflags = "";
++  /* File descriptor for reading used for jobserver communication.  */
++  int rfd = -1;
++  /* File descriptor for writing used for jobserver communication.  */
++  int wfd = -1;
++  /* Return true if jobserver is active.  */
++  bool is_active = false;
++};
++
++#endif /* GCC_JOBSERVER_H */
+-- 
+2.38.1

diff --git 
a/10.5.0/gentoo/78_all_lto-support-jobserver-style-fifo-for-recent-GNU-make.patch
 
b/10.5.0/gentoo/78_all_lto-support-jobserver-style-fifo-for-recent-GNU-make.patch
new file mode 100644
index 0000000..5d50461
--- /dev/null
+++ 
b/10.5.0/gentoo/78_all_lto-support-jobserver-style-fifo-for-recent-GNU-make.patch
@@ -0,0 +1,66 @@
+https://bugs.gentoo.org/884633
+
+https://build.opensuse.org/package/view_file/devel:gcc/gcc12/gcc12-fifo-jobserver-support.patch
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=53e3b2bf16a486c15c20991c6095f7be09012b55
+
+Rebased by Arsen Arsenović <[email protected]>.
+
+From ab7a17b024ec3efabb3803e4d1dab461082044a9 Mon Sep 17 00:00:00 2001
+From: Martin Liska <[email protected]>
+Date: Tue, 9 Aug 2022 13:59:36 +0200
+Subject: [PATCH 2/2] lto: support --jobserver-style=fifo for recent GNU make
+
+gcc/ChangeLog:
+
+       * opts-jobserver.h: Add one member.
+       * opts-common.cc (jobserver_info::jobserver_info): Parse FIFO
+       format of --jobserver-auth.
+--- a/gcc/opts-common.c
++++ b/gcc/opts-common.c
+@@ -1810,8 +1810,14 @@ void prepend_xassembler_to_collect_as_options (const 
char *collect_as_options,
+ 
+ jobserver_info::jobserver_info ()
+ {
++  /* Traditionally, GNU make uses opened pipes for jobserver-auth,
++    e.g. --jobserver-auth=3,4.
++    Starting with GNU make 4.4, one can use --jobserver-style=fifo
++    and then named pipe is used: --jobserver-auth=fifo:/tmp/hcsparta.  */
++
+   /* Detect jobserver and drop it if it's not working.  */
+   string js_needle = "--jobserver-auth=";
++  string fifo_prefix = "fifo:";
+ 
+   const char *envval = getenv ("MAKEFLAGS");
+   if (envval != NULL)
+@@ -1820,8 +1826,15 @@ jobserver_info::jobserver_info ()
+       size_t n = makeflags.rfind (js_needle);
+       if (n != string::npos)
+       {
+-        if (sscanf (makeflags.c_str () + n + js_needle.size (),
+-                    "%d,%d", &rfd, &wfd) == 2
++        string ending = makeflags.substr (n + js_needle.size ());
++        if (ending.find (fifo_prefix) == 0)
++          {
++            ending = ending.substr (fifo_prefix.size ());
++            pipe_path = ending.substr (0, ending.find (' '));
++            is_active = true;
++          }
++        else if (sscanf (makeflags.c_str () + n + js_needle.size (),
++                         "%d,%d", &rfd, &wfd) == 2
+             && rfd > 0
+             && wfd > 0
+             && is_valid_fd (rfd)
+--- a/gcc/opts-jobserver.h
++++ b/gcc/opts-jobserver.h
+@@ -37,6 +37,8 @@ struct jobserver_info
+   int rfd = -1;
+   /* File descriptor for writing used for jobserver communication.  */
+   int wfd = -1;
++  /* Named pipe path.  */
++  string pipe_path = "";
+   /* Return true if jobserver is active.  */
+   bool is_active = false;
+ };
+-- 
+2.38.1
+

diff --git a/10.5.0/gentoo/README.history b/10.5.0/gentoo/README.history
index 41e961c..6d8c5c2 100644
--- a/10.5.0/gentoo/README.history
+++ b/10.5.0/gentoo/README.history
@@ -1,3 +1,7 @@
+2              9 Dec 2022
+       + 77_all_Factor-out-jobserver_active_p.patch
+       + 78_all_lto-support-jobserver-style-fifo-for-recent-GNU-make.patch
+
 1              19 Nov 2022
        + 76_all_configure-c89.patch
 

Reply via email to