From patchwork Wed Dec 21 11:42:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 1718209 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=orKhaeU+; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NcWm84JYvz1ydb for ; Wed, 21 Dec 2022 22:43:18 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3A7383858436 for ; Wed, 21 Dec 2022 11:43:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3A7383858436 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1671622994; bh=inZ14AN58Jt5+zasbf80LfAxdx99xq3Bqc/MtO+6Vlk=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=orKhaeU+Nnz3ZcrJLpkI6EEgm6hC/6tR3U0CZbAh+FwXYuPtoStXCToLHksMiLSS9 Cj9U+y0W49lyts8IOd9HVw39bkeJOLM2e35hVNemqj+4r64MHZFMX2+WIcmQl5BlQ4 kk1M/PYcgl/EjclC/9aGKYnyNhmp+tcWrD7PHfUY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nikam.ms.mff.cuni.cz (nikam.ms.mff.cuni.cz [195.113.20.16]) by sourceware.org (Postfix) with ESMTPS id A8483385842C for ; Wed, 21 Dec 2022 11:42:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A8483385842C Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 3C7F3280891; Wed, 21 Dec 2022 12:42:53 +0100 (CET) Date: Wed, 21 Dec 2022 12:42:53 +0100 To: gcc-patches@gcc.gnu.org, mliska@suse.cz Subject: Make -fwhole-program to work with incremental LTO linking Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Hubicka via Gcc-patches From: Jan Hubicka Reply-To: Jan Hubicka Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi, this patches updates documentation of -fwhole-program which was wrongly claiming that it is useless with LTO whole it is useful for LTO without plugin and extends -fwhole-program to also work with incremental linking when non-LTO code is produced. This is useful when building kernel where the incremental link is de-facto fina binary and only some explicitly marked symbols needs to remain. Bootstrapped/regtested x86_64-linux, comitted. gcc/ChangeLog: 2022-12-21 Jan Hubicka * doc/invoke.texi: Fix documentation of -fwhole-program with LTO and document behaviour for incremental linking. gcc/lto/ChangeLog: 2022-12-21 Jan Hubicka * lto-common.cc (lto_resolution_read): With incremental linking and whole program ignore turn LDPR_PREVAILING_DEF_IRONLY to LDPR_PREVAILING_DEF_IRONLY_EXP * lto-lang.cc (lto_post_options): Do not clear flag_whole_program for incremental link diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 330da6eb5d4..8c01160e2bb 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -13648,9 +13648,12 @@ compiled. All public functions and variables with the exception of @code{main} and those merged by attribute @code{externally_visible} become static functions and in effect are optimized more aggressively by interprocedural optimizers. -This option should not be used in combination with @option{-flto}. -Instead relying on a linker plugin should provide safer and more precise -information. +With @option{-flto} this option has a limited use. In most cases the +precise list of symbols used or exported from the binary is known the +resolution info passed to the link-time optimizer by the linker plugin. It is +still useful if no linker plugin is used or during incremental link step when +final code is produced (with @option{-flto} +@option{-flinker-output=nolto-rel}). @item -flto[=@var{n}] @opindex flto diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc index f64309731fa..125064ba47e 100644 --- a/gcc/lto/lto-common.cc +++ b/gcc/lto/lto-common.cc @@ -2118,6 +2118,17 @@ lto_resolution_read (splay_tree file_ids, FILE *resolution, lto_file *file) if (strcmp (lto_resolution_str[j], r_str) == 0) { r = (enum ld_plugin_symbol_resolution) j; + /* Incremental linking together with -fwhole-program may seem + somewhat contradictionary (as the point of incremental linking + is to allow re-linking with more symbols later) but it is + used to build LTO kernel. We want to hide all symbols that + are not explicitely marked as exported and thus turn + LDPR_PREVAILING_DEF_IRONLY_EXP + to LDPR_PREVAILING_DEF_IRONLY. */ + if (flag_whole_program + && flag_incremental_link == INCREMENTAL_LINK_NOLTO + && r == LDPR_PREVAILING_DEF_IRONLY_EXP) + r = LDPR_PREVAILING_DEF_IRONLY; break; } } diff --git a/gcc/lto/lto-lang.cc b/gcc/lto/lto-lang.cc index d36453ba25d..7018dfae4a5 100644 --- a/gcc/lto/lto-lang.cc +++ b/gcc/lto/lto-lang.cc @@ -901,7 +901,6 @@ lto_post_options (const char **pfilename ATTRIBUTE_UNUSED) break; case LTO_LINKER_OUTPUT_NOLTOREL: /* .o: incremental link producing asm */ - flag_whole_program = 0; flag_incremental_link = INCREMENTAL_LINK_NOLTO; break;