1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
14 # include "irgraph_t.h"
20 ir_graph *current_ir_graph;
22 #if USE_EXPICIT_PHI_IN_STACK
23 /* really defined in ircons.c */
24 typedef struct Phi_in_stack Phi_in_stack;
25 Phi_in_stack *new_Phi_in_stack();
28 /* Allocates a list of nodes:
29 - The start block containing a start node and Proj nodes for it's four
30 results (X, M, P, Tuple).
31 - The end block containing an end node. This block is not matured after
32 new_ir_graph as predecessors need to be added to it.
33 - The current block, which is empty and also not matured.
34 Further it allocates several datastructures needed for graph construction
38 new_ir_graph (entity *ent, int n_loc)
44 res = (ir_graph *) malloc (sizeof (ir_graph));
45 current_ir_graph = res;
46 add_irp_irg(res); /* remember this graph global. */
48 /** Internal information for graph construction either held in the graph or
49 *** initialized for each graph. **/
50 res->n_loc = n_loc + 1; /* number of local variables that are never
51 dereferenced in this graph plus one for
52 the store. This is not the number of parameters
54 res->visited = 0; /* visited flag, for the ir walker */
55 res->block_visited=0; /* visited flag, for the 'block'-walker */
57 #if USE_EXPICIT_PHI_IN_STACK
58 res->Phi_in_stack = new_Phi_in_stack(); /* A stack needed for automatic Phi
61 res->obst = (struct obstack *) xmalloc (sizeof (struct obstack));
62 obstack_init (res->obst);
63 res->value_table = new_identities (); /* value table for global value
64 numbering for optimizing use in
67 /** Type inforamtion for the procedure of the graph **/
69 set_entity_irg(ent, res);
71 /** Nodes needed in every graph **/
72 res->end_block = new_immBlock ();
73 res->end = new_End ();
75 res->start_block = new_immBlock ();
76 res->start = new_Start ();
77 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
79 /* Proj results of start node */
80 projX = new_Proj (res->start, mode_X, pns_initial_exec);
81 set_store (new_Proj (res->start, mode_M, pns_global_store));
82 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
83 res->globals = new_Proj (res->start, mode_p, pns_globals);
84 res->args = new_Proj (res->start, mode_T, pns_args);
86 add_in_edge(res->start_block, projX);
88 * The code generation needs it. leave it in now.
89 * Use of this edge is matter of discussion, unresolved. Also possible:
90 * add_in_edge(res->start_block, res->start_block), but invalid typed.
92 mature_block (res->current_block);
94 /** Make a block to start with **/
95 first_block = new_immBlock ();
96 add_in_edge (first_block, projX);
101 /* access routines for all ir_graph attributes:
103 {attr type} get_irg_{attribute name} (ir_graph *irg);
104 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
107 get_irg_start_block (ir_graph *irg)
109 return irg->start_block;
113 set_irg_start_block (ir_graph *irg, ir_node *node)
115 irg->start_block = node;
119 get_irg_start (ir_graph *irg)
125 set_irg_start(ir_graph *irg, ir_node *node)
131 get_irg_end_block (ir_graph *irg)
133 return irg->end_block;
137 set_irg_end_block (ir_graph *irg, ir_node *node)
139 irg->end_block = node;
143 get_irg_end (ir_graph *irg)
149 set_irg_end (ir_graph *irg, ir_node *node)
155 get_irg_cstore (ir_graph *irg)
161 set_irg_cstore (ir_graph *irg, ir_node *node)
167 get_irg_frame (ir_graph *irg)
173 set_irg_frame (ir_graph *irg, ir_node *node)
179 get_irg_globals (ir_graph *irg)
185 set_irg_globals (ir_graph *irg, ir_node *node)
191 get_irg_args (ir_graph *irg)
197 set_irg_args (ir_graph *irg, ir_node *node)
203 get_irg_bad (ir_graph *irg)
209 set_irg_bad (ir_graph *irg, ir_node *node)
215 get_irg_current_block (ir_graph *irg)
217 return irg->current_block;
221 set_irg_current_block (ir_graph *irg, ir_node *node)
223 irg->current_block = node;
227 get_irg_ent (ir_graph *irg)
229 assert(irg && irg->ent);
234 set_irg_ent (ir_graph *irg, entity *ent)
240 get_irg_n_loc (ir_graph *irg)
246 set_irg_n_loc (ir_graph *irg, int n_loc)
252 get_irg_visited (ir_graph *irg)
258 set_irg_visited (ir_graph *irg, unsigned long visited)
260 irg->visited = visited;
264 inc_irg_visited (ir_graph *irg)
266 irg->visited = irg->visited++;
270 get_irg_block_visited (ir_graph *irg)
272 return irg->block_visited;
276 set_irg_block_visited (ir_graph *irg, unsigned long visited)
278 irg->block_visited = visited;
282 inc_irg_block_visited (ir_graph *irg)
284 irg->block_visited = irg->block_visited++;