From patchwork Thu Jan 21 16:57:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Matz X-Patchwork-Id: 571255 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 98DC7140B0E for ; Fri, 22 Jan 2016 03:57:19 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=wFlKZMga; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=P7V661jJC0CD49QT8xsL49kZ73Pes2s/gD4QhKI8VhkPX8Sv26jlI e56xs348GKw4OPj1GGhDcCWvfd1s9NTkwsSK32thx7VJM1WkkAEORYdOFyjFgLJg 2dZ8GX8FxjOHx4DGqaC1cEebSNu+vyzjM9IA9W1XYaobCZo6kU9Qfs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=yFtsBiEmSn+r6wAwgaWE3295jsc=; b=wFlKZMga5lk/3j+R+TPb GgBhOPLk7UyOWnOP7B0T9Go3RsI62ni1OgdP5PdJM2T7ScK0cYdwcIwWHww3RStw rnr39RvQfbmnTCx8FSunZnWy+4WQz9S+Ej4oMGlqQqHUyH22Rma6StbfEg3rAdiH iR24tu48gxGlqrsOfx3uidM= Received: (qmail 43736 invoked by alias); 21 Jan 2016 16:57:11 -0000 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 Received: (qmail 43719 invoked by uid 89); 21 Jan 2016 16:57:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.1 required=5.0 tests=BAYES_20, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=straw, 917, 005, ciao X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Thu, 21 Jan 2016 16:57:08 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1408CACA7 for ; Thu, 21 Jan 2016 16:57:03 +0000 (UTC) Date: Thu, 21 Jan 2016 17:57:04 +0100 (CET) From: Michael Matz To: gcc-patches@gcc.gnu.org Subject: Speedup configure and build with system.h Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 X-IsSubscribed: yes Hi, this has bothered me for some time. The gcc configure with stage1 feels like taking forever because some of the decl availability tests (checking for C function) include system.h, and that, since a while, unconditionally includes and under C++, and we meanwhile use the C++ compiler for configure tests (which makes sense). Now, the difference for a debuggable (but not even checking-enabled) cc1plus for a file containing just main(): % cat blaeh.cc #include #include #include #include int main() {} % cc1plus -quiet -ftime-report blaeh.cc TOTAL : 0.12 0.01 0.14 (This is btw. three times as expensive as with 4.8 headers (i.e. precompile with g++-4.8 then compile with the same cc1plus as above, taking 0.04 seconds; the STL headers bloat quite much over time) Well, not quite blazing fast but then adding : % cc1plus -quiet -ftime-report blaeh-string.cc TOTAL : 0.60 0.05 0.66 Meeh. And adding on top: % cc1plus -quiet -ftime-report blaeh-string-alg.cc TOTAL : 1.13 0.09 1.23 So, more than a second for checking if some C-only decl is available, just because system.h unconditionally includes mostly useless STL headers. So, how useless exactly? A whopping single file of cc1 proper needs , _two_ files need , and a single target has an unlucky interface in its prototypes and also needs . (One additional header lazily uses std::string for no particular reason). So we pay about 5 minutes build time per stage (there are ~400 libbackend.a files) for more or less nothing. So, let's include those headers only conditionally; I'm pretty sure it's not unreasonable for a source file, if it needs a particular STL facility to #define USES_abcheader (like one normally would have to #include ) before the "system.h" include. See the patch. I've grepped for target or language dependencies on other STL types, and either they were already including the right header, or were covered with the new system.h (i.e. I've built all targets quickly for which grepping for 'std::' returned anything). The genconditions.c change is for the benefit of aarch64 as well, and it single function aarch64_get_extension_string_for_isa_flags returning a std::string. What do people think? Should I pass it through a proper bootstrap and put it to trunk? It's a (developer time) regression, right? ;-) Ciao, Michael. * system.h (string, algorithm): Include only conditionally. (new): Include always under C++. * bb-reorder.c (toplevel): Define USES_ALGORITHM. * final.c (toplevel): Ditto. * ipa-chkp.c (toplevel): Define USES_STRING. * genconditions.c (write_header): Make gencondmd.c define USES_STRING. * mem-stats.h (mem_usage::print_dash_line): Don't use std::string. * config/aarch64/aarch64.c (toplevel): Define USES_STRING. * common/config/aarch64/aarch64-common.c (toplevel): Ditto. Index: bb-reorder.c =================================================================== --- bb-reorder.c (revision 232675) +++ bb-reorder.c (working copy) @@ -91,6 +91,7 @@ */ #include "config.h" +#define USES_ALGORITHM /* stable_sort */ #include "system.h" #include "coretypes.h" #include "backend.h" Index: final.c =================================================================== --- final.c (revision 232675) +++ final.c (working copy) @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. function_epilogue. Those instructions never exist as rtl. */ #include "config.h" +#define USES_ALGORITHM /* reverse */ #include "system.h" #include "coretypes.h" #include "backend.h" Index: genconditions.c =================================================================== --- genconditions.c (revision 232675) +++ genconditions.c (working copy) @@ -51,6 +51,7 @@ write_header (void) machine description file. */\n\ \n\ #include \"bconfig.h\"\n\ +#define USES_STRING\n\ #include \"system.h\"\n\ \n\ /* It is necessary, but not entirely safe, to include the headers below\n\ Index: ipa-chkp.c =================================================================== --- ipa-chkp.c (revision 232675) +++ ipa-chkp.c (working copy) @@ -19,6 +19,7 @@ along with GCC; see the file COPYING3. . */ #include "config.h" +#define USES_STRING #include "system.h" #include "coretypes.h" #include "backend.h" Index: mem-stats.h =================================================================== --- mem-stats.h (revision 232675) +++ mem-stats.h (working copy) @@ -200,7 +200,9 @@ struct mem_usage static inline void print_dash_line (size_t count = 140) { - fprintf (stderr, "%s\n", std::string (count, '-').c_str ()); + while (count--) + fputc ('-', stderr); + fputc ('\n', stderr); } /* Dump header with NAME. */ Index: system.h =================================================================== --- system.h (revision 232675) +++ system.h (working copy) @@ -198,8 +198,10 @@ extern int fprintf_unlocked (FILE *, con the ctype macros through safe-ctype.h */ #ifdef __cplusplus +#ifdef USES_STRING # include #endif +#endif /* There are an extraordinary number of issues with . The last straw is that it varies with the locale. Use libiberty's @@ -215,8 +217,11 @@ extern int errno; #endif #ifdef __cplusplus +#ifdef USES_ALGORITHM # include +#endif # include +# include # include #endif Index: config/aarch64/aarch64.c =================================================================== --- config/aarch64/aarch64.c (revision 232675) +++ config/aarch64/aarch64.c (working copy) @@ -19,6 +19,7 @@ . */ #include "config.h" +#define USES_STRING #include "system.h" #include "coretypes.h" #include "backend.h" Index: common/config/aarch64/aarch64-common.c =================================================================== --- common/config/aarch64/aarch64-common.c (revision 232675) +++ common/config/aarch64/aarch64-common.c (working copy) @@ -19,6 +19,7 @@ . */ #include "config.h" +#define USES_STRING #include "system.h" #include "coretypes.h" #include "tm.h"