]> gcc.gnu.org Git - gcc.git/commitdiff
Make -fwhole-program to work with incremental LTO linking
authorJan Hubicka <jh@suse.cz>
Wed, 21 Dec 2022 11:41:25 +0000 (12:41 +0100)
committerJan Hubicka <jh@suse.cz>
Wed, 21 Dec 2022 11:41:25 +0000 (12:41 +0100)
Update 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.
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  <hubicka@ucw.cz>

* doc/invoke.texi: Fix documentation of -fwhole-program with LTO
and document behaviour for incremental linking.

gcc/lto/ChangeLog:

2022-12-21  Jan Hubicka  <hubicka@ucw.cz>

* 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

gcc/doc/invoke.texi
gcc/lto/lto-common.cc
gcc/lto/lto-lang.cc

index d8a2079760355a27058a30b5e70f486342ed8be8..da9ad1068fbf6427cb94d9baf2c1a9a474af5efc 100644 (file)
@@ -13719,9 +13719,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
index f64309731fa824cd3bdf07d9d7e0302771585e81..125064ba47ec550ade609be6a4d481a7cc64ed7c 100644 (file)
@@ -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;
            }
        }
index d36453ba25dfc77080e0df1c521b80e9807eab9b..7018dfae4a50222a19b587ed9f76663ebb7f65b5 100644 (file)
@@ -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;
 
This page took 0.08622 seconds and 5 git commands to generate.