bugfix: typeo
[libfirm] / ir / ir / irnode.h
index c615ad4..5d51cec 100644 (file)
@@ -86,6 +86,11 @@ typedef enum {
 typedef struct ir_node ir_node;
 #endif
 
+#ifdef __cplusplus
+       extern "C" {
+
+#endif
+
 /**
  *   you can work on the graph without considering the different types
  *   of nodes, it's just a big graph.
@@ -94,16 +99,17 @@ typedef struct ir_node ir_node;
 /**
  *   Checks whether a pointer points to a ir node.
  *
- *   @param thing     an arbitrary pointer
- *
- *   @return
- *       true if the thing is a ir mode, else false
+ *   @param thing   an arbitrary pointer
+ *   @return        non-zero if the thing is a ir mode, else zero
  */
-int
-is_ir_node (const void *thing);
+int is_ir_node (const void *thing);
 
-/** returns the number of predecessors without the block predecessor: */
-int                  get_irn_arity         (const ir_node *node);
+/**
+ * Returns the number of predecessors without the block predecessor.
+ *
+ * @param node   the IR-node
+ */
+int           get_irn_arity         (const ir_node *node);
 int           get_irn_intra_arity   (const ir_node *node);
 int           get_irn_inter_arity   (const ir_node *node);
 
@@ -121,14 +127,20 @@ void          set_irn_in            (ir_node *node, int arity,
    to iterate including the Block predecessor iterate from i = -1 to
    i < get_irn_arity. */
 /* Access predecessor n */
-/* get_irn_n removes Id predecessors. */
+
+/**
+ * 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);
+
+/** Replace the n-th predecessor of a node with a new one. */
 void          set_irn_n             (ir_node *node, int n, ir_node *in);
-/** Sets the mode struct of node */
+/* Sets the mode struct of node.  */
 void          set_irn_mode (ir_node *node, ir_mode *mode);
-/** Gets the mode struct. */
+/** Gets the mode struct of a node.  */
 ir_mode      *get_irn_mode          (const ir_node *node);
 /** Gets the mode-enum modecode. */
 modecode      get_irn_modecode      (const ir_node *node);
@@ -136,7 +148,7 @@ modecode      get_irn_modecode      (const ir_node *node);
 ident        *get_irn_modeident     (const ir_node *node);
 /** Gets the string representation of the mode .*/
 const char   *get_irn_modename      (const ir_node *node);
-/** Gets the opcode struct of the node */
+/** Gets the opcode struct of the node. */
 ir_op        *get_irn_op            (const ir_node *node);
 /** Sets the opcode struct of the node. */
 void          set_irn_op            (ir_node *node, ir_op *op);
@@ -146,19 +158,28 @@ opcode        get_irn_opcode        (const ir_node *node);
 const char   *get_irn_opname        (const ir_node *node);
 /** Get the ident for a string representation of the opcode. */
 ident        *get_irn_opident       (const ir_node *node);
+/** Gets the visited counter of a node. */
 unsigned long get_irn_visited (const ir_node *node);
+/** Sets the visited counter of a node. */
 void          set_irn_visited (ir_node *node, unsigned long visited);
 /** Sets visited to get_irg_visited(current_ir_graph). */
 void          mark_irn_visited (ir_node *node);
-/** Returns 1 if visited < get_irg_visited(current_ir_graph).  */
+/** Returns 1 if visited < get_irg_visited(current_ir_graph). */
 int           irn_not_visited  (const ir_node *node);
-/** Returns 1 if visited >= get_irg_visited(current_ir_graph).  */
+/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */
 int           irn_visited      (const ir_node *node);
+
+/**
+ * Sets the link of a node.
+ * Only allowed if the graph is NOT in phase_building.
+ */
 void          set_irn_link     (ir_node *node, void *link);
+
+/** Returns the link of a node.  */
 void         *get_irn_link     (const ir_node *node);
 
 /** Returns the ir_graph this node belongs to. Only valid if irg
- *  is in state pinned (irg is only stored in the block. */
+ *  is in state op_pin_state_pinned (irg is only stored in the block. */
 ir_graph     *get_irn_irg      (ir_node *node);
 
 /** Outputs a unique number for this node if libFIRM is compiled for
@@ -197,13 +218,18 @@ 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". */
+/** 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);
+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);
+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!
  */
@@ -218,21 +244,6 @@ typedef enum {
                    type of this method. */
 } pn_Start; /* Projection numbers for Start. */
 
-/**
- * Projection numbers for result of Start node: use for Proj nodes!
- * @remark This is the old name convention, don't use anymore.
- */
-typedef enum {
-  pns_initial_exec,     /**< Projection on an executable, the initial control
-               flow. */
-  pns_global_store,     /**< Projection on the global store */
-  pns_frame_base,       /**< Projection on the frame base */
-  pns_globals,          /**< Projection on the pointer to the data segment
-                 containing _all_ global entities. */
-  pns_args,             /**< Projection on all arguments */
-  pns_value_arg_base    /**< Pointer to region of compound value arguments as defined by
-                 type of this method. */
-} pns_number; /* pns: Projection Number Start */
 
 /** Test whether arbitrary node is frame pointer.
  *
@@ -255,7 +266,7 @@ int   is_value_arg_pointer(ir_node *n);
 
 /* @@@ no more supported  */
 ir_node **get_Block_cfgpred_arr (ir_node *node);
-int              get_Block_n_cfgpreds (ir_node *node);
+int       get_Block_n_cfgpreds (ir_node *node);
 ir_node  *get_Block_cfgpred (ir_node *node, int pos);
 void      set_Block_cfgpred (ir_node *node, int pos, ir_node *pred);
 bool      get_Block_matured (ir_node *node);
@@ -280,10 +291,8 @@ ir_node  *get_Block_cg_cfgpred(ir_node * node, int pos);
 /* frees the memory. */
 void      remove_Block_cg_cfgpred_arr(ir_node * node);
 
-/* Start references the irg it is in.
- @@@ old -- use get_irn_irg instead! */
-ir_graph *get_Start_irg(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);
@@ -293,9 +302,6 @@ void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
    free_End frees these data structures. */
 void free_End (ir_node *end);
 
-/* @@@ old -- use get_irn_irg instead!  */
-ir_graph *get_EndReg_irg (ir_node *end);
-ir_graph *get_EndExcept_irg (ir_node *end);
 
 /* We distinguish three kinds of Cond nodes.  These can be distinguished
    by the mode of the selector operand and an internal flag of type cond_kind.
@@ -327,6 +333,7 @@ ir_node  *get_Cond_selector (ir_node *node);
 void      set_Cond_selector (ir_node *node, ir_node *selector);
 cond_kind get_Cond_kind (ir_node *node);
 void      set_Cond_kind (ir_node *node, cond_kind kind);
+long      get_Cond_defaultProj (ir_node *node);
 
 /**
  * Projection numbers for conditions.
@@ -368,28 +375,54 @@ void     set_Const_type   (ir_node *node, type *tp);
      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 {
-  type_tag,          /**< The SymConst is a type tag for the given type.
-            Type_or_id_p is type *. */
-  size,              /**< The SymConst is the size of the given type.
-            Type_or_id_p is type *. */
-  linkage_ptr_info   /**< The SymConst is a symbolic pointer to be filled in
-            by the linker. Type_or_id_p is ident *. */
+  symconst_type_tag,    /**< The SymConst is a type tag for the given type.
+                          Type_or_id_p is type *. */
+  symconst_size,        /**< The SymConst is the size of the given type.
+                          Type_or_id_p is type *. */
+  symconst_addr_name,   /**< The SymConst is a symbolic pointer to be filled in
+                          by the linker.  The pointer is represented by a string.
+                          Type_or_id_p is ident *. */
+  symconst_addr_ent     /**< The SymConst is a symbolic pointer to be filled in
+                          by the linker.  The pointer is represented by an entity.
+                          Type_or_id_p is entity *. */
 } symconst_kind;
 
-typedef union type_or_id * type_or_id_p;
+/** SymConst attributes
+    This union contains the symbolic information represented by the node  */
+union symconst_symbol {
+  type   *type_p;
+  ident  *ident_p;
+  entity *entity_p;
+};
+
+
+typedef union symconst_symbol symconst_symbol;
+
+
+/** Access the kind of the SymConst. */
 symconst_kind get_SymConst_kind (const ir_node *node);
 void          set_SymConst_kind (ir_node *node, symconst_kind num);
-/* Only to access SymConst of kind type_tag or size.  Else assertion: */
+
+/** Only to access SymConst of kind type_tag or size.  Else assertion: */
 type    *get_SymConst_type (ir_node *node);
 void     set_SymConst_type (ir_node *node, type *tp);
-/* Only to access SymConst of kind linkage_ptr_info.  Else assertion: */
-ident   *get_SymConst_ptrinfo (ir_node *node);
-void     set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo);
-/* Sets both: type and ptrinfo.  Needed to treat the node independent of
-   its semantics.  Does a memcpy for the memory tori points to. */
-type_or_id_p get_SymConst_type_or_id (ir_node *node);
-void set_SymConst_type_or_id (ir_node *node, type_or_id_p tori);
+
+/** Only to access SymConst of kind addr_name.  Else assertion: */
+ident   *get_SymConst_name (ir_node *node);
+void     set_SymConst_name (ir_node *node, ident *name);
+
+/** Only to access SymConst of kind addr_ent.  Else assertion: */
+entity  *get_SymConst_entity (ir_node *node);
+void     set_SymConst_entity (ir_node *node, entity *ent);
+
+/** Sets both: type and ptrinfo.  Needed to treat the node independent of
+   its semantics.  Does a memcpy for the memory sym points to. */
+/* write 'union': firmjni then does not create a method... */
+union symconst_symbol get_SymConst_symbol (ir_node *node);
+void                  set_SymConst_symbol (ir_node *node,
+                                          union symconst_symbol sym);
 
 ir_node *get_Sel_mem (ir_node *node);
 void     set_Sel_mem (ir_node *node, ir_node *mem);
@@ -402,21 +435,6 @@ void     set_Sel_index (ir_node *node, int pos, ir_node *index);
 entity  *get_Sel_entity (ir_node *node); /* entity to select */
 void     set_Sel_entity (ir_node *node, entity *ent);
 
-/**
- * Projection numbers for result of Call node: use for Proj nodes!
- *
- * @remark old name convention!
- */
-typedef enum {
-  pncl_memory = 0,        /**< The memory result. */
-  pncl_exc_target = 1,    /**< The control flow result branching to the exception handler */
-  pncl_result_tuple = 2,  /**< The tuple containing all (0, 1, 2, ...) results */
-  pncl_exc_memory = 3,    /**< The memory result in case the called method terminated with
-                  an exception */
-  pncl_value_res_base = 4 /**< A pointer to the memory region containing copied results
-                  passed by value (for compound result types). */
-} pncl_number;   /* pncl: Projection Number CaLl */
-
 /**
  * Projection numbers for result of Call node: use for Proj nodes!
  */
@@ -426,8 +444,9 @@ typedef enum {
   pn_Call_P_value_res_base = 4,/**< A pointer to the memory region containing copied results
                  passed by value (for compound result types). */
   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
+  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;   /* Projection numbers for Call. */
 
 ir_node *get_Call_mem (ir_node *node);
@@ -461,8 +480,6 @@ 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);
-/* @@@ old -- use get_irn_irg instead!  */
-ir_graph *get_CallBegin_irg  (ir_node *node);
 ir_node  *get_CallBegin_call (ir_node *node);
 void      set_CallBegin_call (ir_node *node, ir_node *call);
 
@@ -680,8 +697,13 @@ void     set_Cast_op (ir_node *node, ir_node *op);
 type    *get_Cast_type (ir_node *node);
 void     set_Cast_type (ir_node *node, type *to_tp);
 
-/* Returns true if n is Phi or Filter in interprocedural_view. */
+/** 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);
+/** Returns true  if irg in phase building and the Phi has zero
+   predecessors: it's a Phi0. */
+int       is_Phi0 (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);
@@ -694,10 +716,21 @@ long      get_Filter_proj(ir_node *node);
 void      set_Filter_proj(ir_node *node, long proj);
 /* set the interprocedural predecessors, ...d_arr uses current_ir_graph.
  * @@@ Maybe better:  arity is zero if no cg preds. */
-void             set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
-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);
+void     set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in);
+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 directly 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!
@@ -769,7 +802,6 @@ void      set_Sync_pred (ir_node *node, int pos, ir_node *pred);
 
 ir_node  *get_Proj_pred (ir_node *node);
 void      set_Proj_pred (ir_node *node, ir_node *pred);
-/* Why long? shouldn't int be enough, and smaller? Or even byte? */
 long      get_Proj_proj (ir_node *node);
 void      set_Proj_proj (ir_node *node, long proj);
 
@@ -802,7 +834,6 @@ void     set_Confirm_cmp   (ir_node *node, pn_Cmp cmp);
 /** returns operand of node if node is a Proj. */
 ir_node *skip_Proj (ir_node *node);
 /** returns operand of node if node is a Id */
-ir_node *skip_nop  (ir_node *node);
 ir_node *skip_Id  (ir_node *node);   /* Same as skip_nop. */
 /* returns corresponding operand of Tuple if node is a Proj from
    a Tuple. */
@@ -824,9 +855,6 @@ int      is_Proj (const ir_node *node);
    Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */
 int is_cfop(ir_node *node);
 
-/* @@@ old -- use get_irn_irg instead!  */
-ir_graph *get_ip_cfop_irg(ir_node *n);
-
 /** Returns true if the operation manipulates interprocedural control flow:
     CallBegin, EndReg, EndExcept */
 int is_ip_cfop(ir_node *node);
@@ -837,6 +865,17 @@ int is_fragile_op(ir_node *node);
 /** Returns the memory operand of fragile operations. */
 ir_node *get_fragile_op_mem(ir_node *node);
 
+/*-----------------------------------------------------------------*/
+/** Debug aides                                                   **/
+/*-----------------------------------------------------------------*/
+
+
+/** Debug print the node.
+ *
+ *  Writes the node, all its attributes and the predecessors to stdout if DEBUG_libfirm
+ *  is set.  Else does nothing. */
+void    dump_irn(ir_node *n);
+
 #include "ident.h"
 
 #ifdef __GNUC__
@@ -856,7 +895,7 @@ ir_node *get_fragile_op_mem(ir_node *node);
 /** Output information about a node */
 #define DDMN(X)  printf("%s(l.%i) %s%s: %ld (%p)\n",         __MYFUNC__, __LINE__,  get_irn_opname(X), get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), (void *)(X))
 /** Output information about a node and its block */
-#define DDMNB(X) printf("%s%s: %ld (in block %ld)\n", get_irn_opname(X),  get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), get_irn_node_nr(get_nodes_Block(X)))
+#define DDMNB(X) printf("%s%s: %ld (in block %ld)\n", get_irn_opname(X),  get_mode_name(get_irn_mode(X)), get_irn_node_nr(X), get_irn_node_nr(get_nodes_block(X)))
 /** Output information about a type */
 #define DDMT(X)  printf("%s(l.%i) %s %s: %ld (%p)\n",        __MYFUNC__, __LINE__, get_type_tpop_name(X), get_type_name(X), get_type_nr(X), (void *)(X))
 /** Output information about an entity */
@@ -866,9 +905,9 @@ ir_node *get_fragile_op_mem(ir_node *node);
 /** 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_ent(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__, id_to_str(X), (void *)(X))
+#define DDMI(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_id_str(X), (void *)(X))
 /** Output information about a mode */
 #define DDMM(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_mode_name(X), (void *)(X))
 /** Output information about a loop */
@@ -879,4 +918,8 @@ ir_node *get_fragile_op_mem(ir_node *node);
 /*@}*/ /* end of ir_node group definition */
 
 
+#ifdef __cplusplus
+}
+#endif
+
 # endif /* _IRNODE_H_ */