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. > 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); (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