]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/89490 (char array constant put in string merge section)
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 27 Feb 2019 20:14:55 +0000 (20:14 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Wed, 27 Feb 2019 20:14:55 +0000 (20:14 +0000)
2019-02-27  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR rtl-optimization/89490
        * varasm.c (get_block_for_section): Bail out for mergeable sections.
        (default_use_anchors_for_symbol_p, output_object_block): Assert the
        block section is not mergeable.

From-SVN: r269264

gcc/ChangeLog
gcc/varasm.c

index 95262b4dbc95d9c77de4fbc9e531b9b89711ede5..d7e81db4a12c10e42a815f5abe5c05658d5eb167 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-27  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR rtl-optimization/89490
+       * varasm.c (get_block_for_section): Bail out for mergeable sections.
+       (default_use_anchors_for_symbol_p, output_object_block): Assert the
+       block section is not mergeable.
+
 2019-02-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/70341
index 84dc14104e2ca04a07a112fc63046822936ac97a..da10ba3c51004fdbab31a5e6d6669f5c1d2113d1 100644 (file)
@@ -363,7 +363,11 @@ use_object_blocks_p (void)
 
 /* Return the object_block structure for section SECT.  Create a new
    structure if we haven't created one already.  Return null if SECT
-   itself is null.  */
+   itself is null.  Return also null for mergeable sections since
+   section anchors can't be used in mergeable sections anyway,
+   because the linker might move objects around, and using the
+   object blocks infrastructure in that case is both a waste and a
+   maintenance burden.  */
 
 static struct object_block *
 get_block_for_section (section *sect)
@@ -373,6 +377,9 @@ get_block_for_section (section *sect)
   if (sect == NULL)
     return NULL;
 
+  if (sect->common.flags & SECTION_MERGE)
+    return NULL;
+
   object_block **slot
     = object_block_htab->find_slot_with_hash (sect, hash_section (sect),
                                              INSERT);
@@ -7014,14 +7021,13 @@ default_asm_output_anchor (rtx symbol)
 bool
 default_use_anchors_for_symbol_p (const_rtx symbol)
 {
-  section *sect;
   tree decl;
+  section *sect = SYMBOL_REF_BLOCK (symbol)->sect;
 
-  /* Don't use anchors for mergeable sections.  The linker might move
-     the objects around.  */
-  sect = SYMBOL_REF_BLOCK (symbol)->sect;
-  if (sect->common.flags & SECTION_MERGE)
-    return false;
+  /* This function should only be called with non-zero SYMBOL_REF_BLOCK,
+     furthermore get_block_for_section should not create object blocks
+     for mergeable sections.  */
+  gcc_checking_assert (sect && !(sect->common.flags & SECTION_MERGE));
 
   /* Don't use anchors for small data sections.  The small data register
      acts as an anchor for such sections.  */
@@ -7630,6 +7636,7 @@ output_object_block (struct object_block *block)
   else
     switch_to_section (block->sect);
 
+  gcc_checking_assert (!(block->sect->common.flags & SECTION_MERGE));
   assemble_align (block->alignment);
 
   /* Define the values of all anchors relative to the current section