more
[libfirm] / ir / ir / irnode.h
index aa96f26..e7fcdf6 100644 (file)
@@ -9,38 +9,11 @@
  * Copyright:   (c) 1998-2003 Universität Karlsruhe
  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
  */
-
 # 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!
- */
-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;   /* pnc: Projection Number Cmp */
-#define not_mask Leg
-
-# include "tv.h"
 # include "irgraph.h"
 # include "entity.h"
 # include "firm_common.h"
@@ -48,7 +21,6 @@ typedef enum {
 # include "irmode.h"
 # include "type.h"
 # include "dbginfo.h"
-/* # include "exc.h" */
 
 /**
  * @file irnode.h
@@ -120,8 +92,8 @@ int           get_irn_inter_arity   (const ir_node *node);
    Assumes that current_ir_graph is set to the graph containing "node".
    "in" must contain all predecessors except the block that are required for
    the nodes opcode. */
-void          set_irn_in            (ir_node *node, int arity,
-                        ir_node *in[]);
+void          set_irn_in            (ir_node *node, int arity, ir_node *in[]);
+
 /* to iterate through the predecessors without touching the array. No
    order of predecessors guaranteed.
    To iterate over the operands iterate from 0 to i < get_irn_arity(),
@@ -274,6 +246,9 @@ 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);
 void      set_Block_matured (ir_node *node, bool matured);
+
+/** A visited flag only for block nodes.
+ *  @see also: get_irn_visited() inc_irg_visited() inc_irg_block_visited()*/
 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);
@@ -378,9 +353,25 @@ typedef enum {
   pn_Raise_max   /**< number of projections from a Raise */
 } pn_Raise;  /* Projection numbers for Raise. */
 
+typedef enum {
+  CNST_NULL     =  0, /**< The node is a const(0). */
+  CNST_ONE      = +1, /**< The node is a const(1). */
+  CNST_ALL_ONE  = -1, /**< The node is a const(11111...). */
+  CNST_OTHER    =  2, /**< The tarvel of the const has another value. */
+  CNST_SYMCONST =  3, /**< The node is symconst. */
+  CNST_NO_CONST =  4  /**< The node is no const at all. */
+} cnst_classify_t;
+
 tarval  *get_Const_tarval (ir_node *node);
 void     set_Const_tarval (ir_node *node, tarval *con);
 
+/**
+ * Classify a node concerning constant properties.
+ * @param irn A node to check for.
+ * @return Constant properties of that node.
+ */
+cnst_classify_t classify_Const(ir_node *irn);
+
 /** Returns the source language type of a Const node.
  * Must be an atomic type.  Mode of type must be mode of node.
  */
@@ -713,6 +704,21 @@ 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);
 
+/** Checks for upcast.
+ *
+ * Returns true if the Cast node casts a class type to a super type.
+ * Works also for pointers to classes (recursively).
+ */
+int is_Cast_upcast(ir_node *node);
+
+/** Checks for downcast.
+ *
+ * Returns true if the Cast node casts a class type to a sub type.
+ * Works also for pointers to classes (recursively).
+ */
+int is_Cast_downcast(ir_node *node);
+
+
 /** 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. */
@@ -820,13 +826,23 @@ void     set_Free_size (ir_node *node, ir_node *size);
 type    *get_Free_type (ir_node *node);
 void     set_Free_type (ir_node *node, type *tp);
 
+where_alloc  get_Free_where (ir_node *node);
+void         set_Free_where (ir_node *node, where_alloc where);
+
 ir_node **get_Sync_preds_arr (ir_node *node);
 int       get_Sync_n_preds (ir_node *node);
 ir_node  *get_Sync_pred (ir_node *node, int pos);
 void      set_Sync_pred (ir_node *node, int pos, ir_node *pred);
 
+/** Returns the source language type of a Proj node.
+ * Must be an atomic type.  Mode of type must be mode of node.
+ */
+type     *get_Proj_type (ir_node *node);
+
+/** Return the predecessor of a Proj node. */
 ir_node  *get_Proj_pred (ir_node *node);
 void      set_Proj_pred (ir_node *node, ir_node *pred);
+/** Return the projection number of a Proj node. */
 long      get_Proj_proj (ir_node *node);
 void      set_Proj_proj (ir_node *node, long proj);
 
@@ -893,7 +909,7 @@ int is_cfop(const 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. */
+    Bad. Raise is not fragile, but a unconditional jump. */
 int is_fragile_op(const ir_node *node);
 /** Returns the memory operand of fragile operations. */
 ir_node *get_fragile_op_mem(ir_node *node);
@@ -902,6 +918,11 @@ ir_node *get_fragile_op_mem(ir_node *node);
  *  operation: Cond. */
 int is_forking_op(const ir_node *node);
 
+/** Return the type associated with the value produced by n
+ *  if the node remarks this type as it is the case for
+ *  Cast, Const, SymConst and some Proj nodes. */
+type *get_irn_type(ir_node *n);
+
 /**
  * Access custom node data.
  * The data must have been registered with