Message ID | ZbplKibgH5/xoVso@tucnak |
---|---|
State | New |
Headers | show |
Series | gimple-low: Remove .ASAN_MARK calls on TREE_STATIC variables [PR113531] | expand |
> Am 31.01.2024 um 16:20 schrieb Jakub Jelinek <jakub@redhat.com>: > > On Wed, Jan 31, 2024 at 01:04:22PM +0100, Richard Biener wrote: >>> Like this, so far just tested on the testcase. Ok for trunk if it passes >>> bootstrap/regtest on top of Jason's patch? >> >> Note we fold all - well, all builtin - calls during gimple lowering. > > Internal calls aren't builtin, so those aren't folded. > >> Maybe we can put this special-casing there instead? (gimple-low.cc:797, >> you possibly have to replace with a GIMPLE_NOP) > > But sure, we can do it there as well. > In that case I think we don't need it in asan.cc though, because > gimple-low.cc is guaranteed to be performed on all statements from > gimplification that survive in the IL. > > So like this? Lgtm, Thanks, Richard > 2024-01-31 Jakub Jelinek <jakub@redhat.com> > Jason Merrill <jason@redhat.com> > > PR c++/113531 > * gimple-low.cc (lower_stmt): Remove .ASAN_MARK calls > on variables which were promoted to TREE_STATIC. > > * g++.dg/asan/initlist1.C: New test. > > --- gcc/gimple-low.cc.jj 2024-01-03 11:51:22.133861623 +0100 > +++ gcc/gimple-low.cc 2024-01-31 16:16:21.326927572 +0100 > @@ -790,6 +790,21 @@ lower_stmt (gimple_stmt_iterator *gsi, s > return; > } > > + if (gimple_call_internal_p (stmt, IFN_ASAN_MARK)) > + { > + tree base = gimple_call_arg (stmt, 1); > + gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR); > + tree decl = TREE_OPERAND (base, 0); > + if (VAR_P (decl) && TREE_STATIC (decl)) > + { > + /* Don't poison a variable with static storage; it might have > + gotten marked before gimplify_init_constructor promoted it > + to static. */ > + gsi_remove (gsi, true); > + return; > + } > + } > + > /* We delay folding of built calls from gimplification to > here so the IL is in consistent state for the diagnostic > machineries job. */ > --- gcc/testsuite/g++.dg/asan/initlist1.C.jj 2024-01-31 16:09:58.071289511 +0100 > +++ gcc/testsuite/g++.dg/asan/initlist1.C 2024-01-31 16:09:58.071289511 +0100 > @@ -0,0 +1,20 @@ > +// PR c++/113531 > +// { dg-do run { target c++11 } } > +// { dg-additional-options "-fsanitize=address" } > + > +#include <initializer_list> > + > +void f(int) { } > + > +void g() > +{ > + for (auto i : { 1, 2, 3 }) > + f (i); > + f(42); > +} > + > +int main() > +{ > + g(); > + g(); > +} > > > Jakub >
--- gcc/gimple-low.cc.jj 2024-01-03 11:51:22.133861623 +0100 +++ gcc/gimple-low.cc 2024-01-31 16:16:21.326927572 +0100 @@ -790,6 +790,21 @@ lower_stmt (gimple_stmt_iterator *gsi, s return; } + if (gimple_call_internal_p (stmt, IFN_ASAN_MARK)) + { + tree base = gimple_call_arg (stmt, 1); + gcc_checking_assert (TREE_CODE (base) == ADDR_EXPR); + tree decl = TREE_OPERAND (base, 0); + if (VAR_P (decl) && TREE_STATIC (decl)) + { + /* Don't poison a variable with static storage; it might have + gotten marked before gimplify_init_constructor promoted it + to static. */ + gsi_remove (gsi, true); + return; + } + } + /* We delay folding of built calls from gimplification to here so the IL is in consistent state for the diagnostic machineries job. */ --- gcc/testsuite/g++.dg/asan/initlist1.C.jj 2024-01-31 16:09:58.071289511 +0100 +++ gcc/testsuite/g++.dg/asan/initlist1.C 2024-01-31 16:09:58.071289511 +0100 @@ -0,0 +1,20 @@ +// PR c++/113531 +// { dg-do run { target c++11 } } +// { dg-additional-options "-fsanitize=address" } + +#include <initializer_list> + +void f(int) { } + +void g() +{ + for (auto i : { 1, 2, 3 }) + f (i); + f(42); +} + +int main() +{ + g(); + g(); +}