1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
16 ir_graph *current_ir_graph;
18 /* Allocates a list of nodes:
19 - The start block containing a start node and Proj nodes for it's four
20 results (X, M, P, Tuple).
21 - The end block containing an end node. This block is not matured after
22 new_ir_graph as predecessors need to be added to it.
23 - The current block, which is empty and also not matured.
24 Further it allocates several datastructures needed for graph construction
28 new_ir_graph (entity *ent, int params)
34 res = (ir_graph *) malloc (sizeof (ir_graph));
35 current_ir_graph = res;
36 add_irp_irg(res); /* remember this graph global. */
38 /** Internal information for graph construction either held in the graph or
39 *** initialized for each graph. **/
40 res->params = params + 1; /* number of local variables that are never
41 dereferenced in this graph plus one for
42 the store. This is not the number of parameters
44 res->visited = 0; /* visited flag, for the ir walker */
45 res->block_visited=0; /* visited flag, for the 'block'-walker */
47 #if USE_EXPICIT_PHI_IN_STACK
48 res->Phi_in_stack = new_Phi_in_stack(); /* A stack needed for automatic Phi
51 res->obst = (struct obstack *) xmalloc (sizeof (struct obstack));
52 obstack_init (res->obst);
53 res->value_table = new_identities (); /* value table for global value numbering
54 for optimizing use in iropt.c */
56 /** Type inforamtion for the procedure of the graph **/
59 /** Nodes needed in every graph **/
60 res->end_block = new_Block ();
61 res->end = new_End ();
63 res->start_block = new_Block ();
64 res->start = new_Start ();
65 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
67 /* Proj results of start node */
68 projX = new_Proj (res->start, mode_X, pns_initial_exec);
69 set_store (new_Proj (res->start, mode_M, pns_global_store));
70 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
71 res->globals = new_Proj (res->start, mode_p, pns_globals);
72 res->args = new_Proj (res->start, mode_T, pns_args);
74 add_in_edge(res->start_block, projX);
75 // The code generation needs it. leave it in now.
76 // Use of this edge is matter of discussion, unresolved. Also possible:
77 // add_in_edge(res->start_block, res->start_block), but invalid typed.
79 mature_block (res->current_block);
81 /** Make a block to start with **/
82 first_block = new_Block ();
83 add_in_edge (first_block, projX);
88 /* access routines for all ir_graph attributes:
90 {attr type} get_irg_{attribute name} (ir_graph *irg);
91 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
94 get_irg_start_block (ir_graph *irg)
96 return irg->start_block;
100 set_irg_start_block (ir_graph *irg, ir_node *node)
102 irg->start_block = node;
106 get_irg_start (ir_graph *irg)
112 set_irg_start(ir_graph *irg, ir_node *node)
118 get_irg_end_block (ir_graph *irg)
120 return irg->end_block;
124 set_irg_end_block (ir_graph *irg, ir_node *node)
126 irg->end_block = node;
130 get_irg_end (ir_graph *irg)
136 set_irg_end (ir_graph *irg, ir_node *node)
142 get_irg_cstore (ir_graph *irg)
148 set_irg_cstore (ir_graph *irg, ir_node *node)
154 get_irg_frame (ir_graph *irg)
160 set_irg_frame (ir_graph *irg, ir_node *node)
166 get_irg_globals (ir_graph *irg)
172 set_irg_globals (ir_graph *irg, ir_node *node)
178 get_irg_args (ir_graph *irg)
184 set_irg_args (ir_graph *irg, ir_node *node)
190 get_irg_bad (ir_graph *irg)
196 set_irg_bad (ir_graph *irg, ir_node *node)
202 get_irg_current_block (ir_graph *irg)
204 return irg->current_block;
208 set_irg_current_block (ir_graph *irg, ir_node *node)
210 irg->current_block = node;
214 get_irg_ent (ir_graph *irg)
220 set_irg_ent (ir_graph *irg, entity *ent)
226 get_irg_params (ir_graph *irg)
232 set_irg_params (ir_graph *irg, int params)
234 irg->params = params;
238 get_irg_visited (ir_graph *irg)
244 set_irg_visited (ir_graph *irg, unsigned long visited)
246 irg->visited = visited;
250 inc_irg_visited (ir_graph *irg)
252 irg->visited = irg->visited++;
256 get_irg_block_visited (ir_graph *irg)
258 return irg->block_visited;
262 set_irg_block_visited (ir_graph *irg, unsigned long visited)
264 irg->block_visited = visited;
268 inc_irg_block_visited (ir_graph *irg)
270 irg->block_visited = irg->block_visited++;