summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2018-05-30 18:42:41 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2018-05-30 16:42:41 +0000
commit5b42d196248425064ca9013f63510834744e169e (patch)
treeab2fb9dcd8a2e6aacec01cadb11d9ff8a8525399
parent6c363ddd67f5fc1a44d285100560d830ee04f630 (diff)
downloadgcc-5b42d196248425064ca9013f63510834744e169e.tar.gz
passes.c (ipa_write_summaries): Only modify statements if body is in memory.
* passes.c (ipa_write_summaries): Only modify statements if body is in memory. * cgraphunit.c (ipa_passes): Also produce intermeidate code when incrementally linking. (ipa_passes): Likewise. * lto-cgraph.c (lto_output_node): When incrementally linking do not pass down resolution info. * common.opt (flag_incremental_link): Update info. * gcc.c (plugin specs): Turn flinker-output=* to -plugin-opt=-linker-output-known * toplev.c (compile_file): Also cut compilation when doing incremental link. * flag-types. (enum lto_partition_model): Add LTO_LINKER_OUTPUT_NOLTOREL. (invoke.texi): Add -flinker-output docs. * ipa.c (symbol_table::remove_unreachable_nodes): Handle LTO incremental link same way as WPA; do not stream in dead initializers. * dwarf2out.c (dwarf2out_die_ref_for_decl, darf2out_register_external_decl): Support incremental link. * lang.opt (lto_linker_output): Add nolto-rel. * lto-lang.c (lto_post_options): Handle LTO_LINKER_OUTPUT_REL and LTO_LINKER_OUTPUT_NOLTOREL. (lto_init): Generate lto when doing incremental link. * lto.c (lto_precess_name): Add lto1-inclink. * testsuite/g++.dg/lto/20081109-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081118_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081119-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081120-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081120-2_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081123_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081204-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20081219_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20090302_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20090313_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20091002-2_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20091002-3_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20091026-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20100724-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20101010-4_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20101015-2_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/20110311-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr45621_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr48042_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr48354-1_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr54625-1_0.c: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr54625-2_0.c: Add -flinker-output=nolto-rel. * testsuite/g++.dg/lto/pr68811_0.C: Add -flinker-output=nolto-rel. * testsuite/g++.dg/torture/pr43760.C: New test. Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081120-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081120-2_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081126_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081204-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081204-2_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081212-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20081224_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20090116_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20090126-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20090126-2_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20090206-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20090219_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20091013-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20091014-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20091015-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20091016-1_0.c: Add -flinker-output=nolto-rel. * testsuite/gcc.dg/lto/20091020-1_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20091020-2_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20091027-1_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20100426_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20100430-1_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20100603-1_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20100603-2_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20100603-3_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/20111213-1_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr45736_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr52634_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr54702_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr59323-2_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr59323_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr60820_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr81406_0.c: Add -flinker-output-nolto-rel. * testsuite/gcc.dg/lto/pr83388_0.c: Add -flinker-output-nolto-rel. * testsuite/gfortran.dg/lto/20091016-1_0.f90: Add -flinker-output-nolto-rel. * testsuite/gfortran.dg/lto/20091028-1_0.f90: Add -flinker-output-nolto-rel. * testsuite/gfortran.dg/lto/20091028-2_0.f90: Add -flinker-output-nolto-rel. * testsuite/gfortran.dg/lto/pr46911_0.f: Add -flinker-output-nolto-rel. * testsuite/gfortran.dg/lto/pr47839_0.f90: Add -flinker-output-nolto-rel. From-SVN: r260963
-rw-r--r--gcc/ChangeLog23
-rw-r--r--gcc/cgraphunit.c12
-rw-r--r--gcc/common.opt5
-rw-r--r--gcc/dwarf2out.c20
-rw-r--r--gcc/flag-types.h10
-rw-r--r--gcc/gcc.c1
-rw-r--r--gcc/ipa.c15
-rw-r--r--gcc/lto-cgraph.c5
-rw-r--r--gcc/lto/ChangeLog8
-rw-r--r--gcc/lto/lang.opt3
-rw-r--r--gcc/lto/lto-lang.c25
-rw-r--r--gcc/lto/lto.c3
-rw-r--r--gcc/passes.c2
-rw-r--r--gcc/testsuite/ChangeLog65
-rw-r--r--gcc/testsuite/g++.dg/lto/20081109-1_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20081118_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081119-1_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081120-1_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081120-2_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081123_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081204-1_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20081219_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20090302_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20090313_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20091002-2_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20091002-3_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20091026-1_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20100724-1_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20101010-4_0.C1
-rw-r--r--gcc/testsuite/g++.dg/lto/20101015-2_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/20110311-1_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr45621_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr48042_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr48354-1_0.C2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr54625-1_0.c2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr54625-2_0.c2
-rw-r--r--gcc/testsuite/g++.dg/lto/pr68811_0.C2
-rw-r--r--gcc/testsuite/g++.dg/torture/pr85583.C13
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081120-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081120-2_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081126_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081204-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081204-2_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081212-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20081224_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090116_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090126-1_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090126-2_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090206-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20090219_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091013-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091014-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091015-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091016-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091020-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091020-2_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20091027-1_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/20100426_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20100430-1_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/20100603-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20100603-2_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20100603-3_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/20111213-1_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr45736_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr52634_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr54702_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr59323-2_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr59323_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr60820_0.c1
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr81406_0.c2
-rw-r--r--gcc/testsuite/gcc.dg/lto/pr83388_0.c2
-rw-r--r--gcc/testsuite/gfortran.dg/lto/20091016-1_0.f901
-rw-r--r--gcc/testsuite/gfortran.dg/lto/20091028-1_0.f902
-rw-r--r--gcc/testsuite/gfortran.dg/lto/20091028-2_0.f902
-rw-r--r--gcc/testsuite/gfortran.dg/lto/pr46911_0.f2
-rw-r--r--gcc/testsuite/gfortran.dg/lto/pr47839_0.f902
-rw-r--r--gcc/toplev.c3
77 files changed, 250 insertions, 53 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f25b7ef97af..15034d21629 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,28 @@
2018-05-30 Jan Hubicka <hubicka@ucw.cz>
+ * passes.c (ipa_write_summaries): Only modify statements if body
+ is in memory.
+ * cgraphunit.c (ipa_passes): Also produce intermeidate code when
+ incrementally linking.
+ (ipa_passes): Likewise.
+ * lto-cgraph.c (lto_output_node): When incrementally linking do not
+ pass down resolution info.
+ * common.opt (flag_incremental_link): Update info.
+ * gcc.c (plugin specs): Turn flinker-output=* to
+ -plugin-opt=-linker-output-known
+ * toplev.c (compile_file): Also cut compilation when doing incremental
+ link.
+ * flag-types. (enum lto_partition_model): Add
+ LTO_LINKER_OUTPUT_NOLTOREL.
+ (invoke.texi): Add -flinker-output docs.
+ * ipa.c (symbol_table::remove_unreachable_nodes): Handle LTO incremental
+ link same way as WPA; do not stream in dead initializers.
+
+ * dwarf2out.c (dwarf2out_die_ref_for_decl,
+ darf2out_register_external_decl): Support incremental link.
+
+2018-05-30 Jan Hubicka <hubicka@ucw.cz>
+
* lto-opts.c (lto_write_options): Skip OPT_dumpdir, OPT_fresolution_.
2018-05-30 Jan Hubicka <hubicka@ucw.cz>
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 212ee7b8340..b2dafc669dd 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2452,8 +2452,11 @@ ipa_passes (void)
if (flag_generate_lto || flag_generate_offload)
targetm.asm_out.lto_start ();
- if (!in_lto_p)
+ if (!in_lto_p
+ || flag_incremental_link == INCREMENTAL_LINK_LTO)
{
+ if (!quiet_flag)
+ fprintf (stderr, "Streaming LTO\n");
if (g->have_offload)
{
section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
@@ -2472,7 +2475,9 @@ ipa_passes (void)
if (flag_generate_lto || flag_generate_offload)
targetm.asm_out.lto_end ();
- if (!flag_ltrans && (in_lto_p || !flag_lto || flag_fat_lto_objects))
+ if (!flag_ltrans
+ && ((in_lto_p && flag_incremental_link != INCREMENTAL_LINK_LTO)
+ || !flag_lto || flag_fat_lto_objects))
execute_ipa_pass_list (passes->all_regular_ipa_passes);
invoke_plugin_callbacks (PLUGIN_ALL_IPA_PASSES_END, NULL);
@@ -2559,7 +2564,8 @@ symbol_table::compile (void)
/* Do nothing else if any IPA pass found errors or if we are just streaming LTO. */
if (seen_error ()
- || (!in_lto_p && flag_lto && !flag_fat_lto_objects))
+ || ((!in_lto_p || flag_incremental_link == INCREMENTAL_LINK_LTO)
+ && flag_lto && !flag_fat_lto_objects))
{
timevar_pop (TV_CGRAPHOPT);
return;
diff --git a/gcc/common.opt b/gcc/common.opt
index 13ab5c65d43..4aebcaf0656 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -48,9 +48,10 @@ bool in_lto_p = false
; This variable is set to non-0 only by LTO front-end. 1 indicates that
; the output produced will be used for incrmeental linking (thus weak symbols
-; can still be bound).
+; can still be bound) and 2 indicates that the IL is going to be linked and
+; and output to LTO object file.
Variable
-int flag_incremental_link = 0
+enum incremental_link flag_incremental_link = INCREMENTAL_LINK_NONE
; 0 means straightforward implementation of complex divide acceptable.
; 1 means wide ranges of inputs must work for complex divide.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index c05bfe43c44..3a24225690d 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -5860,7 +5860,8 @@ dwarf2out_die_ref_for_decl (tree decl, const char **sym,
{
dw_die_ref die;
- if (flag_wpa && !decl_die_table)
+ if ((flag_wpa || flag_incremental_link == INCREMENTAL_LINK_LTO)
+ && !decl_die_table)
return false;
if (TREE_CODE (decl) == BLOCK)
@@ -5870,10 +5871,11 @@ dwarf2out_die_ref_for_decl (tree decl, const char **sym,
if (!die)
return false;
- /* During WPA stage we currently use DIEs to store the
- decl <-> label + offset map. That's quite inefficient but it
- works for now. */
- if (flag_wpa)
+ /* During WPA stage and incremental linking we currently use DIEs
+ to store the decl <-> label + offset map. That's quite inefficient
+ but it works for now. */
+ if (flag_wpa
+ || flag_incremental_link == INCREMENTAL_LINK_LTO)
{
dw_die_ref ref = get_AT_ref (die, DW_AT_abstract_origin);
if (!ref)
@@ -5924,7 +5926,8 @@ dwarf2out_register_external_die (tree decl, const char *sym,
if (debug_info_level == DINFO_LEVEL_NONE)
return;
- if (flag_wpa && !decl_die_table)
+ if ((flag_wpa
+ || flag_incremental_link == INCREMENTAL_LINK_LTO) && !decl_die_table)
decl_die_table = hash_table<decl_die_hasher>::create_ggc (1000);
dw_die_ref die
@@ -5959,7 +5962,8 @@ dwarf2out_register_external_die (tree decl, const char *sym,
parent = BLOCK_DIE (ctx);
else if (TREE_CODE (ctx) == TRANSLATION_UNIT_DECL
/* Keep the 1:1 association during WPA. */
- && !flag_wpa)
+ && !flag_wpa
+ && flag_incremental_link != INCREMENTAL_LINK_LTO)
/* Otherwise all late annotations go to the main CU which
imports the original CUs. */
parent = comp_unit_die ();
@@ -5980,7 +5984,7 @@ dwarf2out_register_external_die (tree decl, const char *sym,
switch (TREE_CODE (decl))
{
case TRANSLATION_UNIT_DECL:
- if (! flag_wpa)
+ if (! flag_wpa && flag_incremental_link != INCREMENTAL_LINK_LTO)
{
die = comp_unit_die ();
dw_die_ref import = new_die (DW_TAG_imported_unit, die, NULL_TREE);
diff --git a/gcc/flag-types.h b/gcc/flag-types.h
index 7f79da79db0..500f6638f36 100644
--- a/gcc/flag-types.h
+++ b/gcc/flag-types.h
@@ -261,6 +261,15 @@ enum sanitize_code {
| SANITIZE_BOUNDS_STRICT
};
+/* Settings of flag_incremental_link. */
+enum incremental_link {
+ INCREMENTAL_LINK_NONE,
+ /* Do incremental linking and produce binary. */
+ INCREMENTAL_LINK_NOLTO,
+ /* Do incremental linking and produce IL. */
+ INCREMENTAL_LINK_LTO
+};
+
/* Different trace modes. */
enum sanitize_coverage_code {
/* Trace PC. */
@@ -289,6 +298,7 @@ enum lto_partition_model {
enum lto_linker_output {
LTO_LINKER_OUTPUT_UNKNOWN,
LTO_LINKER_OUTPUT_REL,
+ LTO_LINKER_OUTPUT_NOLTOREL,
LTO_LINKER_OUTPUT_DYN,
LTO_LINKER_OUTPUT_PIE,
LTO_LINKER_OUTPUT_EXEC
diff --git a/gcc/gcc.c b/gcc/gcc.c
index a716f708259..2c597ec086a 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -961,6 +961,7 @@ proper position among the other output files. */
-plugin %(linker_plugin_file) \
-plugin-opt=%(lto_wrapper) \
-plugin-opt=-fresolution=%u.res \
+ %{flinker-output=*:-plugin-opt=-linker-output-known} \
%{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}} \
}" PLUGIN_COND_CLOSE
#else
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 9330de59c72..634c69c2b5c 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -130,9 +130,11 @@ process_references (symtab_node *snode,
constant folding. Keep references alive so partitioning
knows about potential references. */
|| (VAR_P (node->decl)
- && flag_wpa
- && ctor_for_folding (node->decl)
- != error_mark_node))))
+ && (flag_wpa
+ || flag_incremental_link
+ == INCREMENTAL_LINK_LTO)
+ && dyn_cast <varpool_node *> (node)
+ ->ctor_useable_for_folding_p ()))))
{
/* Be sure that we will not optimize out alias target
body. */
@@ -622,7 +624,7 @@ symbol_table::remove_unreachable_nodes (FILE *file)
fprintf (file, " %s", vnode->dump_name ());
vnext = next_variable (vnode);
/* Signal removal to the debug machinery. */
- if (! flag_wpa)
+ if (! flag_wpa || flag_incremental_link == INCREMENTAL_LINK_LTO)
{
vnode->definition = false;
(*debug_hooks->late_global_decl) (vnode->decl);
@@ -640,8 +642,9 @@ symbol_table::remove_unreachable_nodes (FILE *file)
changed = true;
}
/* Keep body if it may be useful for constant folding. */
- if ((init = ctor_for_folding (vnode->decl)) == error_mark_node
- && !POINTER_BOUNDS_P (vnode->decl))
+ if ((flag_wpa || flag_incremental_link == INCREMENTAL_LINK_LTO)
+ || ((init = ctor_for_folding (vnode->decl)) == error_mark_node
+ && !POINTER_BOUNDS_P (vnode->decl)))
vnode->remove_initializer ();
else
DECL_INITIAL (vnode->decl) = init;
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 40baf858ca5..b23d1890fc0 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -540,7 +540,10 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
bp_pack_value (&bp, node->thunk.thunk_p, 1);
bp_pack_value (&bp, node->parallelized_function, 1);
bp_pack_enum (&bp, ld_plugin_symbol_resolution,
- LDPR_NUM_KNOWN, node->resolution);
+ LDPR_NUM_KNOWN,
+ /* When doing incremental link, we will get new resolution
+ info next time we process the file. */
+ flag_incremental_link ? LDPR_UNKNOWN : node->resolution);
bp_pack_value (&bp, node->instrumentation_clone, 1);
bp_pack_value (&bp, node->split_part, 1);
streamer_write_bitpack (&bp);
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index cd976fa66bb..5e1e0a9d8ee 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,11 @@
+2018-05-30 Jan Hubicka <hubicka@ucw.cz>
+
+ * lang.opt (lto_linker_output): Add nolto-rel.
+ * lto-lang.c (lto_post_options): Handle LTO_LINKER_OUTPUT_REL
+ and LTO_LINKER_OUTPUT_NOLTOREL.
+ (lto_init): Generate lto when doing incremental link.
+ * lto.c (lto_precess_name): Add lto1-inclink.
+
2018-05-18 Jan Hubicka <jh@suse.cz>
PR lto/85583
diff --git a/gcc/lto/lang.opt b/gcc/lto/lang.opt
index 0a408d30ce2..1d280a8e97d 100644
--- a/gcc/lto/lang.opt
+++ b/gcc/lto/lang.opt
@@ -34,6 +34,9 @@ EnumValue
Enum(lto_linker_output) String(rel) Value(LTO_LINKER_OUTPUT_REL)
EnumValue
+Enum(lto_linker_output) String(nolto-rel) Value(LTO_LINKER_OUTPUT_NOLTOREL)
+
+EnumValue
Enum(lto_linker_output) String(dyn) Value(LTO_LINKER_OUTPUT_DYN)
EnumValue
diff --git a/gcc/lto/lto-lang.c b/gcc/lto/lto-lang.c
index a310d699a19..1a70f4f1eec 100644
--- a/gcc/lto/lto-lang.c
+++ b/gcc/lto/lto-lang.c
@@ -879,8 +879,28 @@ lto_post_options (const char **pfilename ATTRIBUTE_UNUSED)
switch (flag_lto_linker_output)
{
case LTO_LINKER_OUTPUT_REL: /* .o: incremental link producing LTO IL */
+ /* Configure compiler same way as normal frontend would do with -flto:
+ this way we read the trees (declarations & types), symbol table,
+ optimization summaries and link them. Subsequently we output new LTO
+ file. */
+ flag_lto = "";
+ flag_incremental_link = INCREMENTAL_LINK_LTO;
flag_whole_program = 0;
- flag_incremental_link = 1;
+ flag_wpa = 0;
+ flag_generate_lto = 1;
+ /* It would be cool to produce .o file directly, but our current
+ simple objects does not contain the lto symbol markers. Go the slow
+ way through the asm file. */
+ lang_hooks.lto.begin_section = lhd_begin_section;
+ lang_hooks.lto.append_data = lhd_append_data;
+ lang_hooks.lto.end_section = lhd_end_section;
+ if (flag_ltrans)
+ error ("-flinker-output=rel and -fltrans are mutually exclussive");
+ break;
+
+ case LTO_LINKER_OUTPUT_NOLTOREL: /* .o: incremental link producing asm */
+ flag_whole_program = 0;
+ flag_incremental_link = INCREMENTAL_LINK_NOLTO;
break;
case LTO_LINKER_OUTPUT_DYN: /* .so: PID library */
@@ -1269,7 +1289,8 @@ lto_init (void)
in_lto_p = true;
/* We need to generate LTO if running in WPA mode. */
- flag_generate_lto = (flag_wpa != NULL);
+ flag_generate_lto = (flag_incremental_link == INCREMENTAL_LINK_LTO
+ || flag_wpa != NULL);
/* Create the basic integer types. */
build_common_tree_nodes (flag_signed_char);
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index d2ccaf67689..86f3fe49a68 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -3257,7 +3257,8 @@ static void
lto_process_name (void)
{
if (flag_lto)
- setproctitle ("lto1-lto");
+ setproctitle (flag_incremental_link == INCREMENTAL_LINK_LTO
+ ? "lto1-inclink" : "lto1-lto");
if (flag_wpa)
setproctitle ("lto1-wpa");
if (flag_ltrans)
diff --git a/gcc/passes.c b/gcc/passes.c
index ad0a912e134..2c711f0c0b0 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2708,7 +2708,7 @@ ipa_write_summaries (void)
{
struct cgraph_node *node = order[i];
- if (node->has_gimple_body_p ())
+ if (gimple_has_body_p (node->decl))
{
/* When streaming out references to statements as part of some IPA
pass summary, the statements need to have uids assigned and the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ae89ac891c7..1d2af0a36bb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,68 @@
+2018-05-30 Jan Hubicka <hubicka@ucw.cz>
+
+ * testsuite/g++.dg/lto/20081109-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081118_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081119-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081120-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081120-2_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081123_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081204-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20081219_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20090302_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20090313_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20091002-2_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20091002-3_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20091026-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20100724-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20101010-4_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20101015-2_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/20110311-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr45621_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr48042_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr48354-1_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr54625-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr54625-2_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/lto/pr68811_0.C: Add -flinker-output=nolto-rel.
+ * testsuite/g++.dg/torture/pr43760.C: New test. Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081120-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081120-2_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081126_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081204-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081204-2_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081212-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20081224_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20090116_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20090126-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20090126-2_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20090206-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20090219_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20091013-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20091014-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20091015-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20091016-1_0.c: Add -flinker-output=nolto-rel.
+ * testsuite/gcc.dg/lto/20091020-1_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20091020-2_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20091027-1_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20100426_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20100430-1_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20100603-1_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20100603-2_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20100603-3_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/20111213-1_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr45736_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr52634_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr54702_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr59323-2_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr59323_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr60820_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr81406_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gcc.dg/lto/pr83388_0.c: Add -flinker-output-nolto-rel.
+ * testsuite/gfortran.dg/lto/20091016-1_0.f90: Add -flinker-output-nolto-rel.
+ * testsuite/gfortran.dg/lto/20091028-1_0.f90: Add -flinker-output-nolto-rel.
+ * testsuite/gfortran.dg/lto/20091028-2_0.f90: Add -flinker-output-nolto-rel.
+ * testsuite/gfortran.dg/lto/pr46911_0.f: Add -flinker-output-nolto-rel.
+ * testsuite/gfortran.dg/lto/pr47839_0.f90: Add -flinker-output-nolto-rel.
+
2018-05-30 Andre Vieira <andre.simoesdiasvieira@arm.com>
Revert:
diff --git a/gcc/testsuite/g++.dg/lto/20081109-1_0.C b/gcc/testsuite/g++.dg/lto/20081109-1_0.C
index 711533600ed..3b5860011db 100644
--- a/gcc/testsuite/g++.dg/lto/20081109-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081109-1_0.C
@@ -1,6 +1,6 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-fPIC -flto -flto-partition=1to1}} }
-// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions" }
+// { dg-extra-ld-options "-fPIC -flto -flto-partition=1to1 -r -nostdlib -fno-exceptions -flinker-output=nolto-rel" }
void func(); class Foo { };
void bar() { try { func(); } catch (Foo) { } };
diff --git a/gcc/testsuite/g++.dg/lto/20081118_0.C b/gcc/testsuite/g++.dg/lto/20081118_0.C
index c1f9dfc97a4..f49157bfbfd 100644
--- a/gcc/testsuite/g++.dg/lto/20081118_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081118_0.C
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* We used to ICE because of dangling pointers. */
diff --git a/gcc/testsuite/g++.dg/lto/20081119-1_0.C b/gcc/testsuite/g++.dg/lto/20081119-1_0.C
index ca1455e49e7..2fd320192d5 100644
--- a/gcc/testsuite/g++.dg/lto/20081119-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081119-1_0.C
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
#include "20081119-1.h"
diff --git a/gcc/testsuite/g++.dg/lto/20081120-1_0.C b/gcc/testsuite/g++.dg/lto/20081120-1_0.C
index 03a9740c091..c78e5d97dc3 100644
--- a/gcc/testsuite/g++.dg/lto/20081120-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081120-1_0.C
@@ -1,5 +1,6 @@
// { dg-lto-do link }
// { dg-lto-options {{-flto -r -nostdlib}} }
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern "C"
{
extern __inline __attribute__((__gnu_inline__)) int pthread_equal(int, int)
diff --git a/gcc/testsuite/g++.dg/lto/20081120-2_0.C b/gcc/testsuite/g++.dg/lto/20081120-2_0.C
index 3efe26c0197..8deae1bb6ba 100644
--- a/gcc/testsuite/g++.dg/lto/20081120-2_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081120-2_0.C
@@ -1,5 +1,6 @@
// { dg-lto-do link }
// { dg-lto-options {{-flto -r -nostdlib}} }
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
template < typename > struct Foo
{
inline void rdstate() {
diff --git a/gcc/testsuite/g++.dg/lto/20081123_0.C b/gcc/testsuite/g++.dg/lto/20081123_0.C
index 4cbc25338dd..3bbe69d0874 100644
--- a/gcc/testsuite/g++.dg/lto/20081123_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081123_0.C
@@ -1,6 +1,7 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} }
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
int
f(void)
diff --git a/gcc/testsuite/g++.dg/lto/20081204-1_0.C b/gcc/testsuite/g++.dg/lto/20081204-1_0.C
index b87006a6bad..e3b4cead8c6 100644
--- a/gcc/testsuite/g++.dg/lto/20081204-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081204-1_0.C
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* Tests for the absence during linking of:
lto1: error: type of '_ZTVN10__cxxabiv120__si_class_type_infoE' does
diff --git a/gcc/testsuite/g++.dg/lto/20081219_0.C b/gcc/testsuite/g++.dg/lto/20081219_0.C
index 8f2c2e07edd..627deeb0376 100644
--- a/gcc/testsuite/g++.dg/lto/20081219_0.C
+++ b/gcc/testsuite/g++.dg/lto/20081219_0.C
@@ -1,7 +1,7 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -O2}} }
-// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib" }
+// { dg-extra-ld-options "-O2 -fPIC -flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" }
typedef long int ptrdiff_t;
extern "C"
diff --git a/gcc/testsuite/g++.dg/lto/20090302_0.C b/gcc/testsuite/g++.dg/lto/20090302_0.C
index d65d490d3e5..3a617879e19 100644
--- a/gcc/testsuite/g++.dg/lto/20090302_0.C
+++ b/gcc/testsuite/g++.dg/lto/20090302_0.C
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -flto -flto-partition=1to1 -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
struct Foo {
bool Mumble();
static void Bar() { if (foo_->Mumble()) foo_ = 0; }
diff --git a/gcc/testsuite/g++.dg/lto/20090313_0.C b/gcc/testsuite/g++.dg/lto/20090313_0.C
index cba9d054fcb..c883cefe5b6 100644
--- a/gcc/testsuite/g++.dg/lto/20090313_0.C
+++ b/gcc/testsuite/g++.dg/lto/20090313_0.C
@@ -1,6 +1,6 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-flto -flto-partition=1to1 -fPIC}} }
-// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib" }
+// { dg-extra-ld-options "-flto -flto-partition=1to1 -r -nostdlib -flinker-output=nolto-rel" }
int X;
diff --git a/gcc/testsuite/g++.dg/lto/20091002-2_0.C b/gcc/testsuite/g++.dg/lto/20091002-2_0.C
index 12a1596b3e2..06b75298338 100644
--- a/gcc/testsuite/g++.dg/lto/20091002-2_0.C
+++ b/gcc/testsuite/g++.dg/lto/20091002-2_0.C
@@ -1,7 +1,7 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-fPIC}} }
-// { dg-extra-ld-options "-fPIC -r -nostdlib" }
+// { dg-extra-ld-options "-fPIC -r -nostdlib -flinker-output=nolto-rel" }
class DataArray {
int max() const { return 0; }
diff --git a/gcc/testsuite/g++.dg/lto/20091002-3_0.C b/gcc/testsuite/g++.dg/lto/20091002-3_0.C
index 0d9afc44c28..b49fc67e8f4 100644
--- a/gcc/testsuite/g++.dg/lto/20091002-3_0.C
+++ b/gcc/testsuite/g++.dg/lto/20091002-3_0.C
@@ -1,7 +1,7 @@
// { dg-lto-do link }
// { dg-require-effective-target fpic }
// { dg-lto-options {{-fPIC}} }
-// { dg-extra-ld-options "-fPIC -r -nostdlib" }
+// { dg-extra-ld-options "-fPIC -r -nostdlib -flinker-output=nolto-rel" }
template < class T >
class DataArray {
diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_0.C b/gcc/testsuite/g++.dg/lto/20091026-1_0.C
index 5c74f29cc4c..06eff292cb6 100644
--- a/gcc/testsuite/g++.dg/lto/20091026-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20091026-1_0.C
@@ -1,5 +1,5 @@
// { dg-lto-do link }
-// { dg-extra-ld-options "-r -nostdlib" }
+// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
#include "20091026-1_a.h"
cObject *cHead::find(const char *objname) const
diff --git a/gcc/testsuite/g++.dg/lto/20100724-1_0.C b/gcc/testsuite/g++.dg/lto/20100724-1_0.C
index 084c07f0814..f4f7e72b885 100644
--- a/gcc/testsuite/g++.dg/lto/20100724-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20100724-1_0.C
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-ftoplevel-reorder -flto -flto-partition=none} {-ftoplevel-reorder -flto -flto-partition=1to1}} } */
-/* { dg-extra-ld-options {-r -nostdlib} } */
+/* { dg-extra-ld-options {-r -nostdlib -flinker-output=nolto-rel} } */
struct Foo { virtual ~Foo(); };
struct Bar:public Foo { Bar() { } };
diff --git a/gcc/testsuite/g++.dg/lto/20101010-4_0.C b/gcc/testsuite/g++.dg/lto/20101010-4_0.C
index 01beb2167c0..83499947da7 100644
--- a/gcc/testsuite/g++.dg/lto/20101010-4_0.C
+++ b/gcc/testsuite/g++.dg/lto/20101010-4_0.C
@@ -1,5 +1,6 @@
// { dg-lto-do link }
// { dg-lto-options { { -std=c++0x -flto -r -nostdlib } { -std=c++0x -flto -g -r -nostdlib } } }
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
typedef decltype(nullptr) nullptr_t;
class shared_ptr {
diff --git a/gcc/testsuite/g++.dg/lto/20101015-2_0.C b/gcc/testsuite/g++.dg/lto/20101015-2_0.C
index 9015f53a498..fa0e934d49a 100644
--- a/gcc/testsuite/g++.dg/lto/20101015-2_0.C
+++ b/gcc/testsuite/g++.dg/lto/20101015-2_0.C
@@ -1,6 +1,6 @@
// { dg-lto-do link }
// { dg-lto-options { { -flto } { -g -flto } } }
-// { dg-extra-ld-options "-r -nostdlib" }
+// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
struct Base { ~Base (); };
void fun(void) { struct Deriv : Base { } x; }
diff --git a/gcc/testsuite/g++.dg/lto/20110311-1_0.C b/gcc/testsuite/g++.dg/lto/20110311-1_0.C
index c63951e5bd8..331c9ed28dc 100644
--- a/gcc/testsuite/g++.dg/lto/20110311-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/20110311-1_0.C
@@ -1,5 +1,5 @@
/* { dg-lto-do link } */
-/* { dg-extra-ld-options "-r -nostdlib" } */
+/* { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } */
struct NullType {};
diff --git a/gcc/testsuite/g++.dg/lto/pr45621_0.C b/gcc/testsuite/g++.dg/lto/pr45621_0.C
index 746079cdceb..f34b3b70fa7 100644
--- a/gcc/testsuite/g++.dg/lto/pr45621_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr45621_0.C
@@ -1,5 +1,5 @@
// { dg-lto-do assemble }
-// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r" }
+// { dg-extra-ld-options "-O2 -fipa-cp-clone -flto -nostdlib -r -flinker-output=nolto-rel" }
#include "pr45621.h"
void
diff --git a/gcc/testsuite/g++.dg/lto/pr48042_0.C b/gcc/testsuite/g++.dg/lto/pr48042_0.C
index 4ca1a0cebfe..7754e7ec64f 100644
--- a/gcc/testsuite/g++.dg/lto/pr48042_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr48042_0.C
@@ -1,5 +1,5 @@
// { dg-lto-do link }
-// { dg-extra-ld-options "-r -nostdlib -g" }
+// { dg-extra-ld-options "-r -nostdlib -g -flinker-output=nolto-rel" }
class A {
virtual int x() = 0;
diff --git a/gcc/testsuite/g++.dg/lto/pr48354-1_0.C b/gcc/testsuite/g++.dg/lto/pr48354-1_0.C
index b2ae97709df..f1000657b4a 100644
--- a/gcc/testsuite/g++.dg/lto/pr48354-1_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr48354-1_0.C
@@ -1,6 +1,6 @@
// { dg-lto-do link }
// { dg-lto-options { { -g -flto } } }
-// { dg-extra-ld-options "-r -nostdlib" }
+// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
template<typename T> struct Identity { typedef T type; };
struct S {
diff --git a/gcc/testsuite/g++.dg/lto/pr54625-1_0.c b/gcc/testsuite/g++.dg/lto/pr54625-1_0.c
index 48bbdf02de7..43cba36a30f 100644
--- a/gcc/testsuite/g++.dg/lto/pr54625-1_0.c
+++ b/gcc/testsuite/g++.dg/lto/pr54625-1_0.c
@@ -1,5 +1,5 @@
/* { dg-lto-do link } */
-/* { dg-extra-ld-options { -r -nostdlib } } */
+/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */
float a;
double sin ();
diff --git a/gcc/testsuite/g++.dg/lto/pr54625-2_0.c b/gcc/testsuite/g++.dg/lto/pr54625-2_0.c
index 3e67d4f5b4e..5873b793c4f 100644
--- a/gcc/testsuite/g++.dg/lto/pr54625-2_0.c
+++ b/gcc/testsuite/g++.dg/lto/pr54625-2_0.c
@@ -1,5 +1,5 @@
/* { dg-lto-do link } */
-/* { dg-extra-ld-options { -r -nostdlib } } */
+/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */
float a;
double sin ();
diff --git a/gcc/testsuite/g++.dg/lto/pr68811_0.C b/gcc/testsuite/g++.dg/lto/pr68811_0.C
index 807c803b347..a18dc26eb8e 100644
--- a/gcc/testsuite/g++.dg/lto/pr68811_0.C
+++ b/gcc/testsuite/g++.dg/lto/pr68811_0.C
@@ -1,6 +1,6 @@
// { dg-lto-do link }
/* { dg-lto-options { { -O2 -w } { -w } } } */
-// { dg-extra-ld-options "-r -nostdlib" }
+// { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
extern "C" char *strcpy(char *, const char *);
char InitXPCOMGlue_lastSlash;
void InitXPCOMGlue() { strcpy(&InitXPCOMGlue_lastSlash, ".so"); }
diff --git a/gcc/testsuite/g++.dg/torture/pr85583.C b/gcc/testsuite/g++.dg/torture/pr85583.C
new file mode 100644
index 00000000000..eae8c5e847d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr85583.C
@@ -0,0 +1,13 @@
+/* { dg-do link } */
+class b {
+public:
+ virtual ~b();
+};
+template <typename> class c : b {};
+class B {
+ c<char> d;
+};
+extern template class c<char>;
+int
+main(void) { B a; return 0; }
+
diff --git a/gcc/testsuite/gcc.dg/lto/20081120-1_0.c b/gcc/testsuite/gcc.dg/lto/20081120-1_0.c
index e842b37f663..c426fd2f74a 100644
--- a/gcc/testsuite/gcc.dg/lto/20081120-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081120-1_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern int stat(void) __asm__("" "stat64");
extern inline int stat(void) { }
static void foo(void) { stat(); }
diff --git a/gcc/testsuite/gcc.dg/lto/20081120-2_0.c b/gcc/testsuite/gcc.dg/lto/20081120-2_0.c
index e2e11d64b63..762e0ffc742 100644
--- a/gcc/testsuite/gcc.dg/lto/20081120-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081120-2_0.c
@@ -1,3 +1,4 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
void bar(void) {}
diff --git a/gcc/testsuite/gcc.dg/lto/20081126_0.c b/gcc/testsuite/gcc.dg/lto/20081126_0.c
index f610d097ed6..ce65562167d 100644
--- a/gcc/testsuite/gcc.dg/lto/20081126_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081126_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } } */
/* { dg-lto-options {{-flto -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
int f(void) {
register int ri asm("edi");
diff --git a/gcc/testsuite/gcc.dg/lto/20081204-1_0.c b/gcc/testsuite/gcc.dg/lto/20081204-1_0.c
index 0c3849f6182..b8909310657 100644
--- a/gcc/testsuite/gcc.dg/lto/20081204-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081204-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* Tests for the absence during linking of:
lto1: error: type of 'i' does not match original declaration */
diff --git a/gcc/testsuite/gcc.dg/lto/20081204-2_0.c b/gcc/testsuite/gcc.dg/lto/20081204-2_0.c
index c08da1791d1..07705670678 100644
--- a/gcc/testsuite/gcc.dg/lto/20081204-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081204-2_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-skip-if "" { ! { i?86-*-* x86_64-*-* } } } */
/* { dg-lto-options {{-w -flto -fPIC -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
register int ri asm("edi");
diff --git a/gcc/testsuite/gcc.dg/lto/20081212-1_0.c b/gcc/testsuite/gcc.dg/lto/20081212-1_0.c
index acc00186840..327821a73cf 100644
--- a/gcc/testsuite/gcc.dg/lto/20081212-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081212-1_0.c
@@ -1,4 +1,5 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
int exported_var = 42;
/* { dg-final { scan-symbol "exported_var" } } */
diff --git a/gcc/testsuite/gcc.dg/lto/20081224_0.c b/gcc/testsuite/gcc.dg/lto/20081224_0.c
index 9f9afdf85c7..b319acb562e 100644
--- a/gcc/testsuite/gcc.dg/lto/20081224_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20081224_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-flto -flto-partition=1to1 -r -nostdlib -fPIC}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
#include "20081224_0.h"
extern struct foo x;
diff --git a/gcc/testsuite/gcc.dg/lto/20090116_0.c b/gcc/testsuite/gcc.dg/lto/20090116_0.c
index 4a865969901..dc8043c368a 100644
--- a/gcc/testsuite/gcc.dg/lto/20090116_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090116_0.c
@@ -1,7 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-O1 -flto -flto-partition=1to1 -fPIC}} } */
-/* { dg-extra-ld-options {-r -nostdlib -O0} } */
+/* { dg-extra-ld-options {-r -nostdlib -O0 -flinker-output=nolto-rel} } */
int foo(void) {
int ret, i;
diff --git a/gcc/testsuite/gcc.dg/lto/20090126-1_0.c b/gcc/testsuite/gcc.dg/lto/20090126-1_0.c
index 01a12994021..6e8f7416719 100644
--- a/gcc/testsuite/gcc.dg/lto/20090126-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090126-1_0.c
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-O0 -flto -flto-partition=1to1}} } */
-/* { dg-extra-ld-options {-r -nostdlib -O2 -flto -flto-partition=1to1} } */
+/* { dg-extra-ld-options {-r -nostdlib -O2 -flto -flto-partition=1to1 -flinker-output=nolto-rel} } */
int main(int argc, char **argv) {
return 0;
diff --git a/gcc/testsuite/gcc.dg/lto/20090126-2_0.c b/gcc/testsuite/gcc.dg/lto/20090126-2_0.c
index f75a05fec62..1ffa7aedd50 100644
--- a/gcc/testsuite/gcc.dg/lto/20090126-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090126-2_0.c
@@ -1,7 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -O2 -flto -flto-partition=1to1}} } */
-/* { dg-extra-ld-options {-fno-PIC -r -nostdlib -O2 -flto -flto-partition=1to1} } */
+/* { dg-extra-ld-options {-fno-PIC -r -nostdlib -O2 -flto -flto-partition=1to1 -flinker-output=nolto-rel} } */
int main(int argc, char **argv) {
return 0;
diff --git a/gcc/testsuite/gcc.dg/lto/20090206-1_0.c b/gcc/testsuite/gcc.dg/lto/20090206-1_0.c
index 3fbfb23843d..1361042f297 100644
--- a/gcc/testsuite/gcc.dg/lto/20090206-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090206-1_0.c
@@ -3,6 +3,7 @@
/* { dg-lto-options {{-fPIC -r -nostdlib -flto -flto-partition=1to1 -msse2}} } */
/* { dg-require-effective-target sse2 } */
/* { dg-suppress-ld-options {-fPIC -msse2} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
typedef short v8hi __attribute__((__vector_size__(16)));
void func (void) {
diff --git a/gcc/testsuite/gcc.dg/lto/20090219_0.c b/gcc/testsuite/gcc.dg/lto/20090219_0.c
index 985c884cecd..66fbcd11bca 100644
--- a/gcc/testsuite/gcc.dg/lto/20090219_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20090219_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-O3 -flto -flto-partition=1to1 -fPIC -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
struct Foo { int f1, f2, f3, f4, f5; };
diff --git a/gcc/testsuite/gcc.dg/lto/20091013-1_0.c b/gcc/testsuite/gcc.dg/lto/20091013-1_0.c
index 83de8d3223b..979677088ba 100644
--- a/gcc/testsuite/gcc.dg/lto/20091013-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091013-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -flto} {-fPIC -r -nostdlib -O2 -flto}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
void * HeapAlloc(void*,unsigned int,unsigned long);
diff --git a/gcc/testsuite/gcc.dg/lto/20091014-1_0.c b/gcc/testsuite/gcc.dg/lto/20091014-1_0.c
index be327aaff90..99295d3d95c 100644
--- a/gcc/testsuite/gcc.dg/lto/20091014-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091014-1_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* Empty file. See PR41173. */
diff --git a/gcc/testsuite/gcc.dg/lto/20091015-1_0.c b/gcc/testsuite/gcc.dg/lto/20091015-1_0.c
index 1c11f644888..698a7d9a489 100644
--- a/gcc/testsuite/gcc.dg/lto/20091015-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091015-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -O2 -flto} {-fPIC -r -nostdlib -O2 -flto -flto-partition=1to1}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
#include "20091015-1_b.h"
void diagnostic_initialize (FILE **stream) { *stream = stderr; }
diff --git a/gcc/testsuite/gcc.dg/lto/20091016-1_0.c b/gcc/testsuite/gcc.dg/lto/20091016-1_0.c
index b44c75a97c4..e7a2915cd5a 100644
--- a/gcc/testsuite/gcc.dg/lto/20091016-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091016-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -O2 -flto}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
typedef struct VEC_constructor_elt_gc { } VEC_constructor_elt_gc;
#include "20091016-1_a.h"
diff --git a/gcc/testsuite/gcc.dg/lto/20091020-1_0.c b/gcc/testsuite/gcc.dg/lto/20091020-1_0.c
index f9d8bf87de6..110d3e10e05 100644
--- a/gcc/testsuite/gcc.dg/lto/20091020-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091020-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
typedef struct {
int NumPackStreams;
diff --git a/gcc/testsuite/gcc.dg/lto/20091020-2_0.c b/gcc/testsuite/gcc.dg/lto/20091020-2_0.c
index 21e59678732..e0b3839c510 100644
--- a/gcc/testsuite/gcc.dg/lto/20091020-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091020-2_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-require-effective-target fpic } */
/* { dg-lto-options {{-fPIC -r -nostdlib -flto}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
typedef struct {
int NumPackStreams;
diff --git a/gcc/testsuite/gcc.dg/lto/20091027-1_0.c b/gcc/testsuite/gcc.dg/lto/20091027-1_0.c
index f2669fe0f00..c9a867bc924 100644
--- a/gcc/testsuite/gcc.dg/lto/20091027-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20091027-1_0.c
@@ -1,5 +1,5 @@
/* { dg-lto-do link } */
-/* { dg-extra-ld-options "-r -nostdlib" } */
+/* { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" } */
typedef struct _xmlDict xmlDict;
struct _xmlDict {
diff --git a/gcc/testsuite/gcc.dg/lto/20100426_0.c b/gcc/testsuite/gcc.dg/lto/20100426_0.c
index e1dc06f960b..49f7122e13c 100644
--- a/gcc/testsuite/gcc.dg/lto/20100426_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20100426_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-r -nostdlib -flto -g}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
long Perl_my_htonl (long l)
{
diff --git a/gcc/testsuite/gcc.dg/lto/20100430-1_0.c b/gcc/testsuite/gcc.dg/lto/20100430-1_0.c
index d2e79c62914..1ccfc9ac1ca 100644
--- a/gcc/testsuite/gcc.dg/lto/20100430-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20100430-1_0.c
@@ -1,5 +1,7 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-O2 -fprofile-arcs -flto -r -nostdlib}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
+
void
expand_stmt_with_iterators_1 (void)
diff --git a/gcc/testsuite/gcc.dg/lto/20100603-1_0.c b/gcc/testsuite/gcc.dg/lto/20100603-1_0.c
index cc35c78cfae..3cba481fe93 100644
--- a/gcc/testsuite/gcc.dg/lto/20100603-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20100603-1_0.c
@@ -1,4 +1,5 @@
/* { dg-lto-do link } */
/* { dg-extra-ld-options {-r -nostdlib} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* This file intentionally left empty. */
diff --git a/gcc/testsuite/gcc.dg/lto/20100603-2_0.c b/gcc/testsuite/gcc.dg/lto/20100603-2_0.c
index 11bee496d9c..94c6d007ef0 100644
--- a/gcc/testsuite/gcc.dg/lto/20100603-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20100603-2_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-extra-ld-options {-r -nostdlib} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
int foo;
int *i = &foo;
diff --git a/gcc/testsuite/gcc.dg/lto/20100603-3_0.c b/gcc/testsuite/gcc.dg/lto/20100603-3_0.c
index 3fc08fdbf6b..09d5b26e230 100644
--- a/gcc/testsuite/gcc.dg/lto/20100603-3_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20100603-3_0.c
@@ -1,4 +1,5 @@
/* { dg-lto-do link } */
/* { dg-extra-ld-options {-r -nostdlib} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
int i = 42;
diff --git a/gcc/testsuite/gcc.dg/lto/20111213-1_0.c b/gcc/testsuite/gcc.dg/lto/20111213-1_0.c
index e6f54748a80..779c12d1def 100644
--- a/gcc/testsuite/gcc.dg/lto/20111213-1_0.c
+++ b/gcc/testsuite/gcc.dg/lto/20111213-1_0.c
@@ -1,6 +1,7 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -flto -g } } } */
/* { dg-extra-ld-options {-r -nostdlib} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
void gfc_be_parse_file (void)
{
diff --git a/gcc/testsuite/gcc.dg/lto/pr45736_0.c b/gcc/testsuite/gcc.dg/lto/pr45736_0.c
index 860e239b532..d481c453d08 100644
--- a/gcc/testsuite/gcc.dg/lto/pr45736_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr45736_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib -O}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern void baz (void);
diff --git a/gcc/testsuite/gcc.dg/lto/pr52634_0.c b/gcc/testsuite/gcc.dg/lto/pr52634_0.c
index a858cc1a5cf..7aba0cd3caf 100644
--- a/gcc/testsuite/gcc.dg/lto/pr52634_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr52634_0.c
@@ -2,6 +2,7 @@
/* { dg-require-alias "" } */
/* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib -flto-partition=1to1}} */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
extern int cfliteValueCallBacks;
void baz (int *);
int main () { baz(&cfliteValueCallBacks); }
diff --git a/gcc/testsuite/gcc.dg/lto/pr54702_0.c b/gcc/testsuite/gcc.dg/lto/pr54702_0.c
index 2242f50b6de..2713d225dda 100644
--- a/gcc/testsuite/gcc.dg/lto/pr54702_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr54702_0.c
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -O2 -flto -w } } } */
-/* { dg-extra-ld-options { -r -nostdlib } } */
+/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */
#include <stdlib.h>
void* f ()
diff --git a/gcc/testsuite/gcc.dg/lto/pr59323-2_0.c b/gcc/testsuite/gcc.dg/lto/pr59323-2_0.c
index 938a89d6a28..61872dd5f75 100644
--- a/gcc/testsuite/gcc.dg/lto/pr59323-2_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr59323-2_0.c
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -O2 -g -flto } } } */
-/* { dg-extra-ld-options { -r -nostdlib } } */
+/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */
extern void bar(void);
diff --git a/gcc/testsuite/gcc.dg/lto/pr59323_0.c b/gcc/testsuite/gcc.dg/lto/pr59323_0.c
index b5910589158..ee780277657 100644
--- a/gcc/testsuite/gcc.dg/lto/pr59323_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr59323_0.c
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -O2 -g -flto } } } */
-/* { dg-extra-ld-options { -r -nostdlib } } */
+/* { dg-extra-ld-options { -r -nostdlib -flinker-output=nolto-rel } } */
extern void bar(void);
diff --git a/gcc/testsuite/gcc.dg/lto/pr60820_0.c b/gcc/testsuite/gcc.dg/lto/pr60820_0.c
index 57b5b6c443b..9fd2d2b76e4 100644
--- a/gcc/testsuite/gcc.dg/lto/pr60820_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr60820_0.c
@@ -1,5 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options {{-flto -r -nostdlib -O2}} } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
/* { dg-skip-if "no alias" { *-*-darwin* } } */
#include <stdio.h>
struct in6_addr {int bah;};
diff --git a/gcc/testsuite/gcc.dg/lto/pr81406_0.c b/gcc/testsuite/gcc.dg/lto/pr81406_0.c
index 44ef3c73992..26d4195bf63 100644
--- a/gcc/testsuite/gcc.dg/lto/pr81406_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr81406_0.c
@@ -1,7 +1,7 @@
/* PR lto/81406 */
/* { dg-lto-do link } */
/* { dg-lto-options { { -O2 -g -flto } } } */
-/* { dg-extra-ld-options { -g -r -nostdlib } } */
+/* { dg-extra-ld-options { -g -r -nostdlib -flinker-output=nolto-rel } } */
int a;
int *foo (void);
diff --git a/gcc/testsuite/gcc.dg/lto/pr83388_0.c b/gcc/testsuite/gcc.dg/lto/pr83388_0.c
index 4febbac06da..eb60b0e1774 100644
--- a/gcc/testsuite/gcc.dg/lto/pr83388_0.c
+++ b/gcc/testsuite/gcc.dg/lto/pr83388_0.c
@@ -1,6 +1,6 @@
/* { dg-lto-do link } */
/* { dg-lto-options { { -O2 -flto -fsanitize=null } { -O0 -flto -fsanitize=null } } } */
-/* { dg-extra-ld-options { -fno-sanitize=null -r -nostdlib } } */
+/* { dg-extra-ld-options { -fno-sanitize=null -r -nostdlib -flinker-output=nolto-rel } } */
enum { a } e(void);
struct C {
diff --git a/gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90 b/gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90
index a882da042cd..5e96e88731f 100644
--- a/gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90
+++ b/gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90
@@ -1,5 +1,6 @@
! { dg-lto-do link }
! { dg-lto-options {{-flto -g -fPIC -r -nostdlib} {-O -flto -g -fPIC -r -nostdlib}} }
+! { dg-extra-ld-options "-flinker-output=nolto-rel" }
FUNCTION makenumberstring(x)
IMPLICIT NONE
diff --git a/gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90 b/gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90
index 57c1b1f6028..3b32432f81d 100644
--- a/gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90
+++ b/gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90
@@ -1,5 +1,5 @@
! { dg-lto-do link }
-! { dg-extra-ld-options "-r -nostdlib -finline-functions" }
+! { dg-extra-ld-options "-r -nostdlib -finline-functions -flinker-output=nolto-rel" }
SUBROUTINE int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, &
DataHandle, Element, VarName, Data, code )
diff --git a/gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90 b/gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90
index 57c1b1f6028..3b32432f81d 100644
--- a/gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90
+++ b/gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90
@@ -1,5 +1,5 @@
! { dg-lto-do link }
-! { dg-extra-ld-options "-r -nostdlib -finline-functions" }
+! { dg-extra-ld-options "-r -nostdlib -finline-functions -flinker-output=nolto-rel" }
SUBROUTINE int_gen_ti_header_char( hdrbuf, hdrbufsize, itypesize, &
DataHandle, Element, VarName, Data, code )
diff --git a/gcc/testsuite/gfortran.dg/lto/pr46911_0.f b/gcc/testsuite/gfortran.dg/lto/pr46911_0.f
index fce959750ae..1ee938d8c6c 100644
--- a/gcc/testsuite/gfortran.dg/lto/pr46911_0.f
+++ b/gcc/testsuite/gfortran.dg/lto/pr46911_0.f
@@ -1,6 +1,6 @@
! { dg-lto-do link }
! { dg-lto-options {{ -O2 -flto -g }} }
-! { dg-extra-ld-options "-r -nostdlib" }
+! { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
common/main1/ eps(2)
call dalie6s(iqmod6,1,wx,cor6d)
end
diff --git a/gcc/testsuite/gfortran.dg/lto/pr47839_0.f90 b/gcc/testsuite/gfortran.dg/lto/pr47839_0.f90
index 9ea9315284a..dcc4223d80c 100644
--- a/gcc/testsuite/gfortran.dg/lto/pr47839_0.f90
+++ b/gcc/testsuite/gfortran.dg/lto/pr47839_0.f90
@@ -1,6 +1,6 @@
! { dg-lto-do link }
! { dg-lto-options {{ -g -flto }} }
-! { dg-extra-ld-options "-r -nostdlib" }
+! { dg-extra-ld-options "-r -nostdlib -flinker-output=nolto-rel" }
MODULE globalvar_mod
integer :: xstop
diff --git a/gcc/toplev.c b/gcc/toplev.c
index b066bcc7229..8f812c2a475 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -495,7 +495,8 @@ compile_file (void)
/* Compilation unit is finalized. When producing non-fat LTO object, we are
basically finished. */
- if (in_lto_p || !flag_lto || flag_fat_lto_objects)
+ if ((in_lto_p && flag_incremental_link != INCREMENTAL_LINK_LTO)
+ || !flag_lto || flag_fat_lto_objects)
{
/* File-scope initialization for AddressSanitizer. */
if (flag_sanitize & SANITIZE_ADDRESS)