# include "irouts.h"
# include "irhooks.h"
# include "irgwalk.h"
+# include "iredges_t.h"
/**
* Indicates, whether additional data can be registered to graphs.
* allocated (new_r_ir_graph, new_const_code_irg).
* @return Memory for a new graph.
*/
-static ir_graph *alloc_graph(void)
-{
- size_t size = sizeof(ir_graph) + additional_graph_data_size;
- char *ptr = xmalloc(size);
- memset(ptr, 0, size);
+static ir_graph *alloc_graph(void) {
+ size_t size = sizeof(ir_graph) + additional_graph_data_size;
+ char *ptr = xmalloc(size);
+ memset(ptr, 0, size);
- return (ir_graph *) (ptr + additional_graph_data_size);
+ return (ir_graph *) (ptr + additional_graph_data_size);
+}
+
+/**
+ * Frees an allocated IR graph
+ */
+static void free_graph(ir_graph *irg) {
+ char *ptr = (char *)irg;
+ free(ptr - additional_graph_data_size);
}
#if USE_EXPLICIT_PHI_IN_STACK
res = alloc_graph();
res->kind = k_ir_graph;
+ edges_init_graph(res);
+
/* inform statistics here, as blocks will be already build on this graph */
hook_new_graph(res, ent);
#endif
res->kind = k_ir_graph;
res->obst = xmalloc (sizeof(*res->obst));
- obstack_init (res->obst);
+ obstack_init(res->obst);
+ res->extbb_obst = NULL;
+
res->value_table = new_identities (); /* value table for global value
numbering for optimizing use in
iropt.c */
res->outs = NULL;
- res->phase_state = phase_building;
+ res->phase_state = phase_building;
res->op_pin_state_pinned = op_pin_state_pinned;
- res->outs_state = outs_none;
- res->dom_state = dom_none;
- res->typeinfo_state = irg_typeinfo_none;
- res->loopinfo_state = loopinfo_none;
+ res->outs_state = outs_none;
+ res->dom_state = dom_none;
+ res->typeinfo_state = ir_typeinfo_none;
+ set_irp_typeinfo_inconsistent(); /* there is a new graph with typeinfo_none. */
+ res->loopinfo_state = loopinfo_none;
+ res->class_cast_state = ir_class_casts_transitive;
+ res->extblk_state = ir_extblk_info_none;
/*-- Type information for the procedure of the graph --*/
res->ent = ent;
res->kind = k_ir_graph;
res->obst = xmalloc (sizeof(*res->obst));
obstack_init (res->obst);
+ res->extbb_obst = NULL;
+
res->phase_state = phase_building;
res->op_pin_state_pinned = op_pin_state_pinned;
+ res->extblk_state = ir_extblk_info_none;
+
res->value_table = new_identities (); /* value table for global value
numbering for optimizing use in
iropt.c */
set_irn_visited(res->no_mem, -1);
res->phase_state = phase_high;
+
return res;
}
Does not free types, entities or modes that are used only by this
graph, nor the entity standing for this graph. */
void free_ir_graph (ir_graph *irg) {
+ assert(is_ir_graph(irg));
hook_free_graph(irg);
if (irg->outs_state != outs_none) free_outs(irg);
if (irg->loc_descriptions)
free(irg->loc_descriptions);
irg->kind = k_BAD;
- free(irg);
+ free_graph(irg);
}
/* access routines for all ir_graph attributes:
struct _obstack_chunk *p;
/*
- * checks wheater the ir_node pointer i on the obstack.
+ * checks weather the ir_node pointer is on the obstack.
* A more sophisticated check would test the "whole" ir_node
*/
for (p = irg->obst->chunk; p; p = p->prev) {
}
void
-set_irg_loopinfo_inconsistent(ir_graph *irg) {
- if (irg->loopinfo_state == loopinfo_ip_consistent)
- irg->loopinfo_state = loopinfo_ip_inconsistent;
-
- else if (irg->loopinfo_state == loopinfo_consistent)
- irg->loopinfo_state = loopinfo_inconsistent;
-
- else if (irg->loopinfo_state == loopinfo_cf_ip_consistent)
- irg->loopinfo_state = loopinfo_cf_ip_inconsistent;
-
- else if (irg->loopinfo_state == loopinfo_cf_consistent)
- irg->loopinfo_state = loopinfo_cf_inconsistent;
+(set_irg_loopinfo_inconsistent)(ir_graph *irg) {
+ _set_irg_loopinfo_inconsistent(irg);
}
void
assert(0 <= n && n < irg->n_loc);
if (! irg->loc_descriptions)
- irg->loc_descriptions = xmalloc(sizeof(*irg->loc_descriptions) * irg->n_loc);
+ irg->loc_descriptions = xcalloc(sizeof(*irg->loc_descriptions), irg->n_loc);
irg->loc_descriptions[n] = description;
}