> Am 31.01.2024 um 16:20 schrieb Jakub Jelinek <ja...@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 <ja...@redhat.com>
> Jason Merrill <ja...@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
>