Fix up -fsanitize=address on -fsection-anchors targets (PR sanitizer/85018)

Message ID 20180321204111.GP8577@tucnak
State New
Headers show
Series
  • Fix up -fsanitize=address on -fsection-anchors targets (PR sanitizer/85018)
Related show

Commit Message

Jakub Jelinek March 21, 2018, 8:41 p.m.
Hi!

I've committed my last patch to unbreak aarch64 and powerpc* bootstrap
in a rush just after watching it passed bootstrap, not waiting for test
results.
Unfortunately, it seems the DECL_INITIAL (decl) = decl; hack wasn't used as
the comment suggested only by dw2_force_const_mem, but also by asan.c.
In that case forcing flag_section_anchors temporarily to 0 is too fragile,
so this patch instead reverts the varasm.c change (just provides a different
comment) and for good measure adds the DECL_INITIAL hack on the dw2 decl
after it is emitted (we still use the temporary flag_section_anchors = 0
on the assemble_variable, because at that point it really should have better
DECL_INITIAL to choose section right).

Bootstrapped/regtested on {x86_64,i686,powerpc64,powerpc64le}-linux,
bootstrapped on aarch64-linux (regtest still pending).
Ok for trunk?

2018-03-21  Jakub Jelinek  <jakub@redhat.com>

	PR sanitizer/85018
	* dwarf2asm.c (dw2_output_indirect_constant_1): Set
	DECL_INITIAL (decl) to decl at the end.
	* varasm.c (use_blocks_for_decl_p): Revert the 2018-03-20 change,
	adjust the comment.


	Jakub

Comments

Jakub Jelinek March 22, 2018, 7:43 a.m. | #1
On Wed, Mar 21, 2018 at 09:41:11PM +0100, Jakub Jelinek wrote:
> I've committed my last patch to unbreak aarch64 and powerpc* bootstrap

> in a rush just after watching it passed bootstrap, not waiting for test

> results.

> Unfortunately, it seems the DECL_INITIAL (decl) = decl; hack wasn't used as

> the comment suggested only by dw2_force_const_mem, but also by asan.c.

> In that case forcing flag_section_anchors temporarily to 0 is too fragile,

> so this patch instead reverts the varasm.c change (just provides a different

> comment) and for good measure adds the DECL_INITIAL hack on the dw2 decl

> after it is emitted (we still use the temporary flag_section_anchors = 0

> on the assemble_variable, because at that point it really should have better

> DECL_INITIAL to choose section right).

> 

> Bootstrapped/regtested on {x86_64,i686,powerpc64,powerpc64le}-linux,

> bootstrapped on aarch64-linux (regtest still pending).


And successfully tested also on aarch64-linux.

> Ok for trunk?

> 

> 2018-03-21  Jakub Jelinek  <jakub@redhat.com>

> 

> 	PR sanitizer/85018

> 	* dwarf2asm.c (dw2_output_indirect_constant_1): Set

> 	DECL_INITIAL (decl) to decl at the end.

> 	* varasm.c (use_blocks_for_decl_p): Revert the 2018-03-20 change,

> 	adjust the comment.

> 

> --- gcc/dwarf2asm.c.jj	2018-03-20 14:00:19.863928902 +0100

> +++ gcc/dwarf2asm.c	2018-03-21 11:52:13.523869188 +0100

> @@ -982,6 +982,7 @@ dw2_output_indirect_constant_1 (const ch

>    flag_section_anchors = save_flag_section_anchors;

>    flag_sanitize = save_flag_sanitize;

>    assemble_integer (sym_ref, POINTER_SIZE_UNITS, POINTER_SIZE, 1);

> +  DECL_INITIAL (decl) = decl;

>  

>    return 0;

>  }

> --- gcc/varasm.c.jj	2018-03-20 14:00:20.278928898 +0100

> +++ gcc/varasm.c	2018-03-21 11:51:01.838881084 +0100

> @@ -1253,6 +1253,12 @@ use_blocks_for_decl_p (tree decl)

>    if (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)

>      return false;

>  

> +  /* DECL_INITIAL (decl) set to decl is a hack used for some decls that

> +     are never used from code directly and we never want object block handling

> +     for those.  */

> +  if (DECL_INITIAL (decl) == decl)

> +    return false;

> +

>    /* If this decl is an alias, then we don't want to emit a

>       definition.  */

>    if (VAR_P (decl)


	Jakub

Patch

--- gcc/dwarf2asm.c.jj	2018-03-20 14:00:19.863928902 +0100
+++ gcc/dwarf2asm.c	2018-03-21 11:52:13.523869188 +0100
@@ -982,6 +982,7 @@  dw2_output_indirect_constant_1 (const ch
   flag_section_anchors = save_flag_section_anchors;
   flag_sanitize = save_flag_sanitize;
   assemble_integer (sym_ref, POINTER_SIZE_UNITS, POINTER_SIZE, 1);
+  DECL_INITIAL (decl) = decl;
 
   return 0;
 }
--- gcc/varasm.c.jj	2018-03-20 14:00:20.278928898 +0100
+++ gcc/varasm.c	2018-03-21 11:51:01.838881084 +0100
@@ -1253,6 +1253,12 @@  use_blocks_for_decl_p (tree decl)
   if (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
     return false;
 
+  /* DECL_INITIAL (decl) set to decl is a hack used for some decls that
+     are never used from code directly and we never want object block handling
+     for those.  */
+  if (DECL_INITIAL (decl) == decl)
+    return false;
+
   /* If this decl is an alias, then we don't want to emit a
      definition.  */
   if (VAR_P (decl)