5 * File name: ir/ana/pto.c
9 * Created: Mon 18 Oct 2004
11 * Copyright: (c) 1999-2004 Universität Karlsruhe
12 * Licence: This file is protected by GPL - GNU GENERAL PUBLIC LICENSE.
22 # include "irnode_t.h"
23 # include "irprog_t.h"
35 # endif /* not defined TRUE */
37 typedef struct walk_mem_env_str {
38 ir_graph *graph; /* the graph we're visiting */
39 int visited; /* 'visited' marker */
40 irg_walk_func *pre; /* pre action */
41 irg_walk_func *post; /* post action */
42 void *env; /* user-defined environment */
44 struct walk_mem_env_str *prev; /* link up walking instances */
48 /* Link up walking instances */
49 static walk_mem_env_t *walk_envs = NULL;
54 static void print_node_pre (ir_node *node, void *__unused)
56 fprintf (stdout, "PRE MEM Node (0x%08x) (%s)\n",
58 get_op_name (get_irn_op (node)));
61 static void print_node_post (ir_node *node, void *__unused)
63 const opcode op = get_irn_opcode (node);
68 ir_graph *graph = NULL;
69 fprintf (stdout, "POST MEM Call Node (0x%08x)\n",
72 ir_node *ptr = get_Call_ptr (node);
74 if (iro_Sel == get_irn_opcode (ptr)) {
75 ent = get_Sel_entity (ptr);
76 } else if (iro_SymConst == get_irn_opcode (ptr)) {
77 if (get_SymConst_kind(ptr) == symconst_addr_ent) {
78 ent = get_SymConst_entity (ptr);
83 graph = get_entity_irg (ent);
85 if (! get_irg_is_mem_visited (graph)) {
87 fprintf (stdout, " -> visit graph (0x%08x) of \"%s.%s\"\n",
89 get_type_name (get_entity_owner (get_irg_entity (graph))),
90 get_entity_name (get_irg_entity (graph)));
92 irg_walk_mem (graph, print_node_pre, print_node_post, NULL);
98 fprintf (stdout, "POST MEM Node (0x%08x) (%s)\n",
100 get_op_name (get_irn_op (node)));
109 See whether the given graph is being visited right now.
111 int get_irg_is_mem_visited (ir_graph *graph)
113 walk_mem_env_t *walk_env = walk_envs;
115 while (NULL != walk_env) {
116 if (graph == walk_env->graph) {
120 walk_env = walk_env->prev;
127 Walk over the firm nodes of a graph via the memory edges (only)
128 starting from a node that has a memory input.
130 void irg_walk_mem_node (ir_node *node,
131 walk_mem_env_t *walk_env)
133 const opcode op = get_irn_opcode (node);
136 if (get_irn_visited (node) >= walk_env->visited) {
139 set_irn_visited (node, walk_env->visited + 1);
142 fprintf (stdout, "Node (0x%08x).op = %s\n", (int)
144 get_op_name (get_irn_op (node)));
146 if (NULL != walk_env->pre) {
147 walk_env->pre (node, walk_env->env);
154 in = get_Load_mem (node);
156 irg_walk_mem_node (in, walk_env);
159 in = get_Store_mem (node);
161 irg_walk_mem_node (in, walk_env);
164 in = get_Alloc_mem (node);
166 irg_walk_mem_node (in, walk_env);
169 in = get_Free_mem (node);
171 irg_walk_mem_node (in, walk_env);
174 in = get_Raise_mem (node);
176 irg_walk_mem_node (in, walk_env);
179 in = get_Sel_mem (node);
181 irg_walk_mem_node (in, walk_env);
184 in = get_Call_mem (node);
186 irg_walk_mem_node (in, walk_env);
189 in = get_Return_mem (node);
191 irg_walk_mem_node (in, walk_env);
194 in = get_Proj_pred (node);
196 irg_walk_mem_node (in, walk_env);
200 int n_ins = get_irn_arity (node);
203 for (i = 0; i < n_ins; i ++) {
204 in = get_irn_n (node, i);
206 irg_walk_mem_node (in, walk_env);
210 in = get_Div_mem (node);
212 irg_walk_mem_node (in, walk_env);
215 in = get_Quot_mem (node);
217 irg_walk_mem_node (in, walk_env);
220 in = get_Mod_mem (node);
222 irg_walk_mem_node (in, walk_env);
225 in = get_DivMod_mem (node);
227 irg_walk_mem_node (in, walk_env);
230 assert (0 && "something not handled");
234 if (NULL != walk_env->post) {
235 walk_env->post (node, walk_env->env);
240 Walk over the nodes of the given graph via the memory edges (only).
241 Each graph can only be subject to this walk once at any given time.
243 void irg_walk_mem (ir_graph *graph,
244 irg_walk_func *pre, irg_walk_func *post,
249 ir_node *end = get_irg_end_block (graph);
251 walk_mem_env_t *walk_env = (walk_mem_env_t*) xmalloc (sizeof (walk_mem_env_t));
253 assert (! get_irg_is_mem_visited (graph));
255 walk_env->graph = graph;
256 inc_irg_visited (walk_env->graph);
257 walk_env->visited = get_irg_visited (graph);
259 walk_env->prev = walk_envs;
260 walk_envs = walk_env;
263 walk_env->post = post;
266 /* 'graph' is not actually being visited right now, but it should be reported that way */
267 assert (get_irg_is_mem_visited (graph));
269 /* all return nodes */
270 n_ins = get_irn_arity (end);
271 for (i = 0; i < n_ins; i ++) {
272 ret = get_irn_n (end, i);
274 irg_walk_mem_node (ret, walk_env);
278 The end NODE sometimes has some more ins. not sure whether we need to walk them.
281 /* allow only properly nested calls right now */
282 assert (walk_envs == walk_env);
283 walk_envs = walk_envs->prev;
287 assert (! get_irg_is_mem_visited (graph));
297 fprintf (stdout, "START PTO TEST\n");
299 for (i = 0; i < get_irp_n_irgs(); i++) {
300 ir_graph *graph = get_irp_irg (i);
302 fprintf (stdout, "START GRAPH (0x%08x) of \"%s.%s\"\n",
304 get_type_name (get_entity_owner (get_irg_entity (graph))),
305 get_entity_name (get_irg_entity (graph)));
306 irg_walk_mem (graph, print_node_pre, print_node_post, NULL);
307 fprintf (stdout, "END GRAPH (0x%08x)\n", (int) graph);
310 fprintf (stdout, "END PTO TEST\n");
316 * Revision 1.1 2004/10/20 14:59:42 liekweg
317 * Added ana2, added ecg and pto