On Thu, Nov 1, 2012 at 12:16 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Thu, Nov 01, 2012 at 11:57:21AM -0700, Xinliang David Li wrote:
>> That is exactly related to tsan -- it should skip local variable that
>> is not address taken (though still addressable, which by addressable,
>> it means the variable has a memory home).
>>
>> The problem is that if 'addressable' bit is not equivalent to 'address
>> taken', it will be too conservative to use it --- as addressable
>> variables may not be address taken.
>
> But TREE_ADDRESSABLE is equivalent to address taken.

It seems not -- unless our definition of them is different. I debugged
the following program:


int foo()
{
  int a[1000];
  int i, s;

  for (i = 0; i < 1000; i++)
    a[i] = i;

  for (i = 0; i < 1000; i++)
    s += a[i];

   return s;
}

a's address is not taken (at source level), but it is marked as addressable.

>
>> Note that even 'address taken' is too conservative to use here. Only
>> when it is escaped the thread (via non TLS global pointers or other
>> escaped local, heap memories), should it be considered to be
>> instrumented.
>
> If you need it even less conservative, I guess you could do say:
>   struct ptr_info_def pi;
>   memset (&pi, 0, sizeof (pi));
>   pi.escaped = 1;
>   pi.nonlocal = 1;
>   return pt_solution_includes (&pi, decl);
>

That will be nice.  Are points-to info exposed to client code like
this? Are there standard aliaser interfaces for them?

thanks,

David

> (the nonlocal in pt_solution_includes_1 performs the is_global_var check
> that needs to be done, and escaped checks whether decl is in the escaped
> set).
>
> Then say for
> int foo(int i)
> {
>   int a[100], b[100], c[100], d[100], *p;
>   if (i < 10)
>     p = a;
>   else if (i < 60)
>     p = b;
>   else if (i <= 65)
>     p = c;
>   else
>     p = d;
>   p[i] = 1;
>   p[2 * i] = 2;
>   return p[i + 1];
> }
> still none of a, b, c, and d vars will be included, even when they are
> TREE_ADDRESSABLE, but if you say pass p to another function, or set a global
> var to it, it will already return true for them.
>
>         Jakub

Reply via email to