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



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]