On Fri, Jan 9, 2015 at 11:21 AM, Bernd Edlinger
<bernd.edlin...@hotmail.de> wrote:
> Hi,
>
> On Fri, 9 Jan 2015 10:57:14, Richard Biener wrote:
>>
>> On Mon, Jan 5, 2015 at 9:00 PM, Jeff Law <l...@redhat.com> wrote:
>>> On 01/03/15 06:49, Bernd Edlinger wrote:
>>>>
>>>> Hi,
>>>>
>>>> I was experimenting with enabling TSAN for Ada recently.
>>>> I think this gives rather interesting results.
>>>>
>>>> The Instrumentation worked almost out of the box, we just have
>>>> the problem that it is not gimple-OK to fold something like
>>>> "& VIEW_CONVERT_EXPR(x)", and this happens in Ada all the time.
>>>>
>>>> Boot-Strapped and regression-tested on x86_64-linux-gnu.
>>>> OK for trunk?
>>>>
>>>>
>>>> Thanks
>>>> Bernd.
>>>>
>>>>
>>>>
>>>> changelog-tsan-ada.txt
>>>>
>>>>
>>>> gcc/ChangeLog:
>>>> 2015-01-03 Bernd Edlinger<bernd.edlin...@hotmail.de>
>>>>
>>>> Enable experimental TSAN support for Ada.
>>>> * tsan.c (instrument_expr): Handle VIEW_CONVERT_EXPR.
>>>
>>> OK for the trunk with a comment before the new block of code indicating why
>>> we need to handle VIEW_CONVERT_EXPR specially here (specifically we can't
>>> call build_fold_addr_expr on the VIEW_CONVERT_EXPR).
>>
>> There may be multiple VIEW_CONVERT_EXPRs in a reference chain
>> so simply stripping the outermost only doesn't work (the assert).
>>
>
> Hmm, that did not happen in any of the Ada tests in ada/acats nor in gnat.dg,
> but with Ada anything may be possible...
>
> Would you like it better if I do it this way:
>
>       align = get_object_alignment (expr);
>       if (align < BITS_PER_UNIT)
>          return false;
>
>       do
>         {
>            expr = TREE_OPERAND (expr, 0);
>         } while (TREE_CODE (expr) == VIEW_CONVERT_EXPR);

No, I mean the tree might look like

  COMPONENT_REF <VIEW_CONVERT_EXPR < COMPONENT_REF <VIEW_CONVERT_EXPR <....

thus VIEW_CONVERT_EXPR doesn't have to be outermost but it
can appear anywhere in the reference chain.

>       gcc_checking_assert (is_gimple_addressable (expr));
>       expr_ptr = build_fold_addr_expr (unshare_expr (expr));
>
>
>
>> I wonder why you do all the special-casing when you have already
>> called get_inner_reference on the reference. The address is
>> simply &base + offset + bitpos / BITS_PER_UNIT, the bitfield
>> case is detectable via bitpos % BITS_PER_UNIT != 0.
>>
>
> I tried that first, but for something lile S.A[x].B
> offset is someting like a+b*x, and while we handle that in expansion,
> it is pretty hard to fold gimple code for &base + offset in this case.

Not really, just use one of the force_gimple_operand* functions.

> But it is relatively easy to fold &S.A[x] and add a contant byte offset.
>
>
>> Sth else I noticed, instead of checking points-to in the weird way
>> you do you simply want if (DECL_P (base) && !may_be_aliased (base)).
>>
>
> you mean,
>
>   /* No need to instrument accesses to decls that don't escape,
>      they can't escape to other threads then.  */
>   if (DECL_P (base))
>     {
>       struct pt_solution pt;
>       memset (&pt, 0, sizeof (pt));
>       pt.escaped = 1;
>       pt.ipa_escaped = flag_ipa_pta != 0;
>       pt.nonlocal = 1;
>       if (!pt_solution_includes (&pt, base))
>         return false;
>       if (!is_global_var (base) && !may_be_aliased (base))
>         return false;
>     }
>
> should be equivalent to
>
>    if (DECL_P (base) && !may_be_aliased (base))
>     return false;
>
> is that right?

Yes, well, not exactly, but I wonder if its worth doing the extra check
if you only check decl accesses anyway and not indirect accesses.

Richard.

>
> Thanks,
> Bernd
>
>> Richard.
>>
>>> Jeff
>>>
>

Reply via email to