removed pn_Bound_M_except, Bound now have only one memory output
[libfirm] / ir / ir / irgraph.h
index 4ea428a..1500e8f 100644 (file)
  *
  * @author Martin Trapp, Christian Schaefer
  */
+#ifndef _FIRM_IR_IRGRAPH_H_
+#define _FIRM_IR_IRGRAPH_H_
 
 #include <stddef.h>
 
+#include "firm_types.h"
 #include "irop.h"
 #include "irextbb.h"
-
-# ifndef _IRGRAPH_H_
-# define _IRGRAPH_H_
-# include "entity.h"
-
-/* to resolve recursion between irnode.h and irgraph.h */
-#ifndef _IR_NODE_TYPEDEF_
-#define _IR_NODE_TYPEDEF_
-typedef struct ir_node ir_node;
-#endif
-
-/* to resolve recursion between entity.h and irgraph.h */
-#ifndef _IR_GRAPH_TYPEDEF_
-#define _IR_GRAPH_TYPEDEF_
-typedef struct ir_graph ir_graph;
-#endif
+#include "type.h"
 
 /**
  * @page ir_graph   The struct ir_graph
@@ -198,10 +186,8 @@ int      is_ir_graph(const void *thing);
 entity  *get_irg_entity (const ir_graph *irg);
 void     set_irg_entity (ir_graph *irg, entity *ent);
 
-type    *get_irg_frame_type (ir_graph *irg);
-void     set_irg_frame_type (ir_graph *irg, type *ftp);
-/* To test for a frame type. O(#irgs) if ftp is class type.  */
-int      is_frame_type (const type *ftp);
+ir_type *get_irg_frame_type (ir_graph *irg);
+void     set_irg_frame_type (ir_graph *irg, ir_type *ftp);
 
 ir_node *get_irg_start_block (const ir_graph *irg);
 void     set_irg_start_block (ir_graph *irg, ir_node *node);
@@ -224,12 +210,6 @@ void     set_irg_end_reg (ir_graph *irg, ir_node *node);
 ir_node *get_irg_end_except (const ir_graph *irg);
 void     set_irg_end_except (ir_graph *irg, ir_node *node);
 
-
-/* @@@ oblivious, no more supported. */
-ir_node *get_irg_cstore (const ir_graph *irg);
-void     set_irg_cstore (ir_graph *irg, ir_node *node);
-/* end oblivious */
-
 /** Returns the node that represents the frame pointer. */
 ir_node *get_irg_frame (const ir_graph *irg);
 /** Sets the node that represents the frame pointer. */
@@ -284,12 +264,12 @@ long     get_irg_graph_nr(ir_graph *irg);
 
 /** The states of an ir graph.
  *
- * state phase values: phase_building, phase_high, phase_low.
+ * state phase values: phase_building, phase_high, phase_low, phase_backend.
  *
  * The graph is in phase_building during construction of the irgraph.
  * The construction is finished by a call to finalize_cons().
  *
- * Finalize_cons() sets the state to phase_high.  All Firm nodes are
+ * Finalize_cons() sets the state to phase_high.  All stadard Firm nodes are
  * allowed.
  *
  * To get the irgraph into phase_low all Sel nodes must be removed and
@@ -297,18 +277,23 @@ long     get_irg_graph_nr(ir_graph *irg);
  * type tag nodes must be removed (@@@ really?).  Initialization of
  * memory allocated by Alloc must be explicit.  @@@ More conditions?
  *
+ * phase_backend is set if architecture specific machine nodes are inserted
+ * (and probally most standard Firm are removed).
  */
 typedef enum {
   phase_building,
   phase_high,
-  phase_low
+  phase_low,
+       phase_backend
 } irg_phase_state;
 
 /** returns the phase_state of an IR graph. */
 irg_phase_state get_irg_phase_state (const ir_graph *irg);
 
 /** sets the phase state of an IR graph. */
-void set_irg_phase_low(ir_graph *irg);
+void set_irg_phase_state(ir_graph *irg, irg_phase_state state);
+
+#define set_irg_phase_low(irg) set_irg_phase_state(irg, phase_low)
 
 /** state: op_pin_state_pinned
    The graph is "op_pin_state_pinned" if all nodes are associated with a basic block.
@@ -331,8 +316,17 @@ typedef enum {
 irg_outs_state get_irg_outs_state(const ir_graph *irg);
 void           set_irg_outs_inconsistent(ir_graph *irg);
 
+/** state:  extended basic block state. */
+typedef enum {
+  extblk_none    = 0,  /**< No extended basic block information is constructed. Default. */
+  extblk_valid   = 1,  /**< Extended basic block information is valid. */
+  extblk_invalid = 2   /**< Extended basic block information is constructed but invalid. */
+} irg_extblk_state;
+irg_extblk_state get_irg_extblk_state(const ir_graph *irg);
+void             set_irg_extblk_inconsistent(ir_graph *irg);
+
 /** state: dom_state
- * Signals the state of the dominator information.
+ * Signals the state of the dominator / post dominator information.
  */
 typedef enum {
   dom_none,             /**< dominator are not computed, no memory is allocated */
@@ -340,11 +334,14 @@ typedef enum {
   dom_inconsistent      /**< dominator information is computed but the graph has been changed since */
 } irg_dom_state;
 
-/** returns the dom_state of an IR graph. */
+/** returns the dominator state of an IR graph. */
 irg_dom_state get_irg_dom_state(const ir_graph *irg);
 
-/** sets the dom_state of an IR graph. */
-void set_irg_dom_inconsistent(ir_graph *irg);
+/** returns the post dominator state of an IR graph. */
+irg_dom_state get_irg_postdom_state(const ir_graph *irg);
+
+/** sets the dominator and post dominator state of an IR graph to inconsistent. */
+void set_irg_doms_inconsistent(ir_graph *irg);
 
 /** state: loopinfo_state
  *  Loop information describes the loops within the control and
@@ -429,6 +426,20 @@ irg_inline_property get_irg_inline_property(const ir_graph *irg);
 /** Sets the inline property of a graph. */
 void set_irg_inline_property(ir_graph *irg, irg_inline_property s);
 
+/**
+ * Returns the mask of the additional graph properties.
+ * The properties are automatically inherited from the method type
+ * if they were not set using set_irg_additional_properties() or
+ * set_irg_additional_property().
+ */
+unsigned get_irg_additional_properties(const ir_graph *irg);
+
+/** Sets the mask of the additional graph properties. */
+void set_irg_additional_properties(ir_graph *irg, unsigned property_mask);
+
+/** Sets one additional graph property. */
+void set_irg_additional_property(ir_graph *irg, mtp_additional_property flag);
+
 /** A void * field to link arbitrary information to the node. */
 void  set_irg_link (ir_graph *irg, void *thing);
 void *get_irg_link (const ir_graph *irg);
@@ -459,6 +470,14 @@ void set_irg_loc_description(ir_graph *irg, int n, void *description);
 /** get the description for local value n */
 void *get_irg_loc_description(ir_graph *irg, int n);
 
+/** Returns a estimated node count of the irg. This count is updated
+ * after every irg_walk_graph().
+ */
+unsigned get_irg_estimated_node_cnt(const ir_graph *irg);
+
+/** Returns the last irn index for this graph. */
+unsigned get_irg_last_idx(const ir_graph *irg);
+
 /**
  * Access custom graph data.
  * The data must have been registered with
@@ -489,4 +508,4 @@ void *get_irg_loc_description(ir_graph *irg, int n);
  */
 size_t register_additional_graph_data(size_t size);
 
-# endif /* _IRGRAPH_H_ */
+#endif /* _FIRM_IR_IRGRAPH_H_ */