Typo fixed.
[libfirm] / ir / ir / irnode.h
index a805097..aa11d37 100644 (file)
@@ -1,13 +1,5 @@
 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe      3 2002/02/28 13:33:52
-* All rights reserved.
-*/
-
-/**
- * @file irnode.h
- *
- * Declarations of an ir node.
- *
- * author Martin Trapp, Christian Schaefer
+ * All rights reserved.
  */
 
 /* $Id$ */
 # ifndef _IRNODE_H_
 # define _IRNODE_H_
 
+/** Projection numbers of compare: use for Proj nodes! */
+typedef enum {
+  False = 0,           /**< false */
+  Eq,                  /**< equal */
+  Lt,                  /**< less */
+  Le,                  /**< less or equal */
+  Gt,                  /**< greater */
+  Ge,                  /**< greater or equal */
+  Lg,                  /**< less or greater */
+  Leg = 7,             /**< less, equal or greater = ordered */
+  Uo,                  /**< unordered */
+  Ue,                  /**< unordered or equal */
+  Ul,                  /**< unordered or less */
+  Ule,                 /**< unordered, less or equal */
+  Ug,                  /**< unordered or greater */
+  Uge,                 /**< unordered, greater or equal */
+  Ne,                  /**< unordered, less or greater = not equal */
+  True = 15            /**< true */
+  /* not_mask = Leg*/  /* bits to flip to negate comparison * @@ hack for jni interface */
+} pnc_number;
+#define not_mask Leg
+
+# include "tv.h"
 # include "irgraph.h"
 # include "entity.h"
 # include "firm_common.h"
 # include "irop.h"
 # include "irmode.h"
-# include "tv.h"
 # include "type.h"
 # include "dbginfo.h"
 # include "exc.h"
 
-/* The type definiton of ir_node is also in irgraph.h to resolve
-   recursion between irnode.h and irgraph.h */
-/*
+/**
+ * @file irnode.h
  *
- * NAME ir_node - a datatype representing a Firm node
+ * @author Martin Trapp, Christian Schaefer
  *
- *  Not properly documented ;-)
+ * Declarations of an ir node.
+ */
+
+/**
+ * @defgroup ir_node Declarations of an ir node.
+ *
+ * The type definiton of ir_node is also in irgraph.h to resolve
+ *  recursion between irnode.h and irgraph.h
+ *
+ * ir_node - a datatype representing a Firm node
  *
- *  @param The common fields are:
+ *  The common fields are:
  *
- *  @param firm_kind    A firm_kind tag containing k_type.  This is useful
- *               for dynamically checking whether a node is a ir_node.
- *  @param arity        The number of predecessors in the Firm graph.
- *  @param in           A list with the predecessors in the Firm graph.  There are
- *               routines to access individual elements and to obtain the
- *               array.  The method returning the array should not be used.
- *  @param mode         The mode of the node.  There are routines to get the mode but
- *               also to access the mode's fields directly.
- *  @param opcode       The opcode of the node.  There are routines to get the opcode but
- *               also to access the opcode's fields directly.
- *  @param node_nr      A unique number for the node.  Available only if debugging is
- *               turned on.
+ *  - firm_kind - A firm_kind tag containing k_type.  This is useful
+ *                for dynamically checking whether a node is a ir_node.
+ *  - arity     - The number of predecessors in the Firm graph.
+ *  - in        - A list with the predecessors in the Firm graph.  There are
+ *                routines to access individual elements and to obtain the
+ *                array.  The method returning the array should not be used.
+ *  - mode      - The mode of the node.  There are routines to get the mode
+ *                but also to access the mode's fields directly.
+ *  - opcode    - The opcode of the node. There are routines to get the opcode
+ *                but also to access the opcode's fields directly.
+ *  - node_nr   - A unique number for the node.  Available only if debugging
+ *                is turned on.
+ * @{
  */
+
 #ifndef _IR_NODE_TYPEDEF_
 #define _IR_NODE_TYPEDEF_
 typedef struct ir_node ir_node;
 #endif
 
 /**
-    you can work on the graph without considering the different types
-    of nodes, it's just a big graph. **/
+ *   you can work on the graph without considering the different types
+ *   of nodes, it's just a big graph.
+ */
+
+/**
+ *   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
+ */
+int
+is_ir_node (void *thing);
 
 /** returns the number of predecessors without the block predecessor: */
-int                  get_irn_arity         (ir_node *node);
+int                  get_irn_arity         (const ir_node *node);
 
 /** Replaces the old in array by a new one that will contain the ins given in
    the parameters.  Conserves the block predecessor.  It copies the array passed.
@@ -77,35 +113,38 @@ INLINE void          set_irn_in            (ir_node *node, int arity,
 /* get_irn_n removes Id predecessors. */
 INLINE ir_node      *get_irn_n             (ir_node *node, int n);
 INLINE void          set_irn_n             (ir_node *node, int n, ir_node *in);
-/* Get the mode struct. */
-INLINE ir_mode      *get_irn_mode          (ir_node *node);
-/* Get the mode-enum modecode */
-INLINE modecode      get_irn_modecode      (ir_node *node);
-/* Get the ident for a string representation of the mode */
-INLINE ident        *get_irn_modeident     (ir_node *node);
-/* Access the opcode struct of the node */
-INLINE ir_op        *get_irn_op            (ir_node *node);
+/** Sets the mode struct of node */
+INLINE void set_irn_mode (ir_node *node, ir_mode *mode);
+/** Gets the mode struct. */
+INLINE ir_mode      *get_irn_mode          (const ir_node *node);
+/** Gets the mode-enum modecode. */
+INLINE modecode      get_irn_modecode      (const ir_node *node);
+/** Gets the ident for a string representation of the mode .*/
+INLINE ident        *get_irn_modeident     (const ir_node *node);
+/** Gets the opcode struct of the node */
+INLINE ir_op        *get_irn_op            (const ir_node *node);
+/** Sets the opcode struct of the node. */
 INLINE void          set_irn_op            (ir_node *node, ir_op *op);
-/* Get the opcode-enum of the node */
-INLINE opcode        get_irn_opcode        (ir_node *node);
-/* Get the ident for a string representation of the opcode */
-INLINE ident        *get_irn_opident       (ir_node *node);
-/* Get the string representation of the opcode */
-INLINE const char   *get_irn_opname        (ir_node *node);
+/** Gets the opcode-enum of the node. */
+INLINE opcode        get_irn_opcode        (const ir_node *node);
+/** Get the string representation of the opcode. */
+INLINE const char   *get_irn_opname        (const ir_node *node);
+/** Get the ident for a string representation of the opcode. */
+INLINE ident        *get_irn_opident       (const ir_node *node);
+INLINE unsigned long get_irn_visited (const ir_node *node);
 INLINE void          set_irn_visited (ir_node *node, unsigned long visited);
-INLINE unsigned long get_irn_visited (ir_node *node);
-/* Sets visited to get_irg_visited(current_ir_graph) */
+/** Sets visited to get_irg_visited(current_ir_graph). */
 INLINE void          mark_irn_visited (ir_node *node);
-/* Returns 1 if visited < get_irg_visited(current_ir_graph).  */
-INLINE int           irn_not_visited  (ir_node *node);
-/* Returns 1 if visited >= get_irg_visited(current_ir_graph).  */
-INLINE int           irn_visited      (ir_node *node);
+/** Returns 1 if visited < get_irg_visited(current_ir_graph).  */
+INLINE int           irn_not_visited  (const ir_node *node);
+/** Returns 1 if visited >= get_irg_visited(current_ir_graph).  */
+INLINE int           irn_visited      (const ir_node *node);
 INLINE void          set_irn_link          (ir_node *node, void *link);
-INLINE void         *get_irn_link          (ir_node *node);
+INLINE void         *get_irn_link          (const ir_node *node);
 
 /** Outputs a unique number for this node if libfirm is compiled for
    debugging, (configure with --enable-debug) else returns 0. */
-INLINE long get_irn_node_nr(ir_node *node);
+INLINE long get_irn_node_nr(const ir_node *node);
 
 /** Returns the ir_graph this node belongs to. Only valid for
  * CallBegin, EndReg and EndExcept */
@@ -146,7 +185,9 @@ typedef enum {
   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_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;
 
 /* @@@ no more supported  */
@@ -185,8 +226,8 @@ INLINE void set_End_keepalive(ir_node *end, int pos, ir_node *ka);
    free_End frees these data structures. */
 INLINE void free_End (ir_node *end);
 
-ir_graph *get_EndReg_irg (ir_node *end);
-ir_graph *get_EndExcept_irg  (ir_node *end);
+ir_graph *get_EndReg_irg (const ir_node *end);
+ir_graph *get_EndExcept_irg  (const 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.
@@ -247,7 +288,7 @@ typedef enum {
                        by the linker. Type_or_id_p is ident *. */
 } symconst_kind;
 typedef union type_or_id * type_or_id_p;
-INLINE symconst_kind get_SymConst_kind (ir_node *node);
+INLINE symconst_kind get_SymConst_kind (const ir_node *node);
 INLINE void          set_SymConst_kind (ir_node *node, symconst_kind num);
 /* Only to access SymConst of kind type_tag or size.  Else assertion: */
 INLINE type    *get_SymConst_type (ir_node *node);
@@ -284,11 +325,17 @@ INLINE void     set_Call_mem (ir_node *node, ir_node *mem);
 INLINE ir_node *get_Call_ptr (ir_node *node);
 INLINE void     set_Call_ptr (ir_node *node, ir_node *ptr);
 INLINE ir_node **get_Call_param_arr (ir_node *node);
+/** Gets the number of parameters of a call. */
 INLINE int      get_Call_n_params (ir_node *node);
+/** Gets the call parameter at position pos. */
 INLINE ir_node *get_Call_param (ir_node *node, int pos);
+/** Sets the call parameter at position pos. */
 INLINE void     set_Call_param (ir_node *node, int pos, ir_node *param);
+/** Gets the type of a call. */
 INLINE type    *get_Call_type (ir_node *node);
+/** Sets the type of a call. */
 INLINE void     set_Call_type (ir_node *node, type *tp);
+/** Gets the arity of a call. Identical to get_Call_n_params(). */
 INLINE int      get_Call_arity (ir_node *node);
 
 /* Set, get and remove the callee-analysis. */
@@ -306,7 +353,7 @@ void set_CallBegin_call (ir_node *node, ir_node *call);
 /* 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
+   unops are: Minus, Abs, Not, Conv, Cast
    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
    Shr, Shrs, Rot, Cmp */
 INLINE int      is_unop (ir_node *node);
@@ -385,28 +432,8 @@ INLINE void     set_Eor_right (ir_node *node, ir_node *right);
 INLINE ir_node *get_Not_op (ir_node *node);
 INLINE void     set_Not_op (ir_node *node, ir_node *op);
 
-/** Projection numbers of compare: use for Proj nodes! */
-typedef enum {
-  False,               /**< false */
-  Eq,                  /**< equal */
-  Lt,                  /**< less */
-  Le,                  /**< less or equal */
-  Gt,                  /**< greater */
-  Ge,                  /**< greater or equal */
-  Lg,                  /**< less or greater */
-  Leg,                 /**< less, equal or greater = ordered */
-  Uo,                  /**< unordered */
-  Ue,                  /**< unordered or equal */
-  Ul,                  /**< unordered or less */
-  Ule,                 /**< unordered, less or equal */
-  Ug,                  /**< unordered or greater */
-  Uge,                 /**< unordered, greater or equal */
-  Ne,                  /**< unordered, less or greater = not equal */
-  True                 /**< true */
-  /* not_mask = Leg*/  /* bits to flip to negate comparison * @@ hack for jni interface */
-} pnc_number;
-#define not_mask Leg
-INLINE char *get_pnc_string(int pnc);
+INLINE const char *get_pnc_string(int pnc);
+
 INLINE int   get_negated_pnc(int pnc);
 INLINE ir_node *get_Cmp_left (ir_node *node);
 INLINE void     set_Cmp_left (ir_node *node, ir_node *left);
@@ -436,6 +463,11 @@ INLINE void     set_Rot_right (ir_node *node, ir_node *right);
 INLINE ir_node *get_Conv_op (ir_node *node);
 INLINE void     set_Conv_op (ir_node *node, ir_node *op);
 
+INLINE ir_node *get_Cast_op (ir_node *node);
+INLINE void     set_Cast_op (ir_node *node, ir_node *op);
+INLINE type    *get_Cast_type (ir_node *node);
+INLINE void     set_Cast_type (ir_node *node, type *to_tp);
+
 INLINE ir_node **get_Phi_preds_arr (ir_node *node);
 INLINE int       get_Phi_n_preds (ir_node *node);
 INLINE ir_node  *get_Phi_pred (ir_node *node, int pos);
@@ -532,7 +564,7 @@ INLINE int      is_no_Block (ir_node *node);
 INLINE int      is_Block (ir_node *node);
 /** returns true if node is a Proj node or a Filter node in
  * intraprocedural view */
-INLINE int      is_Proj (ir_node *node);
+INLINE 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);
@@ -549,51 +581,44 @@ int is_fragile_op(ir_node *node);
 /** Returns the memory operand of fragile operations. */
 ir_node *get_fragile_op_mem(ir_node *node);
 
-
 #include "ident.h"
 
-/*@{*/
-/** Makros for debugging the libfirm */
 #ifdef __GNUC__
-/*
- * GNU C has the __FUNCTION__ extension
- */
-#define DDMSG        printf("%s(l.%i)\n", __FUNCTION__, __LINE__)
-#define DDMSG1(X)    printf("%s(l.%i) %s\n", __FUNCTION__, __LINE__, id_to_str(get_irn_opident(X)))
-#define DDMSG2(X)    printf("%s(l.%i) %s%s: %ld\n", __FUNCTION__, __LINE__, id_to_str(get_irn_opident(X)), id_to_str(get_irn_modeident(X)), get_irn_node_nr(X))
-#define DDMSG3(X)    printf("%s(l.%i) %s: %p\n", __FUNCTION__, __LINE__, print_firm_kind(X), (X))
-#define DDMSG4(X)    xprintf("%s(l.%i) %I %I: %p\n", __FUNCTION__, __LINE__, get_type_tpop_nameid(X), get_type_ident(X), (X))
-#define DDMSG5(X)    printf("%s%s: %ld", id_to_str(get_irn_opident(X)), id_to_str(get_irn_modeident(X)), get_irn_node_nr(X))
-
-
-#define DDMN(X)      xprintf("%s(l.%i) %I%I: %ld (%p)\n", __FUNCTION__, __LINE__, get_irn_opident(X), get_irn_modeident(X), get_irn_node_nr(X), (X))
-#define DDMNB(X)     xprintf("%I%I: %ld (in block %ld)\n", get_irn_opident(X), get_irn_modeident(X), get_irn_node_nr(X), get_irn_node_nr(get_nodes_Block(X)))
-#define DDMT(X)      xprintf("%s(l.%i) %I %I: %p\n", __FUNCTION__, __LINE__, get_type_tpop_nameid(X), get_type_ident(X), (X))
-#define DDME(X)      xprintf("%s(l.%i) %I: %p\n", __FUNCTION__, __LINE__, get_entity_ident(X), (X))
-#define DDMEO(X)     xprintf("%s(l.%i) %I (own: %I): %p\n", __FUNCTION__, __LINE__, get_entity_ident(X), get_type_ident(get_entity_owner(X)), (X))
-#define DDMG(X)      xprintf("%s(l.%i) %I: %p\n", __FUNCTION__, __LINE__, get_irg_ent(get_entity_ident(X)), (X))
-
+/* GNU C has the __FUNCTION__ extension */
+#define __MYFUNC__ __FUNCTION__
 #else
-/*
- * use Filename instead
- */
-#define DDMSG        printf("%s(l.%i)\n", __FILE__, __LINE__)
-#define DDMSG1(X)    printf("%s(l.%i) %s\n", __FILE__, __LINE__, id_to_str(get_irn_opident(X)))
-#define DDMSG2(X)    printf("%s(l.%i) %s%s: %ld\n", __FILE__, __LINE__, id_to_str(get_irn_opident(X)), id_to_str(get_irn_modeident(X)), get_irn_node_nr(X))
-#define DDMSG3(X)    printf("%s(l.%i) %s: %p\n", __FILE__, __LINE__, print_firm_kind(X), (X))
-#define DDMSG4(X)    xprintf("%s(l.%i) %I %I: %p\n", __FILE__, __LINE__, get_type_tpop_nameid(X), get_type_ident(X), (X))
-#define DDMSG5(X)    printf("%s%s: %ld", id_to_str(get_irn_opident(X)), id_to_str(get_irn_modeident(X)), get_irn_node_nr(X))
-
-
-#define DDMN(X)      xprintf("%s(l.%i) %I%I: %ld (%p)\n", __FILE__, __LINE__, get_irn_opident(X), get_irn_modeident(X), get_irn_node_nr(X), (X))
-#define DDMNB(X)     xprintf("%I%I: %ld (in block %ld)\n", get_irn_opident(X), get_irn_modeident(X), get_irn_node_nr(X), get_irn_node_nr(get_nodes_Block(X)))
-#define DDMT(X)      xprintf("%s(l.%i) %I %I: %p\n", __FILE__, __LINE__, get_type_tpop_nameid(X), get_type_ident(X), (X))
-#define DDME(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, get_entity_ident(X), (X))
-#define DDMG(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, get_irg_ent(get_entity_ident(X)), (X))
-#define DDMI(X)      xprintf("%s(l.%i) %I: %p\n", __FILE__, __LINE__, (X), (X))
-
-#endif /* __GNUC__ */
-/*@}*/
+/* use Filename instead */
+#define __MYFUNC__ __FILE__
+#endif
+
+/* !!!!!!!!! @@@
+   Don't format with "\", firmjni gets problems */
+/** Output location */
+#define DDM      printf("%s(l.%i).\n",                       __MYFUNC__, __LINE__);
+/** Output the firm kind of the node */
+#define DDMK(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__,  print_firm_kind(X), (X));
+/** 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), (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)))
+/** 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), (X))
+/** Output information about an entity */
+#define DDME(X)  printf("%s(l.%i) %s: %ld (%p)\n",           __MYFUNC__, __LINE__, get_entity_name(X), get_entity_nr(X), (X))
+/** 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), (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), (X))
+/** Output information about an ident */
+#define DDMI(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, id_to_str(X), (X))
+/** Output information about a mode */
+#define DDMM(X)  printf("%s(l.%i) %s: %p\n",                 __MYFUNC__, __LINE__, get_mode_name(X), (X))
+/** Output information about a loop */
+#define DDML(X)  printf("%s(l.%i) loop with depth %d: %p\n", __MYFUNC__, __LINE__, get_loop_depth(X), (X))
+/** Output information about a tarVal */
+#define DDMV(X)  printf("%s(l.%i) tarval: ",__MYFUNC__, __LINE__); tarval_printf(X); printf(" (%p)\n", (X));
+
+/*@}*/ /* end of ir_node group definition */
 
 
 # endif /* _IRNODE_H_ */