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

Reply via email to