1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Martin Trapp, Christian Schaefer
16 # include "irgraph_t.h"
22 ir_graph *current_ir_graph;
24 #if USE_EXPICIT_PHI_IN_STACK
25 /* really defined in ircons.c */
26 typedef struct Phi_in_stack Phi_in_stack;
27 Phi_in_stack *new_Phi_in_stack();
28 void free_Phi_in_stack(Phi_in_stack *s);
31 /* Allocates a list of nodes:
32 - The start block containing a start node and Proj nodes for it's four
33 results (X, M, P, Tuple).
34 - The end block containing an end node. This block is not matured after
35 new_ir_graph as predecessors need to be added to it.
36 - The current block, which is empty and also not matured.
37 Further it allocates several datastructures needed for graph construction
41 new_ir_graph (entity *ent, int n_loc)
47 res = (ir_graph *) malloc (sizeof (ir_graph));
48 current_ir_graph = res;
49 add_irp_irg(res); /* remember this graph global. */
51 /** Internal information for graph construction either held in the graph or
52 *** initialized for each graph. **/
53 #if PRECISE_EXC_CONTEXT
54 res->n_loc = n_loc + 1 + 1; /* number of local variables that are never
55 dereferenced in this graph plus one for
56 the store plus one for links to fragile
57 operations. n_loc is not the number of
58 parameters to the procedure! */
60 res->n_loc = n_loc + 1; /* number of local variables that are never
61 dereferenced in this graph plus one for
62 the store. This is not the number of parameters
66 res->visited = 0; /* visited flag, for the ir walker */
67 res->block_visited=0; /* visited flag, for the 'block'-walker */
69 #if USE_EXPICIT_PHI_IN_STACK
70 res->Phi_in_stack = new_Phi_in_stack(); /* A stack needed for automatic Phi
73 res->obst = (struct obstack *) xmalloc (sizeof (struct obstack));
74 obstack_init (res->obst);
75 res->value_table = new_identities (); /* value table for global value
76 numbering for optimizing use in
79 /** Type inforamtion for the procedure of the graph **/
81 set_entity_irg(ent, res);
83 /** Nodes needed in every graph **/
84 res->end_block = new_immBlock ();
85 res->end = new_End ();
87 res->start_block = new_immBlock ();
88 res->start = new_Start ();
89 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
91 /* Proj results of start node */
92 projX = new_Proj (res->start, mode_X, pns_initial_exec);
93 set_store (new_Proj (res->start, mode_M, pns_global_store));
94 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
95 res->globals = new_Proj (res->start, mode_p, pns_globals);
96 res->args = new_Proj (res->start, mode_T, pns_args);
98 add_in_edge(res->start_block, projX);
100 * The code generation needs it. leave it in now.
101 * Use of this edge is matter of discussion, unresolved. Also possible:
102 * add_in_edge(res->start_block, res->start_block), but invalid typed.
104 mature_block (res->current_block);
106 /** Make a block to start with **/
107 first_block = new_immBlock ();
108 add_in_edge (first_block, projX);
113 /* Frees the passed irgraph.
114 Deallocates all nodes in this graph and the ir_graph structure.
115 Sets the field irgraph in the corresponding entity to NULL.
116 Does not remove the irgraph from the list in irprog (requires
117 inefficient search, call remove_irp_irg by hand).
118 Does not free types, entities or modes that are used only by this
119 graph, nor the entity standing for this graph. */
120 void free_ir_graph (ir_graph *irg) {
121 set_entity_irg(irg->ent, NULL);
123 #if USE_EXPICIT_PHI_IN_STACK
124 free_Phi_in_stack(irg->Phi_in_stack);
129 /* access routines for all ir_graph attributes:
131 {attr type} get_irg_{attribute name} (ir_graph *irg);
132 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
135 get_irg_start_block (ir_graph *irg)
137 return irg->start_block;
141 set_irg_start_block (ir_graph *irg, ir_node *node)
143 irg->start_block = node;
147 get_irg_start (ir_graph *irg)
153 set_irg_start(ir_graph *irg, ir_node *node)
159 get_irg_end_block (ir_graph *irg)
161 return irg->end_block;
165 set_irg_end_block (ir_graph *irg, ir_node *node)
167 irg->end_block = node;
171 get_irg_end (ir_graph *irg)
177 set_irg_end (ir_graph *irg, ir_node *node)
183 get_irg_cstore (ir_graph *irg)
189 set_irg_cstore (ir_graph *irg, ir_node *node)
195 get_irg_frame (ir_graph *irg)
201 set_irg_frame (ir_graph *irg, ir_node *node)
207 get_irg_globals (ir_graph *irg)
213 set_irg_globals (ir_graph *irg, ir_node *node)
219 get_irg_args (ir_graph *irg)
225 set_irg_args (ir_graph *irg, ir_node *node)
231 get_irg_bad (ir_graph *irg)
237 set_irg_bad (ir_graph *irg, ir_node *node)
243 get_irg_current_block (ir_graph *irg)
245 return irg->current_block;
249 set_irg_current_block (ir_graph *irg, ir_node *node)
251 irg->current_block = node;
255 get_irg_ent (ir_graph *irg)
257 assert(irg && irg->ent);
262 set_irg_ent (ir_graph *irg, entity *ent)
268 get_irg_n_loc (ir_graph *irg)
274 set_irg_n_loc (ir_graph *irg, int n_loc)
280 get_irg_visited (ir_graph *irg)
286 set_irg_visited (ir_graph *irg, unsigned long visited)
288 irg->visited = visited;
292 inc_irg_visited (ir_graph *irg)
294 irg->visited = irg->visited++;
298 get_irg_block_visited (ir_graph *irg)
300 return irg->block_visited;
304 set_irg_block_visited (ir_graph *irg, unsigned long visited)
306 irg->block_visited = visited;
310 inc_irg_block_visited (ir_graph *irg)
312 irg->block_visited = irg->block_visited++;