X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fana2%2Fpto.c;h=12547832e5dfd4fc1ebc2f59baddbeaa1d5f2636;hb=f274dcf35aa0d3f4748387dbddfe50e8d7d44951;hp=27769fd7539de8e12ac2dffe079df7c463c9ace9;hpb=ca913a4d0dd937845c6c951602e03f4a1948f574;p=libfirm diff --git a/ir/ana2/pto.c b/ir/ana2/pto.c index 27769fd75..12547832e 100644 --- a/ir/ana2/pto.c +++ b/ir/ana2/pto.c @@ -1,319 +1,171 @@ /* -*- c -*- */ /* - * Project: libFIRM - * File name: ir/ana/pto.c - * Purpose: Pto - * Author: Florian - * Modified by: - * Created: Mon 18 Oct 2004 - * CVS-ID: $Id$ - * Copyright: (c) 1999-2004 Universität Karlsruhe - * Licence: This file is protected by GPL - GNU GENERAL PUBLIC LICENSE. - */ - - -# ifdef HAVE_CONFIG_H -# include -# endif + Project: libFIRM + File name: ir/ana/pto.c + Purpose: Entry to PTO + Author: Florian + Modified by: + Created: Tue Nov 23 18:37:09 CET 2004 + CVS-ID: $Id$ + Copyright: (c) 1999-2004 Universität Karlsruhe + Licence: This file is protected by the GPL - GNU GENERAL PUBLIC LICENSE. +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* + pto: Entry to PTO +*/ + +#ifdef HAVE_STRING_H +# include +#endif # include "pto.h" # include "irnode_t.h" -# include "irprog_t.h" - -# include "eset.h" -# include "irgwalk.h" -# include "irgmod.h" -# include "irvrfy.h" -# include "trvrfy.h" +# include "irprog.h" # include "xmalloc.h" -# ifndef TRUE -# define TRUE 1 -# define FALSE 0 -# endif /* not defined TRUE */ +# include "pto_debug.h" +# include "pto_init.h" +# include "pto_name.h" +# include "pto_ctx.h" +# include "ecg.h" -typedef struct walk_mem_env_str { - ir_graph *graph; /* the graph we're visiting */ - int visited; /* 'visited' marker */ - irg_walk_func *pre; /* pre action */ - irg_walk_func *post; /* post action */ - void *env; /* user-defined environment */ +/* Local Defines: */ - struct walk_mem_env_str *prev; /* link up walking instances */ - /* what else? */ -} walk_mem_env_t; +/* Local Data Types: */ -/* Link up walking instances */ -static walk_mem_env_t *walk_envs = NULL; +/* Local Variables: */ +extern char *spaces; -/* MEMORY WALK */ +/* Local Prototypes: */ -/* BEGIN TEST */ -static void print_node_pre (ir_node *node, void *__unused) -{ - fprintf (stdout, "PRE MEM Node (0x%08x) (%s)\n", - (int) node, - get_op_name (get_irn_op (node))); -} +/* =================================================== + Local Implementation: + =================================================== */ -static void print_node_post (ir_node *node, void *__unused) +/* Helper to pto_init */ +static void pto_init_graph_wrapper (graph_info_t *ginfo, void *_unused) { - const opcode op = get_irn_opcode (node); - - - if (iro_Call == op) { - entity *ent = NULL; - ir_graph *graph = NULL; - fprintf (stdout, "POST MEM Call Node (0x%08x)\n", - (int) node); - - ir_node *ptr = get_Call_ptr (node); - - if (iro_Sel == get_irn_opcode (ptr)) { - ent = get_Sel_entity (ptr); - } else if (iro_SymConst == get_irn_opcode (ptr)) { - if (get_SymConst_kind(ptr) == symconst_addr_ent) { - ent = get_SymConst_entity (ptr); - } - } - - if (NULL != ent) { - graph = get_entity_irg (ent); - if (NULL != graph) { - if (! get_irg_is_mem_visited (graph)) { - - fprintf (stdout, " -> visit graph (0x%08x) of \"%s.%s\"\n", - (int) graph, - get_type_name (get_entity_owner (get_irg_entity (graph))), - get_entity_name (get_irg_entity (graph))); - - irg_walk_mem (graph, print_node_pre, print_node_post, NULL); - } - } - } - - } else { - fprintf (stdout, "POST MEM Node (0x%08x) (%s)\n", - (int) node, - get_op_name (get_irn_op (node))); - } + ir_graph *graph = ginfo->graph; + pto_init_graph (graph); } +/* =================================================== + Exported Implementation: + =================================================== */ +/* Initialise the module (not in pto_init.c because it's the entry to pto) */ +void pto_init (int lvl) +{ + set_dbg_lvl (lvl); -/* END TEST */ + ecg_init (1); -/* - See whether the given graph is being visited right now. -*/ -int get_irg_is_mem_visited (ir_graph *graph) -{ - walk_mem_env_t *walk_env = walk_envs; + /* Initialise the name module */ + pto_name_init (); - while (NULL != walk_env) { - if (graph == walk_env->graph) { - return (TRUE); - } + /* Initialise the init module */ + pto_init_init (); - walk_env = walk_env->prev; - } + /* allocate ctx-sens names for allocs and set ... etc etc */ + pto_init_type_names (); - return (FALSE); -} + /* initialise all graphs with the static names */ + ecg_iterate_graphs (pto_init_graph_wrapper, NULL); -/* - Walk over the firm nodes of a graph via the memory edges (only) - starting from a node that has a memory input. -*/ -void irg_walk_mem_node (ir_node *node, - walk_mem_env_t *walk_env) -{ - const opcode op = get_irn_opcode (node); - ir_node *in = NULL; - - if (get_irn_visited (node) >= walk_env->visited) { - return; - } else { - set_irn_visited (node, walk_env->visited + 1); - } - - fprintf (stdout, "Node (0x%08x).op = %s\n", (int) - node, - get_op_name (get_irn_op (node))); - - if (NULL != walk_env->pre) { - walk_env->pre (node, walk_env->env); - } - - switch (op) { - case (iro_Start): { - } break; - case (iro_Load): { - in = get_Load_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Store): { - in = get_Store_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Alloc): { - in = get_Alloc_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Free): { - in = get_Free_mem (node); - /* WTF? */ - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Raise): { - in = get_Raise_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Sel): { - in = get_Sel_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Call): { - in = get_Call_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Return): { - in = get_Return_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Proj): { - in = get_Proj_pred (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Phi): { - int i; - int n_ins = get_irn_arity (node); - - - for (i = 0; i < n_ins; i ++) { - in = get_irn_n (node, i); - - irg_walk_mem_node (in, walk_env); - } - } break; - case (iro_Div): { - in = get_Div_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Quot): { - in = get_Quot_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_Mod): { - in = get_Mod_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - case (iro_DivMod): { - in = get_DivMod_mem (node); - - irg_walk_mem_node (in, walk_env); - } break; - default: { - assert (0 && "something not handled"); - } - } - - if (NULL != walk_env->post) { - walk_env->post (node, walk_env->env); - } + /* debugging only */ + spaces = xmalloc (512 * sizeof (char)); + memset (spaces, ' ', 512); + spaces += 511; + *spaces = '\0'; + + /* initialise for the CTX-sensitive ecg-traversal */ + set_curr_ctx (get_main_ctx ()); } -/* - Walk over the nodes of the given graph via the memory edges (only). - Each graph can only be subject to this walk once at any given time. -*/ -void irg_walk_mem (ir_graph *graph, - irg_walk_func *pre, irg_walk_func *post, - void *env) +void pto_run (void) { - int i; - ir_node *ret = NULL; - ir_node *end = get_irg_end_block (graph); - int n_ins; - walk_mem_env_t *walk_env = (walk_mem_env_t*) xmalloc (sizeof (walk_mem_env_t)); + ir_graph *save; + ir_graph *graph = get_irp_main_irg (); - assert (! get_irg_is_mem_visited (graph)); + pto_reset_graph_pto (graph, 0); + fake_main_args (graph); - walk_env->graph = graph; - inc_irg_visited (walk_env->graph); - walk_env->visited = get_irg_visited (graph); + DBGPRINT (1, (stdout, "START PTO\n")); + DBGPRINT (1, (stdout, "START GRAPH (0x%08x) of \"%s.%s\"\n", + (int) graph, + get_type_name (get_entity_owner (get_irg_entity (graph))), + get_entity_name (get_irg_entity (graph)))); - walk_env->prev = walk_envs; - walk_envs = walk_env; + /* we need some kind of environment here: NULL */ + save = get_current_ir_graph (); + pto_graph (graph, 0, NULL); + set_current_ir_graph (save); - walk_env->pre = pre; - walk_env->post = post; - walk_env->env = env; + DBGPRINT (1, (stdout, "END PTO\n")); +} - /* 'graph' is not actually being visited right now, but it should be reported that way */ - assert (get_irg_is_mem_visited (graph)); +/* Dump all interesting stuff to a bunch of files */ +void pto_dump (void) +{ + pto_dump_names ("names.dot"); +} - /* all return nodes */ - n_ins = get_irn_arity (end); - for (i = 0; i < n_ins; i ++) { - ret = get_irn_n (end, i); +void pto_cleanup (void) +{ + /* todo: clean up our own mess */ + spaces -= 511; /* hope that all changes to spaces are + properly nested */ + memset (spaces, 0x00, 512); + free (spaces); + + /* Cleanup the name module */ + pto_name_cleanup (); + /* Cleanup the Init module */ + pto_init_cleanup (); + + /* clean up ecg infos */ + ecg_cleanup (); +} - irg_walk_mem_node (ret, walk_env); - } + +/* + $Log$ + Revision 1.17 2005/01/10 17:26:34 liekweg + fixup printfs, don't put environments on the stack - /* - The end NODE sometimes has some more ins. not sure whether we need to walk them. - */ + Revision 1.16 2004/12/22 14:43:14 beck + made allocations C-like - /* allow only properly nested calls right now */ - assert (walk_envs == walk_env); - walk_envs = walk_envs->prev; + Revision 1.15 2004/12/21 14:26:53 beck + removed C99 constructs - free (walk_env); + Revision 1.14 2004/12/20 17:41:14 liekweg + __unused -> _unused - assert (! get_irg_is_mem_visited (graph)); -} + Revision 1.13 2004/12/20 17:34:34 liekweg + fix recursion handling -/* - Test irg_walk_mem -*/ -void pto_test_mem () -{ - int i; + Revision 1.12 2004/12/02 16:17:51 beck + fixed config.h include - fprintf (stdout, "START PTO TEST\n"); + Revision 1.11 2004/11/30 15:49:27 liekweg + include 'dump' - for (i = 0; i < get_irp_n_irgs(); i++) { - ir_graph *graph = get_irp_irg (i); + Revision 1.10 2004/11/30 14:46:41 liekweg + Correctly reset main graph; remove dbugging stuff - fprintf (stdout, "START GRAPH (0x%08x) of \"%s.%s\"\n", - (int) graph, - get_type_name (get_entity_owner (get_irg_entity (graph))), - get_entity_name (get_irg_entity (graph))); - irg_walk_mem (graph, print_node_pre, print_node_post, NULL); - fprintf (stdout, "END GRAPH (0x%08x)\n", (int) graph); - } + Revision 1.9 2004/11/26 16:01:56 liekweg + debugging annotations - fprintf (stdout, "END PTO TEST\n"); -} + Revision 1.8 2004/11/24 14:54:21 liekweg + Added pto.c as main entry point -/* - * $Log$ - * Revision 1.1 2004/10/20 14:59:42 liekweg - * Added ana2, added ecg and pto - * - */ +*/