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
54 numbering for optimizing use in
57 /** Type inforamtion for the procedure of the graph **/
59 set_entity_irg(ent, res);
61 /** Nodes needed in every graph **/
62 res->end_block = new_Block ();
63 res->end = new_End ();
65 res->start_block = new_Block ();
66 res->start = new_Start ();
67 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
69 /* Proj results of start node */
70 projX = new_Proj (res->start, mode_X, pns_initial_exec);
71 set_store (new_Proj (res->start, mode_M, pns_global_store));
72 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
73 res->globals = new_Proj (res->start, mode_p, pns_globals);
74 res->args = new_Proj (res->start, mode_T, pns_args);
76 add_in_edge(res->start_block, projX);
77 // The code generation needs it. leave it in now.
78 // Use of this edge is matter of discussion, unresolved. Also possible:
79 // add_in_edge(res->start_block, res->start_block), but invalid typed.
81 mature_block (res->current_block);
83 /** Make a block to start with **/
84 first_block = new_Block ();
85 add_in_edge (first_block, projX);
90 /* access routines for all ir_graph attributes:
92 {attr type} get_irg_{attribute name} (ir_graph *irg);
93 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
96 get_irg_start_block (ir_graph *irg)
98 return irg->start_block;
102 set_irg_start_block (ir_graph *irg, ir_node *node)
104 irg->start_block = node;
108 get_irg_start (ir_graph *irg)
114 set_irg_start(ir_graph *irg, ir_node *node)
120 get_irg_end_block (ir_graph *irg)
122 return irg->end_block;
126 set_irg_end_block (ir_graph *irg, ir_node *node)
128 irg->end_block = node;
132 get_irg_end (ir_graph *irg)
138 set_irg_end (ir_graph *irg, ir_node *node)
144 get_irg_cstore (ir_graph *irg)
150 set_irg_cstore (ir_graph *irg, ir_node *node)
156 get_irg_frame (ir_graph *irg)
162 set_irg_frame (ir_graph *irg, ir_node *node)
168 get_irg_globals (ir_graph *irg)
174 set_irg_globals (ir_graph *irg, ir_node *node)
180 get_irg_args (ir_graph *irg)
186 set_irg_args (ir_graph *irg, ir_node *node)
192 get_irg_bad (ir_graph *irg)
198 set_irg_bad (ir_graph *irg, ir_node *node)
204 get_irg_current_block (ir_graph *irg)
206 return irg->current_block;
210 set_irg_current_block (ir_graph *irg, ir_node *node)
212 irg->current_block = node;
216 get_irg_ent (ir_graph *irg)
222 set_irg_ent (ir_graph *irg, entity *ent)
228 get_irg_params (ir_graph *irg)
234 set_irg_params (ir_graph *irg, int params)
236 irg->params = params;
240 get_irg_visited (ir_graph *irg)
246 set_irg_visited (ir_graph *irg, unsigned long visited)
248 irg->visited = visited;
252 inc_irg_visited (ir_graph *irg)
254 irg->visited = irg->visited++;
258 get_irg_block_visited (ir_graph *irg)
260 return irg->block_visited;
264 set_irg_block_visited (ir_graph *irg, unsigned long visited)
266 irg->block_visited = visited;
270 inc_irg_block_visited (ir_graph *irg)
272 irg->block_visited = irg->block_visited++;