- add support for ASM includes, needed for fehler125.c
[libfirm] / ir / ir / irgraph.c
index 465b30d..f845476 100644 (file)
@@ -145,6 +145,29 @@ Phi_in_stack *new_Phi_in_stack();
 void free_Phi_in_stack(Phi_in_stack *s);
 #endif
 
+/**
+ * Set the number of locals for a given graph.
+ *
+ * @param irg    the graph
+ * @param n_loc  number of locals
+ */
+void irg_set_nloc(ir_graph *res, int n_loc) {
+       assert(res->phase_state == phase_building);
+
+       if (get_opt_precise_exc_context()) {
+               res->n_loc = n_loc + 1 + 1; /* number of local variables that are never
+                                              dereferenced in this graph plus one for
+                                              the store plus one for links to fragile
+                                              operations.  n_loc is not the number of
+                                              parameters to the procedure!  */
+       } else {
+               res->n_loc = n_loc + 1;     /* number of local variables that are never
+                                              dereferenced in this graph plus one for
+                                              the store. This is not the number of parameters
+                                              to the procedure!  */
+       }
+}
+
 /* Allocates a list of nodes:
     - The start block containing a start node and Proj nodes for it's four
       results (X, M, P, Tuple).
@@ -167,18 +190,12 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) {
        current_ir_graph = res;
 
        /*-- initialized for each graph. --*/
-       if (get_opt_precise_exc_context()) {
-               res->n_loc = n_loc + 1 + 1; /* number of local variables that are never
-                              dereferenced in this graph plus one for
-                              the store plus one for links to fragile
-                              operations.  n_loc is not the number of
-                              parameters to the procedure!  */
-       } else {
-               res->n_loc = n_loc + 1;  /* number of local variables that are never
-                           dereferenced in this graph plus one for
-                           the store. This is not the number of parameters
-                           to the procedure!  */
-       }
+       res->kind = k_ir_graph;
+       res->obst = xmalloc (sizeof(*res->obst));
+       obstack_init(res->obst);
+
+       res->phase_state = phase_building;
+       irg_set_nloc(res, n_loc);
 
        /* descriptions will be allocated on demand */
        res->loc_descriptions = NULL;
@@ -190,9 +207,6 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) {
        res->Phi_in_stack = new_Phi_in_stack();  /* A stack needed for automatic Phi
                                                    generation */
 #endif
-       res->kind = k_ir_graph;
-       res->obst = xmalloc (sizeof(*res->obst));
-       obstack_init(res->obst);
        res->extbb_obst = NULL;
 
        res->last_node_idx = 0;
@@ -204,7 +218,6 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) {
        res->inline_property       = irg_inline_any;
        res->additional_properties = mtp_property_inherited;  /* inherited from type */
 
-       res->phase_state         = phase_building;
        res->irg_pinned_state    = op_pin_state_pinned;
        res->outs_state          = outs_none;
        res->dom_state           = dom_none;
@@ -246,8 +259,8 @@ ir_graph *new_r_ir_graph(ir_entity *ent, int n_loc) {
 
        /* Proj results of start node */
        projX                   = new_Proj(start, mode_X, pn_Start_X_initial_exec);
+       set_irg_initial_exec    (res, projX);
        set_irg_frame           (res, new_Proj(start, mode_P_data, pn_Start_P_frame_base));
-       set_irg_globals         (res, new_Proj(start, mode_P_data, pn_Start_P_globals));
        set_irg_tls             (res, new_Proj(start, mode_P_data, pn_Start_P_tls));
        set_irg_args            (res, new_Proj(start, mode_T,      pn_Start_T_args));
        set_irg_value_param_base(res, new_Proj(start, mode_P_data, pn_Start_P_value_arg_base));
@@ -369,7 +382,7 @@ ir_graph *new_const_code_irg(void) {
  * @param env  The copied graph.
  */
 static void copy_all_nodes(ir_node *n, void *env) {
-       ir_graph *irg = current_ir_graph;
+       ir_graph *irg = env;
        ir_op    *op  = get_irn_op(n);
        ir_node  *nn;
 
@@ -417,7 +430,7 @@ static void copy_all_nodes(ir_node *n, void *env) {
 static void set_all_preds(ir_node *irn, void *env) {
        int      i;
        ir_node  *nn, *pred;
-       ir_graph *clone_irg = env;
+       (void) env;
 
        nn = get_irn_link(irn);
 
@@ -516,6 +529,8 @@ ir_graph *create_irg_copy(ir_graph *irg) {
 void free_ir_graph(ir_graph *irg) {
        assert(is_ir_graph(irg));
 
+       edges_deactivate(irg);
+
        hook_free_graph(irg);
        if (irg->outs_state != outs_none)
                free_irg_outs(irg);
@@ -629,23 +644,23 @@ void
 }
 
 ir_node *
-(get_irg_frame)(const ir_graph *irg) {
-       return _get_irg_frame(irg);
+(get_irg_initial_exec)(const ir_graph *irg) {
+       return _get_irg_initial_exec(irg);
 }
 
 void
-(set_irg_frame)(ir_graph *irg, ir_node *node) {
-       _set_irg_frame(irg, node);
+(set_irg_initial_exec)(ir_graph *irg, ir_node *node) {
+       _set_irg_initial_exec(irg, node);
 }
 
 ir_node *
-(get_irg_globals)(const ir_graph *irg) {
-  return _get_irg_globals(irg);
+(get_irg_frame)(const ir_graph *irg) {
+       return _get_irg_frame(irg);
 }
 
 void
-(set_irg_globals)(ir_graph *irg, ir_node *node) {
-       _set_irg_globals(irg, node);
+(set_irg_frame)(ir_graph *irg, ir_node *node) {
+       _set_irg_frame(irg, node);
 }
 
 ir_node *
@@ -1071,7 +1086,21 @@ void clear_using_irn_link(ir_graph *irg) {
 int using_irn_link(const ir_graph *irg) {
        return irg->using_irn_link;
 }
-#endif
+
+void set_using_block_mark(ir_graph *irg) {
+       assert(irg->using_block_mark == 0);
+       irg->using_block_mark = 1;
+}
+
+void clear_using_block_mark(ir_graph *irg) {
+       assert(irg->using_block_mark == 1);
+       irg->using_block_mark = 0;
+}
+
+int using_block_mark(const ir_graph *irg) {
+       return irg->using_block_mark;
+}
+#endif /* NDEBUG */
 
 /* Returns a estimated node count of the irg. */
 unsigned (get_irg_estimated_node_cnt)(const ir_graph *irg) {