/* -*- 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 <config.h>
-# 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 <string.h>
+#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);
- }
+\f
+/*
+ $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
- *
- */
+*/