From patchwork Tue Aug 17 07:00:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 61861 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id CBA76B70AF for ; Tue, 17 Aug 2010 17:01:03 +1000 (EST) Received: (qmail 17112 invoked by alias); 17 Aug 2010 07:01:01 -0000 Received: (qmail 17092 invoked by uid 22791); 17 Aug 2010 07:00:59 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL, BAYES_00, TW_FW, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from one.firstfloor.org (HELO one.firstfloor.org) (213.235.205.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 17 Aug 2010 07:00:52 +0000 Received: from basil.firstfloor.org (p5B3C967A.dip0.t-ipconnect.de [91.60.150.122]) by one.firstfloor.org (Postfix) with ESMTP id 98EB11A98058; Tue, 17 Aug 2010 09:00:48 +0200 (CEST) Received: by basil.firstfloor.org (Postfix, from userid 1000) id 33462B155F; Tue, 17 Aug 2010 09:00:48 +0200 (CEST) From: Andi Kleen To: gcc-patches@gcc.gnu.org Cc: Andi Kleen Subject: [PATCH 2/2] -fwhopr=jobserver Date: Tue, 17 Aug 2010 09:00:46 +0200 Message-Id: <1282028446-19874-2-git-send-email-andi@firstfloor.org> In-Reply-To: <1282028446-19874-1-git-send-email-andi@firstfloor.org> References: <1282028446-19874-1-git-send-email-andi@firstfloor.org> Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org From: Andi Kleen This patch adds a new -fwhopr=jobserver mode. This is useful in parallel builds to let the submake started by lto-driver communicate with the parent make that controls the whole build to control the number of parallel jobs. Currently -fwhopr=N does not pass through the jobserver options because it cannot guarantee that the submake is GNU make. With -fwhopr=jobserver the user specifies this explicitely, so it's safe to do. Based on discussions with Richard Guenther. Passed normal boot strap and testing on x86-64 and a full LTO bootstrap with -fwhopr=jobserver and a parallel build, on x86-64-linux. Ok to commit? -Andi 2010-08-17 Andi Kleen * common.opt (fwhopr=): Update for -fwhopr=jobserver * doc/invoke.text (fwhopr): Document -fwhopr=jobserver. * lto-wrapper.c (run_gcc): Add jobserver mode. * opts.c (common_handle_option): Fix OPT_fwhopr for non numeric argument. --- gcc/common.opt | 4 ++-- gcc/doc/invoke.texi | 7 +++++++ gcc/lto-wrapper.c | 38 ++++++++++++++++++++++++++++---------- gcc/opts.c | 2 +- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index 1285ff0..1e753c9 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1516,8 +1516,8 @@ Common Enable partitioned link-time optimization fwhopr= -Common RejectNegative UInteger Joined Var(flag_whopr) -Enable partitioned link-time optimization with specified number of parallel jobs +Common RejectNegative Joined Var(flag_whopr) +Partitioned link-time optimization with number of parallel jobs or jobserver. ftree-builtin-call-dce Common Report Var(flag_tree_builtin_call_dce) Init(0) Optimization diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 6099b30..2c6e66a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -7556,6 +7556,13 @@ parallel using @var{n} parallel jobs by utilizing an installed @command{make} program. The environment variable @env{MAKE} may be used to override the program used. +You can also specify @option{-fwhopr=jobserver} to use GNU make's +job server mode to determine the number of parallel jobs. This +is useful when the Makefile calling gcc is already parallel. +The parent Makefile will need a '+' prepended to the command recipe +for this to work. This will likely only work if @env{MAKE} is +GNU make. + Disabled by default. @item -fwpa diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index da120b3..d0f1256 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -303,6 +303,7 @@ run_gcc (unsigned argc, char *argv[]) struct obstack env_obstack; bool seen_o = false; int parallel = 0; + int jobserver = 0; /* Get the driver and options. */ collect_gcc = getenv ("COLLECT_GCC"); @@ -373,9 +374,17 @@ run_gcc (unsigned argc, char *argv[]) lto_mode = LTO_MODE_WHOPR; if (option[7] == '=') { - parallel = atoi (option+8); - if (parallel <= 1) - parallel = 0; + if (!strcmp (option + 8, "jobserver")) + { + jobserver = 1; + parallel = 1; + } + else + { + parallel = atoi (option+8); + if (parallel <= 1) + parallel = 0; + } } } else @@ -567,23 +576,32 @@ cont: { struct pex_obj *pex; char jobs[32]; + fprintf (mstream, "all:"); for (i = 0; i < nr; ++i) fprintf (mstream, " \\\n\t%s", output_names[i]); fprintf (mstream, "\n"); fclose (mstream); - /* Avoid passing --jobserver-fd= and similar flags. */ - putenv (xstrdup ("MAKEFLAGS=")); - putenv (xstrdup ("MFLAGS=")); + if (!jobserver) + { + /* Avoid passing --jobserver-fd= and similar flags + unless jobserver mode is explicitely enabled.*/ + putenv (xstrdup ("MAKEFLAGS=")); + putenv (xstrdup ("MFLAGS=")); + } new_argv[0] = getenv ("MAKE"); if (!new_argv[0]) new_argv[0] = "make"; new_argv[1] = "-f"; new_argv[2] = makefile; - snprintf (jobs, 31, "-j%d", parallel); - new_argv[3] = jobs; - new_argv[4] = "all"; - new_argv[5] = NULL; + i = 3; + if (!jobserver) + { + snprintf (jobs, 31, "-j%d", parallel); + new_argv[i++] = jobs; + } + new_argv[i++] = "all"; + new_argv[i++] = NULL; pex = collect_execute (CONST_CAST (char **, new_argv)); collect_wait (new_argv[0], pex); maybe_unlink_file (makefile); diff --git a/gcc/opts.c b/gcc/opts.c index 6e52805..399bd4a 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2077,7 +2077,7 @@ common_handle_option (const struct cl_decoded_option *decoded, break; case OPT_fwhopr: - flag_whopr = value; + flag_whopr = arg; break; case OPT_w: