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? 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 >>>>> >>>>> >