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