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 res->n_loc = n_loc + 1; /* number of local variables that are never
52 dereferenced in this graph plus one for
53 the store. This is not the number of parameters
55 res->visited = 0; /* visited flag, for the ir walker */
56 res->block_visited=0; /* visited flag, for the 'block'-walker */
58 #if USE_EXPICIT_PHI_IN_STACK
59 res->Phi_in_stack = new_Phi_in_stack(); /* A stack needed for automatic Phi
62 res->obst = (struct obstack *) xmalloc (sizeof (struct obstack));
63 obstack_init (res->obst);
64 res->value_table = new_identities (); /* value table for global value
65 numbering for optimizing use in
68 /** Type inforamtion for the procedure of the graph **/
70 set_entity_irg(ent, res);
72 /** Nodes needed in every graph **/
73 res->end_block = new_immBlock ();
74 res->end = new_End ();
76 res->start_block = new_immBlock ();
77 res->start = new_Start ();
78 res->bad = new_ir_node (res, res->start_block, op_Bad, mode_T, 0, NULL);
80 /* Proj results of start node */
81 projX = new_Proj (res->start, mode_X, pns_initial_exec);
82 set_store (new_Proj (res->start, mode_M, pns_global_store));
83 res->frame = new_Proj (res->start, mode_p, pns_frame_base);
84 res->globals = new_Proj (res->start, mode_p, pns_globals);
85 res->args = new_Proj (res->start, mode_T, pns_args);
87 add_in_edge(res->start_block, projX);
89 * The code generation needs it. leave it in now.
90 * Use of this edge is matter of discussion, unresolved. Also possible:
91 * add_in_edge(res->start_block, res->start_block), but invalid typed.
93 mature_block (res->current_block);
95 /** Make a block to start with **/
96 first_block = new_immBlock ();
97 add_in_edge (first_block, projX);
102 /* Frees the passed irgraph.
103 Deallocates all nodes in this graph and the ir_graph structure.
104 Sets the field irgraph in the corresponding entity to NULL.
105 Does not remove the irgraph from the list in irprog (requires
106 inefficient search, call remove_irp_irg by hand).
107 Does not free types, entities or modes that are used only by this
108 graph, nor the entity standing for this graph. */
109 void free_ir_graph (ir_graph *irg) {
110 set_entity_irg(irg->ent, NULL);
112 #if USE_EXPICIT_PHI_IN_STACK
113 free_Phi_in_stack(irg->Phi_in_stack);
118 /* access routines for all ir_graph attributes:
120 {attr type} get_irg_{attribute name} (ir_graph *irg);
121 void set_irg_{attr name} (ir_graph *irg, {attr type} {attr}); */
124 get_irg_start_block (ir_graph *irg)
126 return irg->start_block;
130 set_irg_start_block (ir_graph *irg, ir_node *node)
132 irg->start_block = node;
136 get_irg_start (ir_graph *irg)
142 set_irg_start(ir_graph *irg, ir_node *node)
148 get_irg_end_block (ir_graph *irg)
150 return irg->end_block;
154 set_irg_end_block (ir_graph *irg, ir_node *node)
156 irg->end_block = node;
160 get_irg_end (ir_graph *irg)
166 set_irg_end (ir_graph *irg, ir_node *node)
172 get_irg_cstore (ir_graph *irg)
178 set_irg_cstore (ir_graph *irg, ir_node *node)
184 get_irg_frame (ir_graph *irg)
190 set_irg_frame (ir_graph *irg, ir_node *node)
196 get_irg_globals (ir_graph *irg)
202 set_irg_globals (ir_graph *irg, ir_node *node)
208 get_irg_args (ir_graph *irg)
214 set_irg_args (ir_graph *irg, ir_node *node)
220 get_irg_bad (ir_graph *irg)
226 set_irg_bad (ir_graph *irg, ir_node *node)
232 get_irg_current_block (ir_graph *irg)
234 return irg->current_block;
238 set_irg_current_block (ir_graph *irg, ir_node *node)
240 irg->current_block = node;
244 get_irg_ent (ir_graph *irg)
246 assert(irg && irg->ent);
251 set_irg_ent (ir_graph *irg, entity *ent)
257 get_irg_n_loc (ir_graph *irg)
263 set_irg_n_loc (ir_graph *irg, int n_loc)
269 get_irg_visited (ir_graph *irg)
275 set_irg_visited (ir_graph *irg, unsigned long visited)
277 irg->visited = visited;
281 inc_irg_visited (ir_graph *irg)
283 irg->visited = irg->visited++;
287 get_irg_block_visited (ir_graph *irg)
289 return irg->block_visited;
293 set_irg_block_visited (ir_graph *irg, unsigned long visited)
295 irg->block_visited = visited;
299 inc_irg_block_visited (ir_graph *irg)
301 irg->block_visited = irg->block_visited++;