X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana2%2Fpto_util.c;h=b73c4d6d2f25e375bdafb96b2cbffdcc44ffbadd;hb=f274dcf35aa0d3f4748387dbddfe50e8d7d44951;hp=03c4b7c163a7231c7d7006fbf2acb2aa2ef0ba38;hpb=d07b7388a477ce7ce7ceb5fcf427b8db040ff55e;p=libfirm diff --git a/ir/ana2/pto_util.c b/ir/ana2/pto_util.c index 03c4b7c16..b73c4d6d2 100644 --- a/ir/ana2/pto_util.c +++ b/ir/ana2/pto_util.c @@ -12,9 +12,9 @@ Licence: This file is protected by the GPL - GNU GENERAL PUBLIC LICENSE. */ -# ifdef HAVE_CONFIG_H -# include -# endif +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif /* pto_util: Utilitites for PTO @@ -22,13 +22,18 @@ # include "pto_util.h" -# include "irnode.h" +# include "irnode_t.h" # include "irgwalk.h" # include "xmalloc.h" # include "pto_debug.h" +# include "gnu_ext.h" /* Local Defines: */ +# ifndef TRUE +# define TRUE 1 +# define FALSE 0 +# endif /* not defined TRUE */ /* Local Data Types: */ /* Environment for find_irg_args */ @@ -65,39 +70,47 @@ static void find_irg_arg (ir_node *node, void *env) Exported Implementation: =================================================== */ /* Find the arguments of a graph. For a method that has n args, the - result array has 'n+1' entries, the last of which is written NULL. */ + result array has 'n+1' entries, the last of which is written NULL. + Note that not all entries in [0..n-1] will be populated all the time. +*/ ir_node **find_irg_args (ir_graph *graph) { type *tp = get_entity_type (get_irg_entity (graph)); const int n_args = get_method_n_params (tp); - ir_node **args = (ir_node**) xmalloc (sizeof (ir_node*) * (n_args+1)); + ir_node **args = xcalloc (n_args + 1, sizeof (ir_node*)); ir_node *arg = get_irg_args (graph); - find_irg_args_env_t *arg_env = - (find_irg_args_env_t*) xmalloc (sizeof (find_irg_args_env_t)); + find_irg_args_env_t *arg_env; + + arg_env = (find_irg_args_env_t*) xmalloc (sizeof (find_irg_args_env_t)); arg_env->args = args; arg_env->arg = arg; - /* or use get_irg_end ?!? */ { ir_graph *save = get_current_ir_graph (); + set_current_ir_graph (graph); irg_walk (get_irg_end (graph), find_irg_arg, NULL, arg_env); set_current_ir_graph (save); } - free (arg_env); + memset (arg_env, 0x00, sizeof (find_irg_args_env_t)); + free (arg_env); args [n_args] = NULL; return (args); } + /* Get the entity of a ptr */ entity *get_ptr_ent (ir_node *ptr) { entity *ent = NULL; const opcode ptr_op = get_irn_opcode (ptr); switch (ptr_op) { + case (iro_Cast): { + ent = get_ptr_ent (get_Cast_op (ptr)); + } break; case (iro_Sel): { ent = get_Sel_entity (ptr); } break; @@ -118,11 +131,57 @@ entity *get_ptr_ent (ir_node *ptr) return (ent); } +/* Check whether the load of the given ptr is a dummy */ +int is_dummy_load_ptr (ir_node *ptr) +{ + const opcode ptr_op = get_irn_opcode (ptr); + switch (ptr_op) { + case (iro_Cast): { + return (is_dummy_load_ptr (get_Cast_op (ptr))); + } break; + case (iro_Sel): + case (iro_SymConst): { + return (FALSE); + } break; + + default: { + return (TRUE); + } + } +} /* $Log$ + Revision 1.16 2005/01/14 14:13:32 liekweg + fix gnu extension + + Revision 1.15 2005/01/10 17:26:34 liekweg + fixup printfs, don't put environments on the stack + + Revision 1.14 2004/12/23 15:47:09 beck + removed uneeded allocations + used new xcalloc + + Revision 1.13 2004/12/22 14:43:14 beck + made allocations C-like + + Revision 1.12 2004/12/21 15:53:12 beck + removed GNUC constructs + + Revision 1.11 2004/12/20 17:34:35 liekweg + fix recursion handling + + Revision 1.10 2004/12/06 12:55:06 liekweg + actually iterate + + Revision 1.9 2004/12/02 16:17:51 beck + fixed config.h include + + Revision 1.8 2004/11/26 15:59:14 liekweg + recognize dummy loads + Revision 1.7 2004/11/24 14:53:56 liekweg Bugfixes