This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: How to access points-to information for function pointers


On Mon, May 5, 2014 at 1:27 PM, Swati Rathi <swatirathi@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 <swatirathi@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 <swatirathi@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.guenther@gmail.com> wrote:
>>>>>>>
>>>>>>> On April 26, 2014 12:31:34 PM CEST, Swati Rathi
>>>>>>> <swatirathi@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
>>>>>>>>
>>>>>>>> <swatirathi@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
>>>>>>>
>>>>>>>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]