passes.c (ipa_write_summaries): Only modify statements if body is in memory.
authorJan Hubicka <hubicka@ucw.cz>
Wed, 30 May 2018 16:42:41 +0000 (18:42 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 30 May 2018 16:42:41 +0000 (16:42 +0000)
* 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

77 files changed:
gcc/ChangeLog
gcc/cgraphunit.c
gcc/common.opt
gcc/dwarf2out.c
gcc/flag-types.h
gcc/gcc.c
gcc/ipa.c
gcc/lto-cgraph.c
gcc/lto/ChangeLog
gcc/lto/lang.opt
gcc/lto/lto-lang.c
gcc/lto/lto.c
gcc/passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/20081109-1_0.C
gcc/testsuite/g++.dg/lto/20081118_0.C
gcc/testsuite/g++.dg/lto/20081119-1_0.C
gcc/testsuite/g++.dg/lto/20081120-1_0.C
gcc/testsuite/g++.dg/lto/20081120-2_0.C
gcc/testsuite/g++.dg/lto/20081123_0.C
gcc/testsuite/g++.dg/lto/20081204-1_0.C
gcc/testsuite/g++.dg/lto/20081219_0.C
gcc/testsuite/g++.dg/lto/20090302_0.C
gcc/testsuite/g++.dg/lto/20090313_0.C
gcc/testsuite/g++.dg/lto/20091002-2_0.C
gcc/testsuite/g++.dg/lto/20091002-3_0.C
gcc/testsuite/g++.dg/lto/20091026-1_0.C
gcc/testsuite/g++.dg/lto/20100724-1_0.C
gcc/testsuite/g++.dg/lto/20101010-4_0.C
gcc/testsuite/g++.dg/lto/20101015-2_0.C
gcc/testsuite/g++.dg/lto/20110311-1_0.C
gcc/testsuite/g++.dg/lto/pr45621_0.C
gcc/testsuite/g++.dg/lto/pr48042_0.C
gcc/testsuite/g++.dg/lto/pr48354-1_0.C
gcc/testsuite/g++.dg/lto/pr54625-1_0.c
gcc/testsuite/g++.dg/lto/pr54625-2_0.c
gcc/testsuite/g++.dg/lto/pr68811_0.C
gcc/testsuite/g++.dg/torture/pr85583.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/20081120-1_0.c
gcc/testsuite/gcc.dg/lto/20081120-2_0.c
gcc/testsuite/gcc.dg/lto/20081126_0.c
gcc/testsuite/gcc.dg/lto/20081204-1_0.c
gcc/testsuite/gcc.dg/lto/20081204-2_0.c
gcc/testsuite/gcc.dg/lto/20081212-1_0.c
gcc/testsuite/gcc.dg/lto/20081224_0.c
gcc/testsuite/gcc.dg/lto/20090116_0.c
gcc/testsuite/gcc.dg/lto/20090126-1_0.c
gcc/testsuite/gcc.dg/lto/20090126-2_0.c
gcc/testsuite/gcc.dg/lto/20090206-1_0.c
gcc/testsuite/gcc.dg/lto/20090219_0.c
gcc/testsuite/gcc.dg/lto/20091013-1_0.c
gcc/testsuite/gcc.dg/lto/20091014-1_0.c
gcc/testsuite/gcc.dg/lto/20091015-1_0.c
gcc/testsuite/gcc.dg/lto/20091016-1_0.c
gcc/testsuite/gcc.dg/lto/20091020-1_0.c
gcc/testsuite/gcc.dg/lto/20091020-2_0.c
gcc/testsuite/gcc.dg/lto/20091027-1_0.c
gcc/testsuite/gcc.dg/lto/20100426_0.c
gcc/testsuite/gcc.dg/lto/20100430-1_0.c
gcc/testsuite/gcc.dg/lto/20100603-1_0.c
gcc/testsuite/gcc.dg/lto/20100603-2_0.c
gcc/testsuite/gcc.dg/lto/20100603-3_0.c
gcc/testsuite/gcc.dg/lto/20111213-1_0.c
gcc/testsuite/gcc.dg/lto/pr45736_0.c
gcc/testsuite/gcc.dg/lto/pr52634_0.c
gcc/testsuite/gcc.dg/lto/pr54702_0.c
gcc/testsuite/gcc.dg/lto/pr59323-2_0.c
gcc/testsuite/gcc.dg/lto/pr59323_0.c
gcc/testsuite/gcc.dg/lto/pr60820_0.c
gcc/testsuite/gcc.dg/lto/pr81406_0.c
gcc/testsuite/gcc.dg/lto/pr83388_0.c
gcc/testsuite/gfortran.dg/lto/20091016-1_0.f90
gcc/testsuite/gfortran.dg/lto/20091028-1_0.f90
gcc/testsuite/gfortran.dg/lto/20091028-2_0.f90
gcc/testsuite/gfortran.dg/lto/pr46911_0.f
gcc/testsuite/gfortran.dg/lto/pr47839_0.f90
gcc/toplev.c

index f25b7ef..15034d2 100644 (file)
@@ -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>
index 212ee7b..b2dafc6 100644 (file)
@@ -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;
index 13ab5c6..4aebcaf 100644 (file)
@@ -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.
index c05bfe4..3a24225 100644 (file)
@@ -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);
index 7f79da7..500f663 100644 (file)
@@ -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
index a716f70..2c597ec 100644 (file)
--- 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
index 9330de5..634c69c 100644 (file)
--- 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;
index 40baf85..b23d189 100644 (file)
@@ -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);
index cd976fa..5e1e0a9 100644 (file)
@@ -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
index 0a408d3..1d280a8 100644 (file)
@@ -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
index a310d69..1a70f4f 100644 (file)
@@ -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);
index d2ccaf6..86f3fe4 100644 (file)
@@ -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)
index ad0a912..2c711f0 100644 (file)
@@ -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
index ae89ac8..1d2af0a 100644 (file)
@@ -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:
index 7115336..3b58600 100644 (file)
@@ -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) { } };
index c1f9dfc..f49157b 100644 (file)
@@ -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.  */
 
index ca1455e..2fd3201 100644 (file)
@@ -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"
 
index 03a9740..c78e5d9 100644 (file)
@@ -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)
index 3efe26c..8deae1b 100644 (file)
@@ -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() {
index 4cbc253..3bbe69d 100644 (file)
@@ -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)
index b87006a..e3b4cea 100644 (file)
@@ -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
index 8f2c2e0..627deeb 100644 (file)
@@ -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"
index d65d490..3a61787 100644 (file)
@@ -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; }
index cba9d05..c883cef 100644 (file)
@@ -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;
index 12a1596..06b7529 100644 (file)
@@ -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; }
index 0d9afc4..b49fc67 100644 (file)
@@ -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 {
index 5c74f29..06eff29 100644 (file)
@@ -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
index 084c07f..f4f7e72 100644 (file)
@@ -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() { } };
index 01beb21..8349994 100644 (file)
@@ -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 {
index 9015f53..fa0e934 100644 (file)
@@ -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; }
index c63951e..331c9ed 100644 (file)
@@ -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 {};
 
index 746079c..f34b3b7 100644 (file)
@@ -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
index 4ca1a0c..7754e7e 100644 (file)
@@ -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;
index b2ae977..f100065 100644 (file)
@@ -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 {
index 48bbdf0..43cba36 100644 (file)
@@ -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 ();
index 3e67d4f..5873b79 100644 (file)
@@ -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 ();
index 807c803..a18dc26 100644 (file)
@@ -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 (file)
index 0000000..eae8c5e
--- /dev/null
@@ -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; }
+
index e842b37..c426fd2 100644 (file)
@@ -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(); }
index e2e11d6..762e0ff 100644 (file)
@@ -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) {}
index f610d09..ce65562 100644 (file)
@@ -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");
index 0c3849f..b890931 100644 (file)
@@ -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  */
index c08da17..0770567 100644 (file)
@@ -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");
index acc0018..327821a 100644 (file)
@@ -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" } } */
index 9f9afdf..b319acb 100644 (file)
@@ -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;
index 4a86596..dc8043c 100644 (file)
@@ -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;
index 01a1299..6e8f741 100644 (file)
@@ -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;
index f75a05f..1ffa7ae 100644 (file)
@@ -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;
index 3fbfb23..1361042 100644 (file)
@@ -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) {
index 985c884..66fbcd1 100644 (file)
@@ -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; };
 
index 83de8d3..9796770 100644 (file)
@@ -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);
 
index be327aa..99295d3 100644 (file)
@@ -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.  */
index 1c11f64..698a7d9 100644 (file)
@@ -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; }
index b44c75a..e7a2915 100644 (file)
@@ -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"
index f9d8bf8..110d3e1 100644 (file)
@@ -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;
index 21e5967..e0b3839 100644 (file)
@@ -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;
index f2669fe..c9a867b 100644 (file)
@@ -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 {
index e1dc06f..49f7122 100644 (file)
@@ -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)
 {
index d2e79c6..1ccfc9a 100644 (file)
@@ -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)
index cc35c78..3cba481 100644 (file)
@@ -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.  */
index 11bee49..94c6d00 100644 (file)
@@ -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;
index 3fc08fd..09d5b26 100644 (file)
@@ -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;
index e6f5474..779c12d 100644 (file)
@@ -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)
 {
index 860e239..d481c45 100644 (file)
@@ -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);
 
index a858cc1..7aba0cd 100644 (file)
@@ -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); }
index 2242f50..2713d22 100644 (file)
@@ -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 ()
index 938a89d..61872dd 100644 (file)
@@ -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);
 
index b591058..ee78027 100644 (file)
@@ -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);
 
index 57b5b6c..9fd2d2b 100644 (file)
@@ -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;};
index 44ef3c7..26d4195 100644 (file)
@@ -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);
index 4febbac..eb60b0e 100644 (file)
@@ -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 {
index a882da0..5e96e88 100644 (file)
@@ -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
index 57c1b1f..3b32432 100644 (file)
@@ -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 )
index 57c1b1f..3b32432 100644 (file)
@@ -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 )
index fce9597..1ee938d 100644 (file)
@@ -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
index 9ea9315..dcc4223 100644 (file)
@@ -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
index b066bcc..8f812c2 100644 (file)
@@ -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)