How to get the Tree ARRAY_TYPE declaration size

2010-03-22 Thread Massimo Nazaria
Hi everyone!

I need to get the array size from a declaration like "int v[100]" (here the 
size is "100").

For example:
  if (TREE_CODE (TREE_TYPE (var))) == ARRAY_TYPE) {
int array_size = // ...here I want to get the size
  }

How can I do?

Thank you
Max







Problem with ADDR_EXPR array offset

2010-03-24 Thread Massimo Nazaria
Hi everybody!
I'm working on a pass and I need to handle some pointer expressions.
For example, I have this C-code:
  int v[1000];
  int *p;  
  p = &v[10];

The problem is that, when I'm trying to parse "p = &v[10];", I'm not able to 
get the array offset (10 in this case).

Namely, for a given statement like "p = &v[10]", I need to get:
  array:  v  (I can do that)
  offset: 10

Here is the code I am working on:
  op0 = gimple_op (stmt, 0);
  op1 = gimple_op (stmt, 1);
  
  if (gimple_assign_rhs_code (stmt) == ADDR_EXPR)
{
  base = get_base_address (TREE_OPERAND (op1, 0)); // the array v, OK
  offset = // ???

How can I do?

Max






Re: Problem with ADDR_EXPR array offset

2010-03-25 Thread Massimo Nazaria
Thank you very much!!! :D

--- Mer 24/3/10, Ian Lance Taylor  ha scritto:

> Da: Ian Lance Taylor 
> Oggetto: Re: Problem with ADDR_EXPR array offset
> A: "Massimo Nazaria" 
> Cc: gcc@gcc.gnu.org
> Data: Mercoledì 24 marzo 2010, 23:59
> Massimo Nazaria 
> writes:
> 
> > I'm working on a pass and I need to handle some
> pointer expressions.
> > For example, I have this C-code:
> >   int v[1000];
> >   int *p;  
> >   p = &v[10];
> >
> > The problem is that, when I'm trying to parse "p =
> &v[10];", I'm not able to get the array offset (10 in
> this case).
> >
> > Namely, for a given statement like "p = &v[10]", I
> need to get:
> >   array:  v  (I can do that)
> >   offset: 10
> >
> > Here is the code I am working on:
> >   op0 = gimple_op (stmt, 0);
> >   op1 = gimple_op (stmt, 1);
> >   
> >   if (gimple_assign_rhs_code (stmt) ==
> ADDR_EXPR)
> >     {
> >       base = get_base_address
> (TREE_OPERAND (op1, 0)); // the array v, OK
> >       offset = // ???
> >
> > How can I do?
> 
> There is nothing wrong with calling get_base_address, but
> by doing
> that you have thrown away the offset information.  I
> would expected
> TREE_OPERAND (op1, 0) to be an ARRAY_REF.  Operand 0
> of that will be
> an array, operand 1 will be an index.
> 
> I would recommend taking a look at get_inner_reference
> rather than
> get_base_address.
> 
> Ian
> 





Problem with SSA form usign cgraph_nodes and push_cfun

2010-04-29 Thread Massimo Nazaria
Hi everybody!
I am working on a gcc-pass which processes every statement using this code:

  for (node = cgraph_nodes; node; node = node->next)
{
  if (node->analyzed && cgraph_is_master_clone (node))
{
  push_cfun (DECL_STRUCT_FUNCTION (node->decl));
  
  FOR_EACH_BB (bb)
{
// Here I would like to use SSA_NAME_DEF_STMT (gimple_assign_rhs1 
(stmt));


With the code above I can't use SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt)) 
(I get 'segmentation fault'). I think the reason is that the statements are not 
in SSA-form.

Insead, if I use

  FOR_EACH_BB (bb) { ... }

without using "for (node = graph_nodes; ...", I have the statements in SSA-form 
and SSA_NAME_DEF_STMT is OK.

Unfortunately, with this solution, I can not process every function at once...

How can I do to use SSA_NAME_DEF_STMT while processing every function?

Thank you!

Max






Re: Problem with SSA form usign cgraph_nodes and push_cfun

2010-04-30 Thread Massimo Nazaria
> You have to schedule your IPA pass at a point where the
> whole
> program is in SSA form, which is during the regular IPA
> passes
> at earlierst.
> 
> Richard.
> 

It does not work :(
I put my pass after all the ipa-passes and right before the optimization-passes.

My problem occurs when I try to process every function at once using 
"for(node=cgraph_nodes;node;node=node->next) ..."

Other ideas?

Thank you!





Re: Problem with SSA form usign cgraph_nodes and push_cfun

2010-04-30 Thread Massimo Nazaria
> You'll have to post your work so people can see. Now the
> best the
> experts here can do is guess what you're holding behind
> your back :-)
> 
> Ciao!
> Steven
> 

I completely agree with you. This is my pass:

static unsigned int
execute_mypass (void)
{
  basic_block bb;
  gimple stmt, def_stmt;
  gimple_stmt_iterator gsi;
  struct cgraph_node *node;
  unsigned int rhs_code_class;
  
  if (flag_mypass)
{
  for (node = cgraph_nodes; node; node = node->next)
{
  if (node->analyzed && cgraph_is_master_clone (node))
{
  push_cfun (DECL_STRUCT_FUNCTION (node->decl));
  
  FOR_EACH_BB (bb)
{
  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next 
(&gsi))
{
  stmt = gsi_stmt (gsi);
  
  if (gimple_code (stmt) == GIMPLE_ASSIGN)
{
/* Check if the assignment is acctually 
   a function call. For example:
 D.1 = func (args...);
 a.9 = D.1
 a = a.9
  The last one is seen as a GIMPLE_ASSIGN stmt 
  but I want to check if it refers to a function call */

  rhs_code_class = get_gimple_rhs_class 
(gimple_assign_rhs_code (stmt));
  if ((rhs_code_class == GIMPLE_UNARY_RHS) || 
(rhs_code_class == GIMPLE_SINGLE_RHS))
{
  if (is_temporary_var (gimple_assign_rhs1 (stmt))) 
// e.g.: a.1, D.1234...
{
  def_stmt = SSA_NAME_DEF_STMT 
(gimple_assign_rhs1 (stmt));
  
  fprintf (dump_file, "gimple_code: %d\n", 
gimple_code (def_stmt)); // Here I get segmentation fault...
}
}
}
}
}
  pop_cfun ();
}
}
}
  
  return 0;
}

The problem is that "SSA_NAME_DEF_STMT (gimple_assign_rhs1 (stmt))" does not 
return a gimple stmt. I think that's because, when I make a dump of the stmts 
with the code above, this one has not the SSA-form. But if only use the 
FOR_EACH (bb), without "for (node = cgraph_nodes; ...", the SS-form is OK and 
SSA_NAME_DEF_STMT works well.

How can I do?

Thank you!





Re: Problem with SSA form usign cgraph_nodes and push_cfun

2010-04-30 Thread Massimo Nazaria
> The place where you insert the patch is as important as
> the
> implementation of your patch. What do your changes to
> passes.c look
> like?

Here is the "passes.c":

   NEXT_PASS (pass_early_warn_uninitialized);
   NEXT_PASS (pass_all_early_optimizations);
  
   NEXT_PASS (pass_mypass);  // My pass...
  
{
  struct opt_pass **p = &pass_all_early_optimizations.pass.sub;
  NEXT_PASS (pass_rebuild_cgraph_edges);







Re: Problem with SSA form usign cgraph_nodes and push_cfun

2010-04-30 Thread Massimo Nazaria
Thank you everyone!!!
I found out a solution...

I had to add a line to my pass (the 2nd if):
for (node = cgraph_nodes; node; node = node->next) {
  if (node->analyzed && cgraph_is_master_clone (node)) {
if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))) return 0; // I 
added this line

In my case, the remaining code of the pass is executed only when the 
pass-manager is working on the last function of the input program. Now I can 
process every function at once, and the statements are in SSA-form.

Thank you again!

Max