How to get the Tree ARRAY_TYPE declaration size
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
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
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
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
> 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
> 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
> 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
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