From: Bernd Edlinger Date: Wed, 27 Feb 2019 20:14:55 +0000 (+0000) Subject: re PR rtl-optimization/89490 (char array constant put in string merge section) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5b0a9c7cc1fa723369df61598cd3a8af4d21f5ff;p=gcc.git re PR rtl-optimization/89490 (char array constant put in string merge section) 2019-02-27 Bernd Edlinger 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95262b4dbc9..d7e81db4a12 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-02-27 Bernd Edlinger + + 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 PR target/70341 diff --git a/gcc/varasm.c b/gcc/varasm.c index 84dc14104e2..da10ba3c510 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -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