[gcc(refs/users/marxin/heads/PR97508-lto-duplicite-streaming-v2)] LTO: get_section: add new argument

Martin Liska marxin@gcc.gnu.org
Wed Oct 21 09:16:38 GMT 2020


https://gcc.gnu.org/g:6e507b5a2c29a53c3d498ba83977bb7b93644905

commit 6e507b5a2c29a53c3d498ba83977bb7b93644905
Author: Martin Liska <mliska@suse.cz>
Date:   Wed Oct 21 11:11:03 2020 +0200

    LTO: get_section: add new argument
    
    gcc/ChangeLog:
    
            PR lto/97508
            * langhooks.c (lhd_begin_section): Call get_section with
            not_existing = true.
            * output.h (get_section): Add new argument.
            * varasm.c (get_section): Fail when NOT_EXISTING is true
            and a section already exists.
            * ipa-prop.c (ipa_prop_write_jump_functions): Do not stream
            twice.

Diff:
---
 gcc/ipa-prop.c  |  9 +++++++++
 gcc/langhooks.c |  2 +-
 gcc/output.h    |  3 ++-
 gcc/varasm.c    | 12 ++++++++++--
 4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index a848f1db95e..d43fd2eee4f 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -5067,6 +5067,13 @@ ipa_prop_write_jump_functions (void)
   lto_symtab_encoder_iterator lsei;
   lto_symtab_encoder_t encoder;
 
+  /* The function can be called from 2 IPA_PASSES: "fnsummary" and "cp"
+     which happens in partial linking (-r).  Prevent double streaming
+     as reported in PR97508.  */
+  static bool already_stremed = false;
+  if (already_stremed)
+    return;
+
   if (!ipa_node_params_sum || !ipa_edge_args_sum)
     return;
 
@@ -5096,6 +5103,8 @@ ipa_prop_write_jump_functions (void)
   streamer_write_char_stream (ob->main_stream, 0);
   produce_asm (ob, NULL);
   destroy_output_block (ob);
+
+  already_stremed = true;
 }
 
 /* Read section in file FILE_DATA of length LEN with data DATA.  */
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 8819a8859d4..d82f54251fd 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -790,7 +790,7 @@ lhd_begin_section (const char *name)
     saved_section = text_section;
 
   /* Create a new section and switch to it.  */
-  section = get_section (name, SECTION_DEBUG | SECTION_EXCLUDE, NULL);
+  section = get_section (name, SECTION_DEBUG | SECTION_EXCLUDE, NULL, true);
   switch_to_section (section);
 }
 
diff --git a/gcc/output.h b/gcc/output.h
index eb253c50329..2f2f1697fd8 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -523,7 +523,8 @@ extern GTY(()) bool in_cold_section_p;
 
 extern section *get_unnamed_section (unsigned int, void (*) (const void *),
 				     const void *);
-extern section *get_section (const char *, unsigned int, tree);
+extern section *get_section (const char *, unsigned int, tree,
+			     bool not_existing = false);
 extern section *get_named_section (tree, const char *, int);
 extern section *get_variable_section (tree, bool);
 extern void place_block_symbol (rtx);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index ea0b59cf44a..207c9b077d1 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -277,10 +277,12 @@ get_noswitch_section (unsigned int flags, noswitch_section_callback callback)
 }
 
 /* Return the named section structure associated with NAME.  Create
-   a new section with the given fields if no such structure exists.  */
+   a new section with the given fields if no such structure exists.
+   When NOT_EXISTING, then fail if the section already exists.  */
 
 section *
-get_section (const char *name, unsigned int flags, tree decl)
+get_section (const char *name, unsigned int flags, tree decl,
+	     bool not_existing)
 {
   section *sect, **slot;
 
@@ -297,6 +299,12 @@ get_section (const char *name, unsigned int flags, tree decl)
     }
   else
     {
+      if (not_existing)
+	{
+	  error ("Section already exists: %qs", name);
+	  gcc_unreachable ();
+	}
+
       sect = *slot;
       /* It is fine if one of the sections has SECTION_NOTYPE as long as
          the other has none of the contrary flags (see the logic at the end


More information about the Gcc-cvs mailing list