removed INLIEN before global functions
[libfirm] / ir / ir / irnode.h
index d2a3e66..aa96f26 100644 (file)
@@ -13,6 +13,8 @@
 # ifndef _IRNODE_H_
 # define _IRNODE_H_
 
+#include <stddef.h>
+
 /**
  * Projection numbers of compare: use for Proj nodes!
  * @remark there are numbers with normalized names below!
@@ -87,8 +89,7 @@ typedef struct ir_node ir_node;
 #endif
 
 #ifdef __cplusplus
-       extern "C" {
-
+extern "C" {
 #endif
 
 /**
@@ -132,9 +133,9 @@ void          set_irn_in            (ir_node *node, int arity,
  * Get the n-th predecessor of a node.
  * This function removes Id predecessors.
  */
-ir_node      *get_irn_n             (ir_node *node, int n);
-ir_node      *get_irn_intra_n       (ir_node *node, int n);
-ir_node      *get_irn_inter_n       (ir_node *node, int n);
+ir_node      *get_irn_n             (const ir_node *node, int n);
+ir_node      *get_irn_intra_n       (const ir_node *node, int n);
+ir_node      *get_irn_inter_n       (const ir_node *node, int n);
 
 /** Replace the n-th predecessor of a node with a new one. */
 void          set_irn_n             (ir_node *node, int n, ir_node *in);
@@ -180,13 +181,18 @@ void         *get_irn_link     (const ir_node *node);
 
 /** Returns the ir_graph this node belongs to. Only valid if irg
  *  is in state op_pin_state_pinned (irg is only stored in the block. */
-ir_graph     *get_irn_irg      (ir_node *node);
+ir_graph     *get_irn_irg      (const ir_node *node);
 
 /** Outputs a unique number for this node if libFIRM is compiled for
    debugging, (configure with --enable-debug) else returns address
    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.
@@ -210,24 +216,20 @@ new_ir_node (dbg_info *db,
          int arity,
          ir_node *in[]);
 
-/*
- *
- * NAME access functions for node fields.
+/** Return the block the node belongs to.
  *
- *  Not properly documented ;-)
+ * 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 (const ir_node *node);
 
-/** 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
-ir_node  *get_nodes_block (ir_node *node);
-#define set_nodes_block set_nodes_Block
+/** Sets the Block of a node. */
 void      set_nodes_block (ir_node *node, ir_node *block);
 
 /**
- * @function get_irn_block
+ * @function get_irn_block()
  * @see get_nodes_block()
  */
 /**
@@ -274,6 +276,9 @@ bool      get_Block_matured (ir_node *node);
 void      set_Block_matured (ir_node *node, bool matured);
 unsigned long get_Block_block_visited (ir_node *node);
 void      set_Block_block_visited (ir_node *node, unsigned long visit);
+ir_node  *set_Block_dead(ir_node *block);
+int       is_Block_dead(const ir_node *block);
+
 /* For this current_ir_graph must be set. */
 void      mark_Block_block_visited(ir_node *node);
 int       Block_not_block_visited(ir_node *node);
@@ -286,21 +291,28 @@ void      set_Block_cg_cfgpred_arr(ir_node * node, int arity, ir_node ** in);
 void      set_Block_cg_cfgpred(ir_node * node, int pos, ir_node * pred);
 /* @@@ not supported */
 ir_node **get_Block_cg_cfgpred_arr(ir_node * node);
-/* Returns the number of interprocedural predecessors.  0 if none. */
+/** Returns the number of interprocedural predecessors.  0 if none. */
 int       get_Block_cg_n_cfgpreds(ir_node * node);
+/** Return the interprocedural predecessor at position pos. */
 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. */
+/** Return the number of Keep alive node. */
 int  get_End_n_keepalives(ir_node *end);
+
+/** Return the Keep alive node a position pos. */
 ir_node *get_End_keepalive(ir_node *end, int pos);
+
+/** Keep alive dedicated nodes.  These must be either PhiM or Block nodes. */
 void add_End_keepalive (ir_node *end, ir_node *ka);
+
+/** Set the Keep alive node at position pos. */
 void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
-/* Some parts of the End node are allocated separately -- their memory
+
+/** Some parts of the End node are allocated separately -- their memory
    is not recovered by dead_node_elimination if a End node is dead.
-   free_End frees these data structures. */
+   free_End() frees these data structures. */
 void free_End (ir_node *end);
 
 
@@ -315,7 +327,7 @@ void free_End (ir_node *end);
    We differ two flavours of this Cond.  The first, the dense Cond, passes
    control along output i if the selector value is i, 0 <= i <= n.  If the
    selector value is >n it passes control along output n.
-   The second Cond flavor differes in the treatment of cases not specified in
+   The second Cond flavor diffirences in the treatment of cases not specified in
    the source program.  It magically knows about the existence of Proj nodes.
    It only passes control along output i, 0 <= i <= n, if a node Proj(Cond, i)
    exists.  Else it passes control along output n (even if this Proj does not
@@ -368,17 +380,19 @@ typedef enum {
 
 tarval  *get_Const_tarval (ir_node *node);
 void     set_Const_tarval (ir_node *node, tarval *con);
-/* The source language type.  Must be an atomic type.  Mode of type must
-   be mode of node. For tarvals from entities type must be pointer to
-   entity type. */
+
+/** Returns the source language type of a Const node.
+ * Must be an atomic type.  Mode of type must be mode of node.
+ */
 type    *get_Const_type   (ir_node *node);
+
+/** Sets the source language type of a Const node. */
 void     set_Const_type   (ir_node *node, type *tp);
 
 /**  This enum names the three different kinds of symbolic Constants
      represented by SymConst.  The content of the attribute type_or_id
      depends on this tag.  Use the proper access routine after testing
      this flag. */
-
 typedef enum {
   symconst_type_tag,    /**< The SymConst is a type tag for the given type.
                           Type_or_id_p is type *. */
@@ -400,12 +414,12 @@ union symconst_symbol {
   entity *entity_p;
 };
 
-
 typedef union symconst_symbol symconst_symbol;
 
 
-/** Access the kind of the SymConst. */
+/** Get the kind of the SymConst. */
 symconst_kind get_SymConst_kind (const ir_node *node);
+/** Set the kind of the SymConst. */
 void          set_SymConst_kind (ir_node *node, symconst_kind num);
 
 /** Only to access SymConst of kind type_tag or size.  Else assertion: */
@@ -427,6 +441,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 */
@@ -470,59 +490,48 @@ 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 entities can be called that are not in the compilation unit,
+ *  the array contains the unknown_entity.  The array contains only entities
+ *  with peculiarity_existent, but with all kinds of visibility.  The entities
+ *  not necessarily contain an irg.
+ *
+ *  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);
 ir_node  *get_CallBegin_call (ir_node *node);
 void      set_CallBegin_call (ir_node *node, ir_node *call);
 
-ir_node *get_FuncCall_ptr (ir_node *node);
-void     set_FuncCall_ptr (ir_node *node, ir_node *ptr);
-ir_node **get_FuncCall_param_arr (ir_node *node);
-/** Gets the number of parameters of a func call. */
-int      get_FuncCall_n_params (ir_node *node);
-/** Gets the func call parameter at position pos. */
-ir_node *get_FuncCall_param (ir_node *node, int pos);
-/** Sets the func call parameter at position pos. */
-void     set_FuncCall_param (ir_node *node, int pos, ir_node *param);
-/** Gets the type of a func call. */
-type    *get_FuncCall_type (ir_node *node);
-/** Sets the type of a func call. */
-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. */
-int     FuncCall_has_callees      (ir_node *node);
-int     get_FuncCall_n_callees    (ir_node * node);
-entity *get_FuncCall_callee       (ir_node * node, int pos);
-/* assumes current_ir_graph set properly! */
-void    set_FuncCall_callee_arr   (ir_node * node, int n, entity ** arr);
-void    remove_FuncCall_callee_arr(ir_node * node);
-
 /* For unary and binary arithmetic operations the access to the
    operands can be factored out.  Left is the first, right the
    second arithmetic value  as listed in tech report 1999-44.
    unops are: Minus, Abs, Not, Conv, Cast
    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
    Shr, Shrs, Rot, Cmp */
-int      is_unop (ir_node *node);
+int      is_unop (const ir_node *node);
 ir_node *get_unop_op (ir_node *node);
 void     set_unop_op (ir_node *node, ir_node *op);
-int      is_binop (ir_node *node);
+int      is_binop (const ir_node *node);
 ir_node *get_binop_left (ir_node *node);
 void     set_binop_left (ir_node *node, ir_node *left);
 ir_node *get_binop_right (ir_node *node);
@@ -558,7 +567,7 @@ 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_X_except,    /**< Execution result if exception occurred. */
   pn_Quot_res,         /**< Result of computation. */
   pn_Quot_max          /**< number of projections from a Quot */
 } pn_Quot;  /* Projection numbers for Quot. */
@@ -575,7 +584,7 @@ void     set_DivMod_mem (ir_node *node, ir_node *mem);
  */
 typedef enum {
   pn_DivMod_M,           /**< Memory result.    */
-  pn_DivMod_X_except,    /**< Execution result if exception occured. */
+  pn_DivMod_X_except,    /**< Execution result if exception occurred. */
   pn_DivMod_res_div,     /**< Result of computation a / b. */
   pn_DivMod_res_mod,     /**< Result of computation a % b. */
   pn_DivMod_max          /**< number of projections from a DivMod */
@@ -593,7 +602,7 @@ void     set_Div_mem (ir_node *node, ir_node *mem);
  */
 typedef enum {
   pn_Div_M,           /**< Memory result.    */
-  pn_Div_X_except,    /**< Execution result if exception occured. */
+  pn_Div_X_except,    /**< Execution result if exception occurred. */
   pn_Div_res          /**< Result of computation. */
 } pn_Div;  /* Projection numbers for Div. */
 
@@ -609,7 +618,7 @@ 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_X_except,    /**< Execution result if exception occurred. */
   pn_Mod_res,         /**< Result of computation. */
   pn_Mod_max          /**< number of projections from a Mod */
 } pn_Mod;  /* Projection numbers for Mod. */
@@ -640,24 +649,25 @@ void     set_Not_op (ir_node *node, ir_node *op);
  * The bit patterns are used for various tests, so don't change.
  * The "unordered" values are possible results of comparing
  * floating point numbers.
+ * Note that the encoding is imported, so do NOT change the order.
  */
 typedef enum {
-  pn_Cmp_False = 0,   /**< false */
-  pn_Cmp_Eq,          /**< equal */
-  pn_Cmp_Lt,          /**< less */
-  pn_Cmp_Le,          /**< less or equal */
-  pn_Cmp_Gt,          /**< greater */
-  pn_Cmp_Ge,          /**< greater or equal */
-  pn_Cmp_Lg,          /**< less or greater */
-  pn_Cmp_Leg = 7,     /**< less, equal or greater = ordered */
-  pn_Cmp_Uo,          /**< unordered */
-  pn_Cmp_Ue,          /**< unordered or equal */
-  pn_Cmp_Ul,          /**< unordered or less */
-  pn_Cmp_Ule,         /**< unordered, less or equal */
-  pn_Cmp_Ug,          /**< unordered or greater */
-  pn_Cmp_Uge,         /**< unordered, greater or equal */
-  pn_Cmp_Ne,          /**< unordered, less or greater = not equal */
-  pn_Cmp_True = 15    /**< true */
+  pn_Cmp_False = 0,                             /**< false */
+  pn_Cmp_Eq    = 1,                             /**< equal */
+  pn_Cmp_Lt    = 2,                             /**< less */
+  pn_Cmp_Le    = pn_Cmp_Eq|pn_Cmp_Lt,           /**< less or equal */
+  pn_Cmp_Gt    = 4,                             /**< greater */
+  pn_Cmp_Ge    = pn_Cmp_Eq|pn_Cmp_Gt,           /**< greater or equal */
+  pn_Cmp_Lg    = pn_Cmp_Lt|pn_Cmp_Gt,           /**< less or greater */
+  pn_Cmp_Leg   = pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt, /**< less, equal or greater = ordered */
+  pn_Cmp_Uo    = 8,                             /**< unordered */
+  pn_Cmp_Ue    = pn_Cmp_Uo|pn_Cmp_Eq,           /**< unordered or equal */
+  pn_Cmp_Ul    = pn_Cmp_Uo|pn_Cmp_Lt,           /**< unordered or less */
+  pn_Cmp_Ule   = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Lt, /**< unordered, less or equal */
+  pn_Cmp_Ug    = pn_Cmp_Uo|pn_Cmp_Gt,           /**< unordered or greater */
+  pn_Cmp_Uge   = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Gt, /**< unordered, greater or equal */
+  pn_Cmp_Ne    = pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt, /**< unordered, less or greater = not equal */
+  pn_Cmp_True  = 15                             /**< true */
   /* not_mask = Leg*/   /* bits to flip to negate comparison * @@ hack for jni interface */
 } pn_Cmp;   /* Projection numbers for Cmp */
 /* #define not_mask pn_Cmp_Leg */
@@ -694,7 +704,7 @@ void     set_Conv_op (ir_node *node, ir_node *op);
 
 /* Does Cast need a mem operator?
  * Cast should only depend on the type, not on the state of an
- * entity.  But:  we initialze various fields after Alloc, that
+ * entity.  But:  we initialize various fields after Alloc, that
  * are accessed in the cast.  This required some precaution, to
  * get the right memory into the Loads generated from the cast.
  */
@@ -706,10 +716,10 @@ void     set_Cast_type (ir_node *node, type *to_tp);
 /** Returns true if n is Phi or Filter in interprocedural_view.
    Returns false if irg in phase building and the Phi has zero
    predecessors: it's a Phi0. */
-int       is_Phi (ir_node *n);
+int       is_Phi (const ir_node *n);
 /** Returns true  if irg in phase building and the Phi has zero
    predecessors: it's a Phi0. */
-int       is_Phi0 (ir_node *n);
+int       is_Phi0 (const ir_node *n);
 /* These routines also work for Filter nodes in interprocedural view. */
 ir_node **get_Phi_preds_arr (ir_node *node);
 int       get_Phi_n_preds (ir_node *node);
@@ -729,7 +739,7 @@ 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 directly changes the
+ *  A memory operation is an operation that changes the
  *  memory.  I.e., a Load or a Store operation.
  */
 int is_memop(ir_node *node);
@@ -743,7 +753,7 @@ void     set_memop_ptr (ir_node *node, ir_node *ptr);
  */
 typedef enum {
   pn_Load_M,         /**< Memory result.    */
-  pn_Load_X_except,  /**< Execution result if exception occured. */
+  pn_Load_X_except,  /**< Execution result if exception occurred. */
   pn_Load_res,       /**< Result of load operation. */
   pn_Load_max        /**< number of projections from a Load */
 } pn_Load;  /* Projection numbers for Load. */
@@ -762,7 +772,7 @@ void           set_Load_volatility (ir_node *node, ent_volatility volatility);
  */
 typedef enum {
   pn_Store_M,         /**< Memory result.    */
-  pn_Store_X_except,  /**< Execution result if exception occured. */
+  pn_Store_X_except,  /**< Execution result if exception occurred. */
   pn_Store_max        /**< number of projections from a Store */
 } pn_Store;  /* Projection numbers for Store. */
 
@@ -780,7 +790,7 @@ void           set_Store_volatility (ir_node *node, ent_volatility volatility);
  */
 typedef enum {
   pn_Alloc_M,          /**< Memory result. */
-  pn_Alloc_X_except,  /**< Execution result if exception occured. */
+  pn_Alloc_X_except,  /**< Execution result if exception occurred. */
   pn_Alloc_res,       /**< Result of allocation. */
   pn_Alloc_max        /**< number of projections from an Alloc */
 } pn_Alloc;  /* Projection numbers for Alloc. */
@@ -838,6 +848,14 @@ void     set_Confirm_bound (ir_node *node, ir_node *bound);
 pn_Cmp   get_Confirm_cmp   (ir_node *node);
 void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp);
 
+ir_node *get_Mux_sel   (ir_node *node);
+void     set_Mux_sel   (ir_node *node, ir_node *sel);
+ir_node *get_Mux_false (ir_node *node);
+void     set_Mux_false (ir_node *node, ir_node *ir_false);
+ir_node *get_Mux_true  (ir_node *node);
+void     set_Mux_true  (ir_node *node, ir_node *ir_true);
+
+
 /*
  *
  * NAME Auxiliary routines
@@ -856,30 +874,65 @@ ir_node *skip_Tuple (ir_node *node);
 /** returns operand of node if node is a Cast */
 ir_node *skip_Cast  (ir_node *node);
 /** returns true if node is a Bad node. */
-int      is_Bad    (ir_node *node);
+int      is_Bad    (const ir_node *node);
 /** returns true if the node is not a Block */
-int      is_no_Block (ir_node *node);
+int      is_no_Block (const ir_node *node);
 /** returns true if the node is a Block */
-int      is_Block (ir_node *node);
+int      is_Block (const ir_node *node);
 /** returns true if node is a Unknown node. */
-int      is_Unknown (ir_node *node);
+int      is_Unknown (const ir_node *node);
 /** returns true if node is a Proj node or a Filter node in
  * intraprocedural view */
 int      is_Proj (const ir_node *node);
 /** Returns true if the operation manipulates control flow:
    Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */
-int is_cfop(ir_node *node);
+int is_cfop(const ir_node *node);
 
 /** Returns true if the operation manipulates interprocedural control flow:
     CallBegin, EndReg, EndExcept */
-int is_ip_cfop(ir_node *node);
+int is_ip_cfop(const ir_node *node);
 /** Returns true if the operation can change the control flow because
     of an exception: Call, Quot, DivMod, Div, Mod, Load, Store, Alloc,
     Bad. */
-int is_fragile_op(ir_node *node);
+int is_fragile_op(const 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(const ir_node *node);
+
+/**
+ * Access custom node data.
+ * The data must have been registered with
+ * register_additional_node_data() before.
+ * @param node The ir node to get the data from.
+ * @param type The type of the data you registered.
+ * @param off The value returned by register_additional_node_data().
+ * @return A pointer of type @p type.
+ */
+#define get_irn_data(node,type,off) \
+  (assert(off > 0 && "Invalid node data offset"), (type *) ((char *) (node) - (off)))
+
+/**
+ * Get the pointer to the node some custom data belongs to.
+ * @param data The pointer to the custom data.
+ * @param off The number as returned by register_additional_node_data().
+ * @return A pointer to the ir node the custom data belongs to.
+ */
+#define get_irn_data_base(data,off) \
+  (assert(off > 0 && "Invalid node data offset"), (ir_node *) ((char *) (data) + (off)))
+
+/**
+ * Request additional data to be allocated with an ir node.
+ * @param size The size of the additional data required.
+ * @return A positive number, if the operation was successful, which
+ * must be passed to the access macro get_irn_data(), 0 if the
+ * registration failed.
+ */
+unsigned register_additional_node_data(unsigned size);
+
+
 /*-----------------------------------------------------------------*/
 /** Debug aides                                                   **/
 /*-----------------------------------------------------------------*/