5 File name: ir/ana/pto_init.c
6 Purpose: Initialisation Functions
9 Created: Sat Nov 13 19:35:27 CET 2004
11 Copyright: (c) 1999-2004 Universität Karlsruhe
12 Licence: This file is protected by the GPL - GNU GENERAL PUBLIC LICENSE.
20 pto_init: Initialisation Functions
27 # include "pto_init.h"
28 # include "pto_debug.h"
29 # include "pto_comp.h"
30 # include "pto_name.h"
31 # include "pto_util.h"
33 # include "typewalk.h"
41 # define obstack_chunk_alloc xmalloc
42 # define obstack_chunk_free free
44 /* Local Data Types: */
45 typedef struct init_env_str
50 typedef struct reset_env_str
55 /* Local Variables: */
56 extern struct obstack *qset_obst; /* from pto_name */
58 static struct obstack *pto_obst = NULL; /* all pto_t's go onto this one */
60 /* Local Prototypes: */
62 /* ===================================================
64 =================================================== */
65 /** Allocate a new pto */
66 static pto_t *new_pto (ir_node *node)
68 pto_t *pto = obstack_alloc (pto_obst, sizeof (pto_t));
69 pto->values = qset_new (N_INITIAL_OJBS, qset_obst);
74 /** Allocate a new alloc_pto */
75 static alloc_pto_t *new_alloc_pto (ir_node *alloc, int n_ctxs)
78 alloc_pto_t *alloc_pto = obstack_alloc (pto_obst, sizeof (alloc_pto_t));
81 assert (op_Alloc == get_irn_op(alloc));
83 tp = get_Alloc_type (alloc);
85 alloc_pto->ptos = (pto_t**) obstack_alloc (pto_obst, n_ctxs * sizeof (pto_t*));
87 for (i = 0; i < n_ctxs; i ++) {
88 desc_t *desc = new_name (tp, alloc, i);
89 alloc_pto->ptos [i] = new_pto (alloc);
90 qset_insert (alloc_pto->ptos [i]->values, desc);
96 /** Allocate a new pto for a symconst */
97 static pto_t* new_symconst_pto (ir_node *symconst)
103 assert (op_SymConst == get_irn_op(symconst));
105 pto = new_pto (symconst);
106 ent = get_SymConst_entity (symconst);
109 const char *ent_name = (char*) get_entity_name (ent);
110 const char *own_name = (char*) get_type_name (get_entity_owner (ent));
111 HERE3 ("start", own_name, ent_name);
113 /* Ok, so if the symconst has a pointer-to-mumble, it's some address
114 calculation, but if it's the mumble itself, it's just the same,
115 except it's presumably a constant of mumble. In any case, we need to
116 branch on this. "How's that for object fucking oriented? --jwz" */
117 if (is_Pointer_type (get_entity_type (ent))) {
118 desc = new_ent_name (ent);
119 } else if (is_Class_type (get_entity_type (ent))) {
120 desc = new_name (get_entity_type (ent), symconst, -1);
122 fprintf (stderr, "%s: not handled: %s[%li] (\"%s\")\n",
124 get_op_name (get_irn_op (symconst)),
125 get_irn_node_nr (symconst),
126 get_entity_name (ent));
127 assert (0 && "something not handled");
130 qset_insert (pto->values, desc);
132 /* HERE3 ("end", own_name, ent_name); */
137 /* Helper to pto_init --- clear the link fields of class types */
138 static void clear_type_link (type_or_ent *thing, void *_unused)
140 if (is_type (thing)) {
141 type *tp = (type*) thing;
143 if (is_Class_type (tp)) {
144 DBGPRINT (1, (stdout, "%s (\"%s\")\n",
146 get_type_name (tp)));
148 set_type_link (tp, NULL);
150 } else if (is_entity (thing)) {
151 entity *ent = (entity*) thing;
153 DBGPRINT (1, (stdout, "%s (\"%s\")\n",
155 get_entity_name (ent)));
157 set_entity_link (ent, NULL);
161 /** Helper to pto_init_graph --- clear the links of the given node */
162 static void clear_node_link (ir_node *node, void *_unused)
164 set_irn_link (node, NULL);
167 /** Helper to pto_init_graph --- clear the links of all nodes */
168 static void clear_graph_links (ir_graph *graph)
170 irg_walk_graph (graph, clear_node_link, NULL, NULL);
173 /** Reset ALL the pto values for a new pass */
174 static void reset_node_pto (ir_node *node, void *env)
176 reset_env_t *reset_env = (reset_env_t*) env;
177 int ctx_idx = reset_env->ctx_idx;
178 opcode op = get_irn_opcode (node);
180 /* HERE ("start"); */
185 case (iro_Block): /* END BLOCK only */
187 /* allocate 'empty' pto values */
188 pto_t *pto = new_pto (node);
189 set_node_pto (node, pto);
193 /* set alloc to 'right' current pto */
194 alloc_pto_t *alloc_pto = (alloc_pto_t*) get_irn_link (node);
195 alloc_pto->curr_pto = alloc_pto->ptos [ctx_idx];
197 DBGPRINT (1, (stdout, "%s: setting pto of \"%s[%li]\" for ctx %i\n",
203 assert (alloc_pto->curr_pto);
206 case (iro_SymConst): {
207 /* nothing, leave as-is */
211 /* basically, nothing */
212 DBGPRINT (2, (stdout, "%s: resetting pto of \"%s[%li]\"\n",
216 set_node_pto (node, NULL);
223 /** Initialise primary name sources */
224 static void init_pto (ir_node *node, void *env)
226 init_env_t *init_env = (init_env_t*) env;
227 int n_ctxs = init_env->n_ctxs;
229 opcode op = get_irn_opcode (node);
232 case (iro_SymConst): {
233 if (mode_is_reference (get_irn_mode (node))) {
234 entity *ent = get_SymConst_entity (node);
235 type *tp = get_entity_type (ent);
236 if (is_Class_type (tp) || is_Pointer_type (tp)) {
237 pto_t *symconst_pto = new_symconst_pto (node);
238 set_node_pto (node, symconst_pto);
241 DBGPRINT (1, (stdout, "%s: new name \"%s\" for \"%s[%li]\"\n",
243 get_entity_name (ent),
251 alloc_pto_t *alloc_pto = new_alloc_pto (node, n_ctxs);
254 set_alloc_pto (node, alloc_pto);
256 tp = get_Alloc_type (node); /* debugging only */
257 DBGPRINT (1, (stdout, "%s: %i names \"%s\" for \"%s[%li]\"\n",
266 tarval *tv = get_Const_tarval (node);
268 /* only need 'NULL' pointer constants */
269 if (mode_P == get_tarval_mode (tv)) {
270 if (get_tarval_null (mode_P) == tv) {
271 pto_t *pto = new_pto (node);
272 set_node_pto (node, pto);
279 /* nothing --- handled by reset_node_pto on each pass */
288 /** Initialise the given graph for a new pass run */
289 static void pto_init_graph_allocs (ir_graph *graph)
291 graph_info_t *ginfo = ecg_get_info (graph);
292 init_env_t *init_env;
294 init_env = xmalloc (sizeof (init_env_t));
295 init_env->n_ctxs = ginfo->n_ctxs;
297 /* HERE ("start"); */
299 irg_walk_graph (graph, init_pto, NULL, init_env);
302 memset (init_env, 0x00, sizeof (init_env_t));
306 /* ===================================================
307 Exported Implementation:
308 =================================================== */
309 /* "Fake" the arguments to the main method */
310 void fake_main_args (ir_graph *graph)
312 /* HERE ("start"); */
314 entity *ent = get_irg_entity (graph);
315 type *mtp = get_entity_type (ent);
316 ir_node **args = find_irg_args (graph);
317 type *ctp = get_method_param_type (mtp, 1); /* ctp == char[]*[]* */
321 /* 'main' has signature 'void(int, char[]*[]*)' */
322 assert (NULL == args [2]);
324 assert (is_Pointer_type (ctp));
326 ctp = get_pointer_points_to_type (ctp); /* ctp == char[]*[] */
328 assert (is_Array_type (ctp));
330 arg_desc = new_name (ctp, args [1], -1);
331 arg_pto = new_pto (args [1]);
332 /* todo: simulate 'store' to arg1[] ?!? */
333 qset_insert (arg_pto->values, arg_desc);
335 set_node_pto (args [1], arg_pto);
337 DBGPRINT (1, (stdout, "%s:%i (%s[%li])\n",
338 __FUNCTION__, __LINE__,
339 OPNAME (args [1]), OPNUM (args [1])));
341 # ifdef TEST_MAIN_TYPE
342 ctp = get_array_element_type (ctp); /* ctp == char[]* */
344 assert (is_Pointer_type (ctp));
346 ctp = get_pointer_points_to_type (ctp); /* ctp == char[] */
348 assert (is_Array_type (ctp));
350 ctp = get_array_element_type (ctp); /* ctp == char */
352 assert (is_primitive_type (ctp));
353 # endif /* defined TEST_MAIN_TYPE */
358 /* Initialise the Init module */
359 void pto_init_init (void)
361 pto_obst = (struct obstack*) xmalloc (sizeof (struct obstack));
363 obstack_init (pto_obst);
366 /* Cleanup the Init module */
367 void pto_init_cleanup (void)
369 obstack_free (pto_obst, NULL);
370 memset (pto_obst, 0x00, sizeof (struct obstack));
376 /* Initialise the Names of the Types/Entities */
377 void pto_init_type_names (void)
379 /* HERE ("start"); */
380 type_walk (clear_type_link, NULL, NULL);
384 /* Initialise the given graph for a new pass run */
385 void pto_init_graph (ir_graph *graph)
388 graph_info_t *ginfo = ecg_get_info (graph);
389 const int n_ctxs = ginfo->n_ctxs;
391 /* only for debugging stuff: */
392 entity *ent = get_irg_entity (graph);
393 const char *ent_name = (char*) get_entity_name (ent);
394 const char *own_name = (char*) get_type_name (get_entity_owner (ent));
396 DBGPRINT (2, (stdout, "%s: init \"%s.%s\" for %i ctxs\n",
398 own_name, ent_name, n_ctxs));
400 /* HERE ("start"); */
402 clear_graph_links (graph);
403 pto_init_graph_allocs (graph);
407 assert (NULL == get_irg_proj_args (graph));
408 proj_args = find_irg_args (graph);
409 set_irg_proj_args (graph, proj_args);
410 assert (proj_args == get_irg_proj_args (graph));
413 /* Reset the given graph for a new pass run */
414 void pto_reset_graph_pto (ir_graph *graph, int ctx_idx)
416 reset_env_t *reset_env;
418 reset_env = (reset_env_t*) xmalloc (sizeof (reset_env_t));
419 reset_env->ctx_idx = ctx_idx;
421 /* HERE ("start"); */
423 irg_walk_graph (graph, reset_node_pto, NULL, reset_env);
426 memset (reset_env, 0x00, sizeof (reset_env_t));
433 Revision 1.19 2005/06/17 17:42:32 beck
435 fixed (void) function headers
437 Revision 1.18 2005/02/16 13:27:52 beck
438 added needed tv.h include
440 Revision 1.17 2005/01/14 14:12:51 liekweg
441 prepare gnu extension fix
443 Revision 1.16 2005/01/14 13:36:50 liekweg
444 don't put environments on the stack; handle consts
446 Revision 1.15 2005/01/10 17:26:34 liekweg
447 fixup printfs, don't put environments on the stack
449 Revision 1.14 2005/01/05 14:25:54 beck
450 renames all is_x*_type() functions to is_X*_type() to prevent name clash with EDG fronten
452 Revision 1.13 2004/12/21 15:07:55 beck
453 removed C99 contructs
454 removed unnecessary allocation
455 removed use of mode_P, use mode_is_reference() instead
456 removed handling of Const with pointer tarvals, these constructs are removed
458 Revision 1.12 2004/12/20 17:41:14 liekweg
461 Revision 1.11 2004/12/20 17:34:35 liekweg
462 fix recursion handling
464 Revision 1.10 2004/12/15 13:31:00 liekweg
465 store ctx idx in names
467 Revision 1.9 2004/12/15 09:18:18 liekweg
470 Revision 1.8 2004/12/02 16:17:51 beck
471 fixed config.h include
473 Revision 1.7 2004/11/30 14:47:54 liekweg
474 fix initialisation; do correct iteration
476 Revision 1.6 2004/11/26 16:00:41 liekweg
477 recognize class consts vs. ptr-to-class consts
479 Revision 1.5 2004/11/24 14:53:56 liekweg
482 Revision 1.4 2004/11/20 21:21:56 liekweg
483 Finalise initialisation
485 Revision 1.3 2004/11/18 16:37:07 liekweg