On Mon, May 5, 2014 at 1:27 PM, Swati Rathi <swatira...@cse.iitb.ac.in> wrote: > On Monday 05 May 2014 04:37 PM, Richard Biener wrote: >> >> On Mon, May 5, 2014 at 11:38 AM, Swati Rathi <swatira...@cse.iitb.ac.in> >> wrote: >>> >>> In some cases, GCC's pta pass does not dump the points-to information for >>> function pointers which are formal parameters. >>> >>> Why is it so? >> >> Depends on the case. >> >>> Also it does not store the information for the corresponding SSA name. >>> >>> However, it dumps pointer information for the parameter variable as >>> <function name>.constprop.0.arg0 = { val1 val2 } >>> >>> This is the value which should have been stored with the formal >>> parameter. >>> >>> Is there any way of accessing this value? >>> Also what is this new variable <function name>.constprop.0.arg0 which is >>> getting created? >>> It is not a local variable. How do we then access its value? >> >> It is the internal representation variable used in the points-to solving >> algorithm. You can't access that outside of the pass. >> >> Do you have a (simple) testcase that shows the issue? > > > Here is a testcase : > > ------------------------------------------------------------------------------- > __attribute__ ((noinline)) void fun3(void (*fp) ()) > { > fp(); > } > > void fun1() > { > printf("\nin fun1\n"); > } > > int main() > { > fun3(fun1); > } > ------------------------------------------------------------------------------- > > Points-to information of formal argument fp is not dumped. > However, the value for fun3.arg0 = { fun1 } is being dumped.
Ah, that's just an issue of the dumping. We dump alias info at the definition place but there isn't one for the formal argument. Somewhen in the past I had patches to address this. Richard. > > >> >> Richard. >> >>> >>> On Tuesday 29 April 2014 02:47 PM, Richard Biener wrote: >>>> >>>> On Tue, Apr 29, 2014 at 8:26 AM, Swati Rathi <swatira...@cse.iitb.ac.in> >>>> wrote: >>>>> >>>>> On Monday 28 April 2014 02:46 PM, Richard Biener wrote: >>>>>> >>>>>> On Sat, Apr 26, 2014 at 4:07 PM, Richard Biener >>>>>> <richard.guent...@gmail.com> wrote: >>>>>>> >>>>>>> On April 26, 2014 12:31:34 PM CEST, Swati Rathi >>>>>>> <swatira...@cse.iitb.ac.in> wrote: >>>>>>>> >>>>>>>> On Friday 25 April 2014 11:11 PM, Richard Biener wrote: >>>>>>>>> >>>>>>>>> On April 25, 2014 5:54:09 PM CEST, Swati Rathi >>>>>>>> >>>>>>>> <swatira...@cse.iitb.ac.in> wrote: >>>>>>>>>> >>>>>>>>>> Hello, >>>>>>>>>> >>>>>>>>>> I am trying to print points-to information for SSA variables as >>>>>>>> >>>>>>>> below. >>>>>>>>>> >>>>>>>>>> for (i = 1; i < num_ssa_names; i++) >>>>>>>>>> { >>>>>>>>>> tree ptr = ssa_name (i); >>>>>>>>>> struct ptr_info_def *pi; >>>>>>>>>> >>>>>>>>>> if (ptr == NULL_TREE >>>>>>>>>> || SSA_NAME_IN_FREE_LIST (ptr)) >>>>>>>>>> continue; >>>>>>>>>> >>>>>>>>>> pi = SSA_NAME_PTR_INFO (ptr); >>>>>>>>>> if (pi) >>>>>>>>>> dump_points_to_info_for (file, ptr); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> ------------------------------------------------------------- >>>>>>>>>> My test program is given below : >>>>>>>>>> >>>>>>>>>> int main() >>>>>>>>>> { >>>>>>>>>> int *p, i, j; >>>>>>>>>> void (*fp1)(); >>>>>>>>>> >>>>>>>>>> if (i) >>>>>>>>>> { >>>>>>>>>> p = &i; >>>>>>>>>> fp1 = fun1; >>>>>>>>>> } >>>>>>>>>> else >>>>>>>>>> { >>>>>>>>>> p = &j; >>>>>>>>>> fp1 = fun2; >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> fp1(); >>>>>>>>>> >>>>>>>>>> printf ("\n%d %d\n", *p, i); >>>>>>>>>> return 0; >>>>>>>>>> } >>>>>>>>>> ------------------------------------------------------------- >>>>>>>>>> I get the output as :- >>>>>>>>>> >>>>>>>>>> p_1, points-to vars: { i j } >>>>>>>>>> fp1_2, points-to vars: { } >>>>>>>>>> ------------------------------------------------------------- >>>>>>>>>> >>>>>>>>>> Why is the pointees for function pointer not getting dumped? >>>>>>>>> >>>>>>>>> It's just not saved. >>>>>>>> >>>>>>>> Can we modify the code to preserve values for function pointer SSA >>>>>>>> names? >>>>>>> >>>>>>> Sure. >>>>>> >>>>>> Index: gcc/tree-ssa-structalias.c >>>>>> =================================================================== >>>>>> --- gcc/tree-ssa-structalias.c (revision 209782) >>>>>> +++ gcc/tree-ssa-structalias.c (working copy) >>>>>> @@ -6032,7 +6032,8 @@ set_uids_in_ptset (bitmap into, bitmap f >>>>>> >>>>>> if (TREE_CODE (vi->decl) == VAR_DECL >>>>>> || TREE_CODE (vi->decl) == PARM_DECL >>>>>> - || TREE_CODE (vi->decl) == RESULT_DECL) >>>>>> + || TREE_CODE (vi->decl) == RESULT_DECL >>>>>> + || TREE_CODE (vi->decl) == FUNCTION_DECL) >>>>>> { >>>>>> /* If we are in IPA mode we will not recompute points-to >>>>>> sets after inlining so make sure they stay valid. */ >>>>> >>>>> Thanks a lot. :) This is of great help. >>>>> >>>>> >>>>>> note that there isn't a convenient way to go back from a bit in the >>>>>> points-to bitmap to the actual FUNCTION_DECL refered to. >>>>> >>>>> The bitmap is set by identifying the bit using DECL_PT_UID. >>>>> For variables, referenced_var_lookup returns the associated variable. >>>> >>>> Note that this table is gone from recent GCC. >>>> >>>>> For FUNCTION_DECL's, all we need to do is store a mapping between uid >>>>> and >>>>> FUNCTION_DECL. >>>>> Is this correct? >>>> >>>> Correct. >>>> >>>> Richard. >>>> >>>>>> Richard. >>>>>> >>>>>>>> What is the reason that it is not preserved for function pointers? >>>>>>> >>>>>>> Nobody uses this information. >>>>>>> >>>>>>>> Another alternative approach would be to replicate the code (of >>>>>>>> pass_ipa_pta) and use the information before deleting it. >>>>>>>> >>>>>>>> Is there any other way to access this information? >>>>>>> >>>>>>> You can of course recompute it when needed. >>>>>>> >>>>>>> Richard. >>>>>>> >>>>>>>>>> How can I access this information? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> Swati >>>>>>> >>>>>>> >