replaced all recursive computed_value calls ba value_of()
[libfirm] / ir / ir / irnode.h
index 8621923..4803fcc 100644 (file)
@@ -18,7 +18,7 @@
  * @remark there are numbers with normalized names below!
  */
 typedef enum {
-  False = 0,        /**< false */
+  False = 0,    /**< false */
   Eq,           /**< equal */
   Lt,           /**< less */
   Le,           /**< less or equal */
@@ -33,7 +33,7 @@ typedef enum {
   Ug,           /**< unordered or greater */
   Uge,          /**< unordered, greater or equal */
   Ne,           /**< unordered, less or greater = not equal */
-  True = 15         /**< true */
+  True = 15     /**< true */
   /* not_mask = Leg*/   /* bits to flip to negate comparison * @@ hack for jni interface */
 } pnc_number;   /* pnc: Projection Number Cmp */
 #define not_mask Leg
@@ -87,8 +87,7 @@ typedef struct ir_node ir_node;
 #endif
 
 #ifdef __cplusplus
-       extern "C" {
-
+extern "C" {
 #endif
 
 /**
@@ -187,6 +186,11 @@ ir_graph     *get_irn_irg      (ir_node *node);
    of node cast to long. */
 long          get_irn_node_nr  (const ir_node *node);
 
+/** Returns the pinned state of a node. */
+op_pin_state get_irn_pinned    (const ir_node *node);
+
+/** Set pin state for nodes with op pin state op_pin_state_exc_pinned */
+void set_irn_pinned(ir_node *node, op_pin_state state);
 
 /**
  * irnode constructor.
@@ -218,31 +222,33 @@ new_ir_node (dbg_info *db,
  *
  */
 
-/** This works for all except Block.  To express the difference to
- * access routines that work for all nodes we use infix "nodes" and do not
- * name this function get_irn_block. */
-#define get_nodes_block get_nodes_Block
+/** Return the block the node belongs to.
+ *
+ * This works for all except Block.  It can return Blocks or the Bad node.
+ *
+ * To express the difference to access routines that work for all
+ * nodes we use infix "nodes" and do not name this function
+ * get_irn_block. */
 ir_node  *get_nodes_block (ir_node *node);
-#define set_nodes_block set_nodes_Block
 void      set_nodes_block (ir_node *node, ir_node *block);
 
 /**
  * @function get_irn_block
  * @see get_nodes_block()
  */
-
 /**
  * Projection numbers for result of Start node: use for Proj nodes!
  */
 typedef enum {
-  pn_Start_X_initial_exec,  /**< Projection on the initial control flow. */
-  pn_Start_M,               /**< Projection on the initial memory. */
-  pn_Start_P_frame_base,    /**< Projection on the frame base pointer. */
-  pn_Start_P_globals,       /**< Projection on the pointer to the data segment
-                   containing _all_ global entities. */
-  pn_Start_T_args,          /**< Projection on all arguments. */
-  pn_Start_P_value_arg_base /**< Pointer to region of compound value arguments as defined by
-                   type of this method. */
+  pn_Start_X_initial_exec,   /**< Projection on the initial control flow. */
+  pn_Start_M,                /**< Projection on the initial memory. */
+  pn_Start_P_frame_base,     /**< Projection on the frame base pointer. */
+  pn_Start_P_globals,        /**< Projection on the pointer to the data segment
+                                  containing _all_ global entities. */
+  pn_Start_T_args,           /**< Projection on all arguments. */
+  pn_Start_P_value_arg_base, /**< Pointer to region of compound value arguments as defined by
+                                  type of this method. */
+  pn_Start_max               /**< number of projections from a Start */
 } pn_Start; /* Projection numbers for Start. */
 
 
@@ -292,6 +298,8 @@ ir_node  *get_Block_cg_cfgpred(ir_node * node, int pos);
 /* frees the memory. */
 void      remove_Block_cg_cfgpred_arr(ir_node * node);
 
+/** Keep alive dedicated nodes.  These must be either
+ *  PhiM or Block nodes. */
 int  get_End_n_keepalives(ir_node *end);
 ir_node *get_End_keepalive(ir_node *end, int pos);
 void add_End_keepalive (ir_node *end, ir_node *ka);
@@ -339,7 +347,8 @@ long      get_Cond_defaultProj (ir_node *node);
  */
 typedef enum {
   pn_Cond_false,    /**< Control flow if operand is "false". */
-  pn_Cond_true      /**< Control flow if operand is "true".  */
+  pn_Cond_true,     /**< Control flow if operand is "true".  */
+  pn_Cond_max       /**< number of projections from a Cond */
 } pn_Cond;  /* Projection numbers for Cond. */
 
 ir_node  *get_Return_mem (ir_node *node);
@@ -359,7 +368,8 @@ void     set_Raise_exo_ptr (ir_node *node, ir_node *exoptr);
  */
 typedef enum {
   pn_Raise_X,    /**< Execution result. */
-  pn_Raise_M     /**< Memory result.    */
+  pn_Raise_M,    /**< Memory result.    */
+  pn_Raise_max   /**< number of projections from a Raise */
 } pn_Raise;  /* Projection numbers for Raise. */
 
 tarval  *get_Const_tarval (ir_node *node);
@@ -423,6 +433,12 @@ union symconst_symbol get_SymConst_symbol (ir_node *node);
 void                  set_SymConst_symbol (ir_node *node,
                                           union symconst_symbol sym);
 
+/** Access the type of the value represented by the SymConst.
+ *
+ *  Example: primitive type int for SymConst size. */
+type *get_SymConst_value_type (ir_node *node);
+void  set_SymConst_value_type (ir_node *node, type *tp);
+
 ir_node *get_Sel_mem (ir_node *node);
 void     set_Sel_mem (ir_node *node, ir_node *mem);
 ir_node *get_Sel_ptr (ir_node *node);  /* ptr to the object to select from */
@@ -445,7 +461,7 @@ typedef enum {
   pn_Call_X_except  = 1,  /**< The control flow result branching to the exception handler */
   pn_Call_M_except  = 3,  /**< The memory result in case the called method terminated with
                  an exception */
-  pn_Call_max       = 5   /**< number of prejections from a Call */
+  pn_Call_max       = 5   /**< number of projections from a Call */
 } pn_Call;   /* Projection numbers for Call. */
 
 ir_node *get_Call_mem (ir_node *node);
@@ -466,16 +482,29 @@ void     set_Call_type (ir_node *node, type *tp);
 /** Gets the arity of a call. Identical to get_Call_n_params(). */
 int      get_Call_arity (ir_node *node);
 
-/* Set, get and remove the callee-analysis.
-   The array is only accessible if information is valid.
-   It contains NULL for called methods that are not within
-   the compilation unit. */
+/** Set, get and remove the callee information for a Call node.
+ *
+ *  The callee information lists all method entities that can be called
+ *  from this node.  If the address expression can not be analyzed fully,
+ *  e.g., as there are external methods that could be called, the array
+ *  contains a single NULL entry.
+ *
+ *  The array is only accessible if callee information is valid.  See flag
+ *  in graph.
+ *
+ *  The memory allocated for the array is managed automatically, i.e., it must
+ *  not be freed if the Call node is removed from the graph.
+ *
+ *  @param node A Call node.
+ */
 int     Call_has_callees      (ir_node *node);
-int     get_Call_n_callees    (ir_node * node);
-entity *get_Call_callee       (ir_node * node, int pos);
-/* assumes current_ir_graph set properly! */
-void    set_Call_callee_arr   (ir_node * node, int n, entity ** arr);
-void    remove_Call_callee_arr(ir_node * node);
+int     get_Call_n_callees    (ir_node *node);
+entity *get_Call_callee       (ir_node *node, int pos);
+/** Set the full callee array.
+ *
+ *  The passed array is copied. Assumes current_ir_graph set properly! */
+void    set_Call_callee_arr   (ir_node *node, const int n, entity **arr);
+void    remove_Call_callee_arr(ir_node *node);
 
 ir_node  *get_CallBegin_ptr  (ir_node *node);
 void      set_CallBegin_ptr  (ir_node *node, ir_node *ptr);
@@ -498,10 +527,21 @@ void     set_FuncCall_type (ir_node *node, type *tp);
 /** Gets the arity of a func call. Identical to get_FuncCall_n_params(). */
 int      get_FuncCall_arity (ir_node *node);
 
-/* Set, get and remove the callee-analysis.
-   The array is only accessible if information is valid.
-   It contains NULL for called methods that are not within
-   the compilation unit. */
+/** Set, get and remove the callee information for a Call node.
+ *
+ *  The callee information lists all method entities that can be called
+ *  from this node.  If the address expression can not be analyzed fully,
+ *  e.g., as there are external methods that could be called, the array
+ *  contains a single NULL entry.
+ *
+ *  The array is only accessible if callee information is valid.  See flag
+ *  in graph.
+ *
+ *  The memory allocated for the array is managed automatically, i.e., it must
+ *  not be freed if the Call node is removed from the graph.
+ *
+ *  @param node A FuncCall node.
+ */
 int     FuncCall_has_callees      (ir_node *node);
 int     get_FuncCall_n_callees    (ir_node * node);
 entity *get_FuncCall_callee       (ir_node * node, int pos);
@@ -555,7 +595,8 @@ void     set_Quot_mem (ir_node *node, ir_node *mem);
 typedef enum {
   pn_Quot_M,           /**< Memory result.    */
   pn_Quot_X_except,    /**< Execution result if exception occured. */
-  pn_Quot_res          /**< Result of computation. */
+  pn_Quot_res,         /**< Result of computation. */
+  pn_Quot_max          /**< number of projections from a Quot */
 } pn_Quot;  /* Projection numbers for Quot. */
 
 ir_node *get_DivMod_left (ir_node *node);
@@ -572,7 +613,8 @@ typedef enum {
   pn_DivMod_M,           /**< Memory result.    */
   pn_DivMod_X_except,    /**< Execution result if exception occured. */
   pn_DivMod_res_div,     /**< Result of computation a / b. */
-  pn_DivMod_res_mod      /**< Result of computation a % b. */
+  pn_DivMod_res_mod,     /**< Result of computation a % b. */
+  pn_DivMod_max          /**< number of projections from a DivMod */
 } pn_DivMod;  /* Projection numbers for DivMod. */
 
 ir_node *get_Div_left (ir_node *node);
@@ -604,7 +646,8 @@ void     set_Mod_mem (ir_node *node, ir_node *mem);
 typedef enum {
   pn_Mod_M,           /**< Memory result.    */
   pn_Mod_X_except,    /**< Execution result if exception occured. */
-  pn_Mod_res          /**< Result of computation. */
+  pn_Mod_res,         /**< Result of computation. */
+  pn_Mod_max          /**< number of projections from a Mod */
 } pn_Mod;  /* Projection numbers for Mod. */
 
 ir_node *get_Abs_op (ir_node *node);
@@ -720,42 +763,62 @@ void     set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred);
 int      get_Filter_n_cg_preds(ir_node *node);
 ir_node *get_Filter_cg_pred(ir_node *node, int pos);
 
+/** Return true if parameter is a memory operation.
+ *
+ *  A memory operation is an operation that changes the
+ *  memory.  I.e., a Load or a Store operation.
+ */
+int is_memop(ir_node *node);
+ir_node *get_memop_mem (ir_node *node);
+void     set_memop_mem (ir_node *node, ir_node *mem);
+ir_node *get_memop_ptr (ir_node *node);
+void     set_memop_ptr (ir_node *node, ir_node *ptr);
+
 /**
  * Projection numbers for Load: use for Proj nodes!
  */
 typedef enum {
   pn_Load_M,         /**< Memory result.    */
   pn_Load_X_except,  /**< Execution result if exception occured. */
-  pn_Load_res        /**< Result of load operation. */
+  pn_Load_res,       /**< Result of load operation. */
+  pn_Load_max        /**< number of projections from a Load */
 } pn_Load;  /* Projection numbers for Load. */
 
-ir_node *get_Load_mem (ir_node *node);
-void     set_Load_mem (ir_node *node, ir_node *mem);
-ir_node *get_Load_ptr (ir_node *node);
-void     set_Load_ptr (ir_node *node, ir_node *ptr);
+ir_node       *get_Load_mem (ir_node *node);
+void           set_Load_mem (ir_node *node, ir_node *mem);
+ir_node       *get_Load_ptr (ir_node *node);
+void           set_Load_ptr (ir_node *node, ir_node *ptr);
+ir_mode       *get_Load_mode (ir_node *node);
+void           set_Load_mode (ir_node *node, ir_mode *mode);
+ent_volatility get_Load_volatility (ir_node *node);
+void           set_Load_volatility (ir_node *node, ent_volatility volatility);
 
 /**
  * Projection numbers for Store: use for Proj nodes!
  */
 typedef enum {
   pn_Store_M,         /**< Memory result.    */
-  pn_Store_X_except   /**< Execution result if exception occured. */
+  pn_Store_X_except,  /**< Execution result if exception occured. */
+  pn_Store_max        /**< number of projections from a Store */
 } pn_Store;  /* Projection numbers for Store. */
 
-ir_node *get_Store_mem (ir_node *node);
-void     set_Store_mem (ir_node *node, ir_node *mem);
-ir_node *get_Store_ptr (ir_node *node);
-void     set_Store_ptr (ir_node *node, ir_node *ptr);
-ir_node *get_Store_value (ir_node *node);
-void     set_Store_value (ir_node *node, ir_node *value);
+ir_node       *get_Store_mem (ir_node *node);
+void           set_Store_mem (ir_node *node, ir_node *mem);
+ir_node       *get_Store_ptr (ir_node *node);
+void           set_Store_ptr (ir_node *node, ir_node *ptr);
+ir_node       *get_Store_value (ir_node *node);
+void           set_Store_value (ir_node *node, ir_node *value);
+ent_volatility get_Store_volatility (ir_node *node);
+void           set_Store_volatility (ir_node *node, ent_volatility volatility);
 
 /**
  * Projection numbers for Alloc: use for Proj nodes!
  */
 typedef enum {
-  pn_Alloc_M,    /**< Memory result. */
-  pn_Alloc_X_except,    /**< Execution result if exception occured. */
-  pn_Alloc_res   /**< Result of allocation. */
+  pn_Alloc_M,          /**< Memory result. */
+  pn_Alloc_X_except,  /**< Execution result if exception occured. */
+  pn_Alloc_res,       /**< Result of allocation. */
+  pn_Alloc_max        /**< number of projections from an Alloc */
 } pn_Alloc;  /* Projection numbers for Alloc. */
 
 ir_node *get_Alloc_mem (ir_node *node);
@@ -853,6 +916,10 @@ int is_fragile_op(ir_node *node);
 /** Returns the memory operand of fragile operations. */
 ir_node *get_fragile_op_mem(ir_node *node);
 
+/** Returns true if the operation is a forking control flow
+ *  operation: Cond. */
+int is_forking_op(ir_node *node);
+
 /*-----------------------------------------------------------------*/
 /** Debug aides                                                   **/
 /*-----------------------------------------------------------------*/
@@ -893,7 +960,7 @@ void    dump_irn(ir_node *n);
 /** Output information about an entity and its owner */
 #define DDMEO(X) printf("%s(l.%i) %s (own: %s): %ld (%p)\n", __MYFUNC__, __LINE__, get_entity_name(X), get_type_name(get_entity_owner(X)), get_entity_nr(X), (void *)(X))
 /** Output information about a graph */
-#define DDMG(X)  printf("%s(l.%i) %s: %ld (%p)\n",           __MYFUNC__, __LINE__, get_entity_name(get_irg_entity(X)), get_irg_graph_nr(X), (void *)(X))
+#define DDMG(X)  printf("%s(l.%i) graph %s: %ld (%p) in %s %s.\n", __MYFUNC__, __LINE__, get_entity_name(get_irg_entity(X)), get_irg_graph_nr(X), (void *)(X), get_type_tpop_name(get_entity_owner(get_irg_entity(X))), get_type_name(get_entity_owner(get_irg_entity(X))))
 /** Output information about an ident */
 #define DDMI(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_id_str(X), (void *)(X))
 /** Output information about a mode */