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();
26 void free_Phi_in_stack(Phi_in_stack *s);
29 /* Allocates a list of nodes:
30 - The start block containing a start node and Proj nodes for it's four
31 results (X, M, P, Tuple).
32 - The end block containing an end node. This block is not matured after
33 new_ir_graph as predecessors need to be added to it.
34 - The current block, which is empty and also not matured.
35 Further it allocates several datastructures needed for graph construction
39 new_ir_graph (entity *ent, int n_loc)
45 res = (ir_graph *) malloc (sizeof (ir_graph));
46 current_ir_graph = res;
47 add_irp_irg(res); /* remember this graph global. */
49 /** Internal information for graph construction either held in the graph or
50 *** initialized for each graph. **/
51 #if PRECISE_EXC_CONTEXT
52 res->n_loc = n_loc + 1 + 1; /* number of local variables that are never
53 dereferenced in this graph plus one for
54 the store plus one for links to fragile
55 operations. n_loc is not the number of
56 parameters to the procedure! */
58 res->n_loc = n_loc + 1; /* number of local variables that are never
59 dereferenced in this graph plus one for
60 the store. This is not the number of parameters
64 res->visited = 0; /* visited flag, for the ir walker */
65 res->block_visited=0; /* visited flag, for the 'block'-walker */
67 #if USE_EXPICIT_PHI_IN_STACK
68 res->Phi_in_stack = new_Phi_in_stack(); /* A stack needed for automatic Phi
71 res->obst = (struct obstack *) xmalloc (sizeof (struct obstack));
72 obstack_init (res->obst);
73 res->value_table = new_identities (); /* value table for global value
74 numbering for optimizing use in
77 /** Type inforamtion for the procedure of the graph **/
79 set_entity_irg(ent, res);
81 /** Nodes needed in every graph **/
82 res->end_block = new_immBlock ();
83 res->end = new_End ();
85 res->start_block = new_immBlock ();
86 res->start = new_Start ();
87 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
89 /* Proj results of start node */
90 projX = new_Proj (res->start, mode_X, pns_initial_exec);
91 set_store (new_Proj (res->start, mode_M, pns_global_store));
92 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
93 res->globals = new_Proj (res->start, mode_p, pns_globals);
94 res->args = new_Proj (res->start, mode_T, pns_args);
96 add_in_edge(res->start_block, projX);
98 * The code generation needs it. leave it in now.
99 * Use of this edge is matter of discussion, unresolved. Also possible:
100 * add_in_edge(res->start_block, res->start_block), but invalid typed.
102 mature_block (res->current_block);
104 /** Make a block to start with **/
105 first_block = new_immBlock ();
106 add_in_edge (first_block, projX);
111 /* Frees the passed irgraph.
112 Deallocates all nodes in this graph and the ir_graph structure.
113 Sets the field irgraph in the corresponding entity to NULL.
114 Does not remove the irgraph from the list in irprog (requires
115 inefficient search, call remove_irp_irg by hand).
116 Does not free types, entities or modes that are used only by this
117 graph, nor the entity standing for this graph. */
118 void free_ir_graph (ir_graph *irg) {
119 set_entity_irg(irg->ent, NULL);
121 #if USE_EXPICIT_PHI_IN_STACK
122 free_Phi_in_stack(irg->Phi_in_stack);
127 /* access routines for all ir_graph attributes:
129 {attr type} get_irg_{attribute name} (ir_graph *irg);
130 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
133 get_irg_start_block (ir_graph *irg)
135 return irg->start_block;
139 set_irg_start_block (ir_graph *irg, ir_node *node)
141 irg->start_block = node;
145 get_irg_start (ir_graph *irg)
151 set_irg_start(ir_graph *irg, ir_node *node)
157 get_irg_end_block (ir_graph *irg)
159 return irg->end_block;
163 set_irg_end_block (ir_graph *irg, ir_node *node)
165 irg->end_block = node;
169 get_irg_end (ir_graph *irg)
175 set_irg_end (ir_graph *irg, ir_node *node)
181 get_irg_cstore (ir_graph *irg)
187 set_irg_cstore (ir_graph *irg, ir_node *node)
193 get_irg_frame (ir_graph *irg)
199 set_irg_frame (ir_graph *irg, ir_node *node)
205 get_irg_globals (ir_graph *irg)
211 set_irg_globals (ir_graph *irg, ir_node *node)
217 get_irg_args (ir_graph *irg)
223 set_irg_args (ir_graph *irg, ir_node *node)
229 get_irg_bad (ir_graph *irg)
235 set_irg_bad (ir_graph *irg, ir_node *node)
241 get_irg_current_block (ir_graph *irg)
243 return irg->current_block;
247 set_irg_current_block (ir_graph *irg, ir_node *node)
249 irg->current_block = node;
253 get_irg_ent (ir_graph *irg)
255 assert(irg && irg->ent);
260 set_irg_ent (ir_graph *irg, entity *ent)
266 get_irg_n_loc (ir_graph *irg)
272 set_irg_n_loc (ir_graph *irg, int n_loc)
278 get_irg_visited (ir_graph *irg)
284 set_irg_visited (ir_graph *irg, unsigned long visited)
286 irg->visited = visited;
290 inc_irg_visited (ir_graph *irg)
292 irg->visited = irg->visited++;
296 get_irg_block_visited (ir_graph *irg)
298 return irg->block_visited;
302 set_irg_block_visited (ir_graph *irg, unsigned long visited)
304 irg->block_visited = visited;
308 inc_irg_block_visited (ir_graph *irg)
310 irg->block_visited = irg->block_visited++;