+/*
+ * Project: libFIRM
+ * File name: ir/common/firmwalk.c
+ * Purpose: Walker that touches all Firm data structures
+ * Author: Sebastian Felis
+ * Modified by:
+ * Created: 7.2003
+ * CVS-ID: $Id$
+ * Copyright: (c) 2003 Universität Karlsruhe
+ * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
+ */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
+#include <string.h>
+
#include "firmwalk.h"
-#include "pmap.h"
-#include "entity.h"
-#include "irprog.h"
+
+#include "entity_t.h"
+#include "irnode_t.h"
+#include "irprog_t.h"
#include "irgwalk.h"
+
#include "array.h"
#include "obst.h"
-#include <string.h>
+#include "pmap.h"
/** obstack for firm walker */
static struct obstack fw_obst;
get_firm_walk_link. */
} fw_data;
-//@{
+/*@{ */
/** Access macros to fw_data structure */
#define FW_GET_DATA_LIST(s) ((s)->list)
#define FW_SET_DATA_LIST(s, t) ((s)->list = (t))
#define FW_GET_DATA_LINK(s) ((s)->link)
#define FW_SET_DATA_LINK(s, t) ((s)->link = (t))
-//@}
+/*@} */
/** Returns own data struct of the firm walker.
*
}
}
break;
- default: {} // other kinds of firm nodes
+ default: {} /* other kinds of firm nodes */
}
return data;
}
}
break;
- default: {} // other kinds of firm nodes
+ default: {} /* other kinds of firm nodes */
}
}
-// documentation in header file
+/* documentation in header file */
void set_firm_walk_link(void *thing, void *link)
{
fw_data *data;
case k_ir_mode:
set_mode_link(thing, link);
break;
- default: {} // other kinds of firm nodes
+ default: {} /* other kinds of firm nodes */
}
}
-// documentation in header file
+/* documentation in header file */
void *get_firm_walk_link(void *thing)
{
fw_data *data;
switch (get_kind(tore)) {
case k_entity:
ent = (entity *)tore;
- // append entity to list
+ /* append entity to list */
set_entity_link(ent, NULL);
if (!pmap_contains(entity_map, ent))
pmap_insert(entity_map, ent, env);
case k_type:
tp = (type *)tore;
mode = get_type_mode(tp);
- // append type to list
+ /* append type to list */
set_type_link(tp, NULL);
if (!pmap_contains(type_map, tp))
pmap_insert(type_map, tp, env);
void fw_collect_irn(ir_node *irn, void *env)
{
fw_data *data;
- ir_mode* mode = get_irn_mode(irn);
+ ir_mode *mode = get_irn_mode(irn);
/* The link field will be cleared in the walk_do_mode()
callback function. */
else
{
/* add this node to block's node list */
- ir_node *block = get_nodes_Block(irn);
+ ir_node *block = get_nodes_block(irn);
data = fw_get_data(block);
ARR_APP1(ir_node *, FW_GET_DATA_LIST(data), irn);
}
pmap_insert(mode_map, mode_b, NULL);
*/
- // Collect all types (also unused types) if flag is set
+ /* Collect all types (also unused types) if flag is set */
if (FW_WITH_ALL_TYPES & flags)
type_walk(fw_collect_tore, NULL, NULL);
- // for each ir graph
+ /* for each ir graph */
for (i = 0; i < get_irp_n_irgs(); i++)
{
ir_graph *irg = get_irp_irg(i);
pmap_destroy(entity_map);
entity_map = NULL;
- // free all collected data from ir graphs and nodes
+ /* free all collected data from ir graphs and nodes */
for (i = 0; i < get_irp_n_irgs(); i++)
{
ir_graph *irg = get_irp_irg(i);
int irg_i, block_i, block_list_len, irn_i, irn_list_len;
pmap_entry *entry;
fw_data *data;
- ir_graph *irg;
ir_node *block, **block_list, **irn_list;
+ ir_graph *saved_irg = current_ir_graph;
assert(wif && "firm_walk() in firmwalk.c: No walking interface defined!");
for (irg_i = 0; irg_i < get_irp_n_irgs(); irg_i++)
{
- irg = get_irp_irg(irg_i);
+ current_ir_graph = get_irp_irg(irg_i);
/* walk over all ir graph */
- if (wif->do_graph) wif->do_graph(irg, wif->env);
+ if (wif->do_graph) wif->do_graph(current_ir_graph, wif->env);
/* walk over all irg's block nested ========================== */
- data = fw_get_data(irg);
+ data = fw_get_data(current_ir_graph);
block_list = FW_GET_DATA_LIST(data);
block_list_len = ARR_LEN(block_list);
for (block_i = 0; block_i < block_list_len; block_i++)
{
- if (wif->do_block_init) wif->do_block_init(irg, wif->env);
+ if (wif->do_block_init) wif->do_block_init(current_ir_graph, wif->env);
block = (ir_node *)block_list[block_i];
if (wif->do_block) wif->do_block(block, wif->env);
irn_list = FW_GET_DATA_LIST(data);
irn_list_len = ARR_LEN(irn_list);
- // call block as prefix ir node
+ /* call block as prefix ir node */
if ((wif->do_node) &&
- (wif->flags & FW_DUMP_BLOCK_AS_IRN & !FW_DUMP_IRN_IN_PREFIX))
+ (wif->flags & (FW_DUMP_BLOCK_AS_IRN | FW_DUMP_IRN_IN_PREFIX)))
wif->do_node(block, wif->env);
- // do ir nodes in prefix or postfix order?
+ /* do ir nodes in prefix or postfix order? */
if (wif->flags & FW_DUMP_IRN_IN_PREFIX)
irn_i = irn_list_len-1;
else
{
if (wif->do_node) wif->do_node((ir_node *)irn_list[irn_i], wif->env);
- // do ir nodes in prefix or postfix order?
+ /* do ir nodes in prefix or postfix order? */
if (wif->flags & FW_DUMP_IRN_IN_PREFIX)
irn_i--;
else
irn_i++;
}
- // call block as postfix ir node
+ /* call block as postfix ir node */
if ((wif->do_node) &&
- (wif->flags & (FW_DUMP_BLOCK_AS_IRN | FW_DUMP_IRN_IN_PREFIX)))
+ ((wif->flags & (FW_DUMP_BLOCK_AS_IRN | FW_DUMP_IRN_IN_PREFIX))
+ == FW_DUMP_BLOCK_AS_IRN))
wif->do_node(block, wif->env);
/* wall over all block's ir nodes nested end =============== */
- if (wif->do_block_finalize) wif->do_block_finalize(irg, wif->env);
- } // for each block
+ if(wif->do_block_post)
+ wif->do_block_post(block, wif->env);
+
+ } /* for each block */
+
+ if (wif->do_block_finalize)
+ wif->do_block_finalize(current_ir_graph, wif->env);
/* walk over all irg's block nested end ====================== */
+ if(wif->do_graph_post)
+ wif->do_graph_post(current_ir_graph, wif->env);
+
+ } /* for each ir graph irg */
+
+ if(wif->do_graph_finalize)
+ wif->do_graph_finalize(wif->env);
- } // for each ir graph irg
- if (wif->do_graph_finalize) wif->do_graph_finalize(wif->env);
+ /** ### ToDo: Dump const_code_irg ?? No! Dump const code with entities, types etc. */
- /** ### ToDo: Dump const_code_irg ?? */
+ /* restore the state of current_ir_graph */
+ current_ir_graph = saved_irg;
}