restore current_function_decl after re-gimplifying nested ADDR_EXPRs
authorAlexandre Oliva <oliva@adacore.com>
Tue, 2 Feb 2021 02:59:06 +0000 (23:59 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Tue, 2 Feb 2021 03:00:30 +0000 (00:00 -0300)
commit788113556899304501fd119f9c7ba93a74835c33
tree1aa895bf65b6010f56d7c4d4d13440cdab74f5bd
parent8a2750086d57d1a2251d9239fa4e6c2dc9ec3a86
restore current_function_decl after re-gimplifying nested ADDR_EXPRs

Ada makes extensive use of nested functions, which turn all automatic
variables of the enclosing function that are used in nested ones into
members of an artificial FRAME record type.

The address of a local variable is usually passed to asan marking
functions without using a temporary.  asan_expand_mark_ifn will reject
an ADDR_EXPRs if it's split out from the call into an SSA_NAMEs.

Taking the address of a member of FRAME within a nested function was
not regarded as a gimple val: while introducing FRAME variables,
current_function_decl pointed to the outermost function, even while
processing a nested function, so decl_address_invariant_p, checking
that the context of the variable is current_function_decl, returned
false for such ADDR_EXPRs.

decl_address_invariant_p, called when determining whether an
expression is a legitimate gimple value, compares the context of
automatic variables with current_function_decl.  Some of the
tree-nested function processing doesn't set current_function_decl, but
ADDR_EXPR-processing bits temporarily override it.  However, they
restore it before re-gimplifying, which causes even ADDR_EXPRs
referencing automatic variables in the FRAME struct of a nested
function to not be regarded as address-invariant.

This patch moves the restores of current_function_decl in the
ADDR_EXPR-handling bits after the re-gimplification, so that the
correct current_function_decl is used when testing for address
invariance.

for  gcc/ChangeLog

* tree-nested.c (convert_nonlocal_reference_op): Move
current_function_decl restore after re-gimplification.
(convert_local_reference_op): Likewise.

for  gcc/testsuite/ChangeLog

* gcc.dg/asan/nested-1.c: New.
gcc/testsuite/gcc.dg/asan/nested-1.c [new file with mode: 0644]
gcc/tree-nested.c