From patchwork Thu Jun 17 19:18:01 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Oliva X-Patchwork-Id: 56086 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 C4521B7D8B for ; Fri, 18 Jun 2010 05:18:16 +1000 (EST) Received: (qmail 13468 invoked by alias); 17 Jun 2010 19:18:15 -0000 Received: (qmail 13449 invoked by uid 22791); 17 Jun 2010 19:18:13 -0000 X-SWARE-Spam-Status: No, hits=-4.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, TW_BJ, TW_JC, T_RP_MATCHES_RCVD, T_TVD_MIME_NO_HEADERS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 17 Jun 2010 19:18:06 +0000 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5HJI5b0019612 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 17 Jun 2010 15:18:05 -0400 Received: from localhost.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o5HJI3Uc003476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 17 Jun 2010 15:18:05 -0400 Received: from livre.localdomain (livre.oliva.athome.lsd.ic.unicamp.br [172.31.160.2]) by localhost.localdomain (8.14.3/8.14.3) with ESMTP id o5HJI3lk026398 for ; Thu, 17 Jun 2010 16:18:03 -0300 Received: from livre.localdomain (aoliva@localhost [127.0.0.1]) by livre.localdomain (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id o5HJI2XG025843; Thu, 17 Jun 2010 16:18:02 -0300 Received: (from aoliva@localhost) by livre.localdomain (8.14.3/8.14.3/Submit) id o5HJI1YD025841; Thu, 17 Jun 2010 16:18:01 -0300 From: Alexandre Oliva To: gcc-patches@gcc.gnu.org Subject: Making it easy to use -flto for bootstrap Date: Thu, 17 Jun 2010 16:18:01 -0300 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) MIME-Version: 1.0 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 I've been playing with -flto bootstraps. The first problem I ran into was that LTO sections may differ depending on the presence of debug stmts, so compare-debug needed some tweaking. Furthermore, simply adding -flto to BOOT_CFLAGS didn't quite work, because Ada doesn't seem to be ready for LTO. I got a crash during linking and didn't pursue it any further. Adding -fno-lto to BOOT_ADAFLAGS was the work-around I ended up with. To make my partly-automated testing easier, I added bootstrap-lto as a BUILD_CONFIG option. I didn't have much luck with -flto in target libraries (bad relocs creating shared libs on x86_64-linux-gnu IIRC), so I left it out. Was -flto supposed to work for shared libs? I ran into -fcompare-debug failures with -flto on x86_64-linux-gnu, and also with bootstrap-O3 on ia64-lixnu-gnu, but I haven't looked into them yet. This is the patch I'm going to install if there aren't objections within 24 hours or so. for contrib/ChangeLog from Alexandre Oliva * compare-debug: Drop LTO sections. for config/ChangeLog from Alexandre Oliva * bootstrap-lto.mk: New. for gcc/ChangeLog from Alexandre Oliva * doc/install.texi: Document bootstrap-lto. Index: contrib/compare-debug =================================================================== --- contrib/compare-debug.orig 2010-06-16 10:30:16.000000000 -0300 +++ contrib/compare-debug 2010-06-16 10:44:18.000000000 -0300 @@ -100,9 +100,11 @@ else done # If we found .eh_frame in one but not the other, or if we could not - # find a command to tell, try to strip off the .eh_frame section - # from both. - if test "x$cmp1" != "x$cmp2" || test "x$cmd" = "x"; then + # find a command to tell, or if there are LTO sections, try to strip + # off the .eh_frame and LTO sections from both. + if test "x$cmp1" != "x$cmp2" || test "x$cmd" = "x" || + $cmd --section-headers "$1.$suf1" | grep '.gnu.lto_' > /dev/null || + $cmd --section-headers "$2.$suf2" | grep '.gnu.lto_' > /dev/null ; then suf3=$suf1. while test -f "$1.$suf3"; do suf3=$suf3. @@ -115,21 +117,27 @@ else trap 'rm -f "$1.$suf1" "$2.$suf2" "$1.$suf3" "$2.$suf4"' 0 1 2 15 - echo stripping off .eh_frame, then retrying >&2 + echo stripping off .eh_frame and LTO sections, then retrying >&2 + + seclist=".eh_frame .rel.eh_frame .rela.eh_frame" + if test "x$cmd" != "x"; then + seclist="$seclist "`{ $cmd --section-headers "$1.$suf1"; $cmd --section-headers "$2.$suf2"; } | sed -n 's,.* \(\.gnu\.lto_[^ ]*\).*,\1,p' | sort -u` + fi + rsopts=`for sec in $seclist; do echo " --remove-section $sec"; done` if (objcopy -v) 2>&1 | grep ' --remove-section' > /dev/null; then - objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf1" "$1.$suf3" + objcopy $rsopts "$1.$suf1" "$1.$suf3" mv "$1.$suf3" "$1.$suf1" - objcopy --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf2" "$2.$suf4" + objcopy $rsopts "$2.$suf2" "$2.$suf4" mv "$2.$suf4" "$2.$suf2" elif (strip --help) 2>&1 | grep ' --remove-section' > /dev/null; then cp "$1.$suf1" "$1.$suf3" - strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$1.$suf3" + strip $rsopts "$1.$suf3" mv "$1.$suf3" "$1.$suf1" cp "$2.$suf2" "$2.$suf4" - strip --remove-section .eh_frame --remove-section .rel.eh_frame --remove-section .rela.eh_frame "$2.$suf4" + strip $rsopts "$2.$suf4" mv "$2.$suf4" "$2.$suf2" else echo failed to strip off .eh_frame >&2 Index: config/bootstrap-lto.mk =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ config/bootstrap-lto.mk 2010-06-16 16:56:28.000000000 -0300 @@ -0,0 +1,8 @@ +# This option enables LTO for stage2 and stage3. It requires lto to +# be enabled for stage1 with --enable-stage1-languages. + +STAGE2_CFLAGS += -flto +STAGE3_CFLAGS += -flto + +# Ada fails to build with LTO, turn it off for now. +BOOT_ADAFLAGS += -fno-lto Index: gcc/doc/install.texi =================================================================== --- gcc/doc/install.texi.orig 2010-06-16 16:56:26.000000000 -0300 +++ gcc/doc/install.texi 2010-06-16 16:58:10.000000000 -0300 @@ -2150,6 +2150,11 @@ Removes any @option{-O}-started option f @item @samp{bootstrap-O3} Analogous to @code{bootstrap-O1}. +@item @samp{bootstrap-lto} +Enables Link-Time Optimization for host tools during bootstrapping. +@samp{BUILD_CONFIG=bootstrap-lto} is equivalent to adding +@option{-flto} to @samp{BOOT_CFLAGS}. + @item @samp{bootstrap-debug} Verifies that the compiler generates the same executable code, whether or not it is asked to emit debug information. To this end, this