aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArsen Arsenović <arsen@aarsen.me>2022-12-09 14:37:14 +0000
committerSam James <sam@gentoo.org>2022-12-17 04:54:04 +0000
commita535dea3848bd10f950f72281bb7d1563586d1d8 (patch)
tree5ad86980950a373c6896e77611fb75e1c27e4041
parent13.1.0: scrub patches (diff)
downloadgcc-patches-a535dea3848bd10f950f72281bb7d1563586d1d8.tar.gz
gcc-patches-a535dea3848bd10f950f72281bb7d1563586d1d8.tar.bz2
gcc-patches-a535dea3848bd10f950f72281bb7d1563586d1d8.zip
10.5.0: backport make 4.4 jobserver fixes
Bug: https://bugs.gentoo.org/884633 Signed-off-by: Arsen Arsenović <arsen@aarsen.me> Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--10.5.0/gentoo/77_all_Factor-out-jobserver_active_p.patch320
-rw-r--r--10.5.0/gentoo/78_all_lto-support-jobserver-style-fifo-for-recent-GNU-make.patch66
-rw-r--r--10.5.0/gentoo/README.history4
3 files changed, 390 insertions, 0 deletions
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ć <arsen@aarsen.me>.
+
+From f8ca9e3ea075f5a3743fc74ae227a361f355c0f0 Mon Sep 17 00:00:00 2001
+From: Martin Liska <mliska@suse.cz>
+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ć <arsen@aarsen.me>.
+
+From ab7a17b024ec3efabb3803e4d1dab461082044a9 Mon Sep 17 00:00:00 2001
+From: Martin Liska <mliska@suse.cz>
+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