make lots of irn functions accept const ir_node
[libfirm] / ir / ir / irnode.h
index 5309e3c..06f52ef 100644 (file)
@@ -1,16 +1,30 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ir/irnode.h
- * Purpose:     Representation of an intermediate operation.
- * Author:      Martin Trapp, Christian Schaefer
- * Modified by: Goetz Lindenmaier, Michael Beck
- * Created:
- * CVS-ID:      $Id$
- * Copyright:   (c) 1998-2006 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief   Representation of an intermediate operation.
+ * @author  Martin Trapp, Christian Schaefer, Goetz Lindenmaier, Michael Beck
+ * @version $Id$
  */
-#ifndef _FIRM_IR_IRNODE_H_
-#define _FIRM_IR_IRNODE_H_
+#ifndef FIRM_IR_IRNODE_H
+#define FIRM_IR_IRNODE_H
 
 #include <stddef.h>
 
@@ -159,6 +173,12 @@ 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);
+/**
+ * Appends a new predecessor to a node. This only works for nodes with
+ * variable arity!
+ * @returns   the number of the new input
+ */
+int add_irn_n(ir_node *node, ir_node *in);
 /* Sets the mode struct of node.  */
 void set_irn_mode(ir_node *node, ir_mode *mode);
 /** Gets the mode struct of a node.  */
@@ -174,7 +194,7 @@ 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);
 /** Gets the opcode-enum of the node. */
-opcode get_irn_opcode(const ir_node *node);
+ir_opcode get_irn_opcode(const ir_node *node);
 /** Get the string representation of the opcode. */
 const char *get_irn_opname(const ir_node *node);
 /** Get the ident for a string representation of the opcode. */
@@ -339,7 +359,7 @@ void      set_Block_matured(ir_node *node, int 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);
+unsigned long get_Block_block_visited(const ir_node *node);
 void      set_Block_block_visited(ir_node *node, unsigned long visit);
 
 /**
@@ -351,7 +371,8 @@ 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);
+int       Block_not_block_visited(const ir_node *node);
+int       Block_block_visited(const ir_node *node);
 
 /* Set and remove interprocedural predecessors. If the interprocedural
  * predecessors are removed, the node has the same predecessors in
@@ -533,21 +554,21 @@ ir_type  *get_SymConst_type(ir_node *node);
 void     set_SymConst_type(ir_node *node, ir_type *tp);
 
 /** Only to access SymConst of kind addr_name.  Else assertion: */
-ident   *get_SymConst_name(ir_node *node);
+ident   *get_SymConst_name(const ir_node *node);
 void     set_SymConst_name(ir_node *node, ident *name);
 
 /** Only to access SymConst of kind addr_ent.  Else assertion: */
-ir_entity *get_SymConst_entity(ir_node *node);
+ir_entity *get_SymConst_entity(const ir_node *node);
 void       set_SymConst_entity(ir_node *node, ir_entity *ent);
 
 /** Only to access SymConst of kind symconst_enum_const.  Else assertion: */
-ir_enum_const *get_SymConst_enum(ir_node *node);
+ir_enum_const *get_SymConst_enum(const ir_node *node);
 void           set_SymConst_enum(ir_node *node, ir_enum_const *ec);
 
 /** 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);
+union symconst_symbol get_SymConst_symbol(const ir_node *node);
 void                  set_SymConst_symbol(ir_node *node,
                                           union symconst_symbol sym);
 
@@ -640,35 +661,35 @@ void      set_CallBegin_call(ir_node *node, ir_node *call);
    binops are: Add, Sub, Mul, Quot, DivMod, Div, Mod, And, Or, Eor, Shl,
    Shr, Shrs, Rot, Cmp */
 int      is_unop(const ir_node *node);
-ir_node *get_unop_op(ir_node *node);
+ir_node *get_unop_op(const ir_node *node);
 void     set_unop_op(ir_node *node, ir_node *op);
 int      is_binop(const ir_node *node);
-ir_node *get_binop_left(ir_node *node);
+ir_node *get_binop_left(const ir_node *node);
 void     set_binop_left(ir_node *node, ir_node *left);
-ir_node *get_binop_right(ir_node *node);
+ir_node *get_binop_right(const ir_node *node);
 void     set_binop_right(ir_node *node, ir_node *right);
 
-ir_node *get_Add_left(ir_node *node);
+ir_node *get_Add_left(const ir_node *node);
 void     set_Add_left(ir_node *node, ir_node *left);
-ir_node *get_Add_right(ir_node *node);
+ir_node *get_Add_right(const ir_node *node);
 void     set_Add_right(ir_node *node, ir_node *right);
 
-ir_node *get_Sub_left(ir_node *node);
+ir_node *get_Sub_left(const ir_node *node);
 void     set_Sub_left(ir_node *node, ir_node *left);
-ir_node *get_Sub_right(ir_node *node);
+ir_node *get_Sub_right(const ir_node *node);
 void     set_Sub_right(ir_node *node, ir_node *right);
 
-ir_node *get_Minus_op(ir_node *node);
+ir_node *get_Minus_op(const ir_node *node);
 void     set_Minus_op(ir_node *node, ir_node *op);
 
-ir_node *get_Mul_left(ir_node *node);
+ir_node *get_Mul_left(const ir_node *node);
 void     set_Mul_left(ir_node *node, ir_node *left);
-ir_node *get_Mul_right(ir_node *node);
+ir_node *get_Mul_right(const ir_node *node);
 void     set_Mul_right(ir_node *node, ir_node *right);
 
-ir_node *get_Quot_left(ir_node *node);
+ir_node *get_Quot_left(const ir_node *node);
 void     set_Quot_left(ir_node *node, ir_node *left);
-ir_node *get_Quot_right(ir_node *node);
+ir_node *get_Quot_right(const ir_node *node);
 void     set_Quot_right(ir_node *node, ir_node *right);
 ir_node *get_Quot_mem(ir_node *node);
 void     set_Quot_mem(ir_node *node, ir_node *mem);
@@ -683,9 +704,9 @@ typedef enum {
   pn_Quot_max          /**< number of projections from a Quot */
 } pn_Quot;  /* Projection numbers for Quot. */
 
-ir_node *get_DivMod_left(ir_node *node);
+ir_node *get_DivMod_left(const ir_node *node);
 void     set_DivMod_left(ir_node *node, ir_node *left);
-ir_node *get_DivMod_right(ir_node *node);
+ir_node *get_DivMod_right(const ir_node *node);
 void     set_DivMod_right(ir_node *node, ir_node *right);
 ir_node *get_DivMod_mem(ir_node *node);
 void     set_DivMod_mem(ir_node *node, ir_node *mem);
@@ -701,9 +722,9 @@ typedef enum {
   pn_DivMod_max          /**< number of projections from a DivMod */
 } pn_DivMod;  /* Projection numbers for DivMod. */
 
-ir_node *get_Div_left(ir_node *node);
+ir_node *get_Div_left(const ir_node *node);
 void     set_Div_left(ir_node *node, ir_node *left);
-ir_node *get_Div_right(ir_node *node);
+ir_node *get_Div_right(const ir_node *node);
 void     set_Div_right(ir_node *node, ir_node *right);
 ir_node *get_Div_mem(ir_node *node);
 void     set_Div_mem(ir_node *node, ir_node *mem);
@@ -718,9 +739,9 @@ typedef enum {
   pn_Div_max          /**< number of projections from a Div */
 } pn_Div;  /* Projection numbers for Div. */
 
-ir_node *get_Mod_left(ir_node *node);
+ir_node *get_Mod_left(const ir_node *node);
 void     set_Mod_left(ir_node *node, ir_node *left);
-ir_node *get_Mod_right(ir_node *node);
+ir_node *get_Mod_right(const ir_node *node);
 void     set_Mod_right(ir_node *node, ir_node *right);
 ir_node *get_Mod_mem(ir_node *node);
 void     set_Mod_mem(ir_node *node, ir_node *mem);
@@ -735,25 +756,25 @@ typedef enum {
   pn_Mod_max          /**< number of projections from a Mod */
 } pn_Mod;  /* Projection numbers for Mod. */
 
-ir_node *get_Abs_op(ir_node *node);
+ir_node *get_Abs_op(const ir_node *node);
 void     set_Abs_op(ir_node *node, ir_node *op);
 
-ir_node *get_And_left(ir_node *node);
+ir_node *get_And_left(const ir_node *node);
 void     set_And_left(ir_node *node, ir_node *left);
-ir_node *get_And_right(ir_node *node);
+ir_node *get_And_right(const ir_node *node);
 void     set_And_right(ir_node *node, ir_node *right);
 
-ir_node *get_Or_left(ir_node *node);
+ir_node *get_Or_left(const ir_node *node);
 void     set_Or_left(ir_node *node, ir_node *left);
-ir_node *get_Or_right(ir_node *node);
+ir_node *get_Or_right(const ir_node *node);
 void     set_Or_right(ir_node *node, ir_node *right);
 
-ir_node *get_Eor_left(ir_node *node);
+ir_node *get_Eor_left(const ir_node *node);
 void     set_Eor_left(ir_node *node, ir_node *left);
-ir_node *get_Eor_right(ir_node *node);
+ir_node *get_Eor_right(const ir_node *node);
 void     set_Eor_right(ir_node *node, ir_node *right);
 
-ir_node *get_Not_op(ir_node *node);
+ir_node *get_Not_op(const ir_node *node);
 void     set_Not_op(ir_node *node, ir_node *op);
 
 /**
@@ -793,32 +814,32 @@ int         get_negated_pnc(int pnc, ir_mode *mode);
 /** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */
 int         get_inversed_pnc(int pnc);
 
-ir_node *get_Cmp_left(ir_node *node);
+ir_node *get_Cmp_left(const ir_node *node);
 void     set_Cmp_left(ir_node *node, ir_node *left);
-ir_node *get_Cmp_right(ir_node *node);
+ir_node *get_Cmp_right(const ir_node *node);
 void     set_Cmp_right(ir_node *node, ir_node *right);
 
-ir_node *get_Shl_left(ir_node *node);
+ir_node *get_Shl_left(const ir_node *node);
 void     set_Shl_left(ir_node *node, ir_node *left);
-ir_node *get_Shl_right(ir_node *node);
+ir_node *get_Shl_right(const ir_node *node);
 void     set_Shl_right(ir_node *node, ir_node *right);
 
-ir_node *get_Shr_left(ir_node *node);
+ir_node *get_Shr_left(const ir_node *node);
 void     set_Shr_left(ir_node *node, ir_node *left);
-ir_node *get_Shr_right(ir_node *node);
+ir_node *get_Shr_right(const ir_node *node);
 void     set_Shr_right(ir_node *node, ir_node *right);
 
-ir_node *get_Shrs_left(ir_node *node);
+ir_node *get_Shrs_left(const ir_node *node);
 void     set_Shrs_left(ir_node *node, ir_node *left);
-ir_node *get_Shrs_right(ir_node *node);
+ir_node *get_Shrs_right(const ir_node *node);
 void     set_Shrs_right(ir_node *node, ir_node *right);
 
-ir_node *get_Rot_left(ir_node *node);
+ir_node *get_Rot_left(const ir_node *node);
 void     set_Rot_left(ir_node *node, ir_node *left);
-ir_node *get_Rot_right(ir_node *node);
+ir_node *get_Rot_right(const ir_node *node);
 void     set_Rot_right(ir_node *node, ir_node *right);
 
-ir_node *get_Conv_op(ir_node *node);
+ir_node *get_Conv_op(const ir_node *node);
 void     set_Conv_op(ir_node *node, ir_node *op);
 int      get_Conv_strict(ir_node *node);
 void     set_Conv_strict(ir_node *node, int flag);
@@ -829,7 +850,7 @@ void     set_Conv_strict(ir_node *node, int flag);
  * are accessed in the cast.  This required some precaution, to
  * get the right memory into the Loads generated from the cast.
  */
-ir_node *get_Cast_op(ir_node *node);
+ir_node *get_Cast_op(const ir_node *node);
 void     set_Cast_op(ir_node *node, ir_node *op);
 ir_type *get_Cast_type(ir_node *node);
 void     set_Cast_type(ir_node *node, ir_type *to_tp);
@@ -838,6 +859,8 @@ void     set_Cast_type(ir_node *node, ir_type *to_tp);
  *
  * Returns true if the Cast node casts a class type to a super type.
  * Works also for pointers to classes (recursively).
+ *
+ * Needs typeinfo calculated.
  */
 int is_Cast_upcast(ir_node *node);
 
@@ -845,6 +868,8 @@ int is_Cast_upcast(ir_node *node);
  *
  * Returns true if the Cast node casts a class type to a sub type.
  * Works also for pointers to classes (recursively).
+ *
+ * Needs typeinfo calculated.
  */
 int is_Cast_downcast(ir_node *node);
 
@@ -976,6 +1001,9 @@ void      set_Proj_pred(ir_node *node, ir_node *pred);
 /** Return the projection number of a Proj node. */
 long      get_Proj_proj(const ir_node *node);
 void      set_Proj_proj(ir_node *node, long proj);
+long     get_VProj_proj(const ir_node *node);
+void     set_VProj_proj(ir_node *node, long value);
+
 
 ir_node **get_Tuple_preds_arr(ir_node *node);
 int       get_Tuple_n_preds(ir_node *node);
@@ -1097,7 +1125,7 @@ ir_node *get_Bound_upper(ir_node *bound);
 void     set_Bound_upper(ir_node *bound, ir_node *upper);
 
 /** Return the operand of a Pin node. */
-ir_node *get_Pin_op(ir_node *pin);
+ir_node *get_Pin_op(const ir_node *pin);
 void    set_Pin_op(ir_node *pin, ir_node *node);
 
 
@@ -1111,6 +1139,8 @@ void    set_Pin_op(ir_node *pin, ir_node *node);
 
 /** returns operand of node if node is a Proj. */
 ir_node *skip_Proj(ir_node *node);
+/** returns operand of node if node is a Proj. */
+const ir_node *skip_Proj_const(const ir_node *node);
 /** returns operand of node if node is a Id */
 ir_node *skip_Id(ir_node *node);   /* Old name is skip_nop(). */
 /** returns corresponding operand of Tuple if node is a Proj from
@@ -1124,6 +1154,8 @@ ir_node *skip_Confirm(ir_node *node);
 ir_node *skip_HighLevel(ir_node *node);
 /** returns true if irn is a Const node. */
 int      is_Const(const ir_node *node);
+/** returns true if a node is a Conv node */
+int      is_Conv(const ir_node *node);
 /** returns true if node is a Bad node. */
 int      is_Bad(const ir_node *node);
 /** returns true if node is a NoMem node. */
@@ -1136,6 +1168,12 @@ int      is_Mod(const ir_node *node);
 int      is_Div(const ir_node *node);
 /** return true if node is a DivMod node. */
 int      is_DivMod(const ir_node *node);
+/** return true if node is a Quot node. */
+int      is_Quot(const ir_node *node);
+/** return true if node is an Add node. */
+int      is_Add(const ir_node *node);
+/** return true if node is a Sub node. */
+int      is_Sub(const ir_node *node);
 /** returns true if the node is not a Block */
 int      is_no_Block(const ir_node *node);
 /** returns true if the node is a Block */
@@ -1148,10 +1186,14 @@ int      is_Return(const ir_node *node);
 int      is_Call(const ir_node *node);
 /** returns true if node is a Sel node. */
 int      is_Sel(const ir_node *node);
+/** returns true if node is a Mul node. */
+int      is_Mul(const ir_node *node);
 /** returns true if node is a Mux node or a Psi with only one condition. */
 int      is_Mux(const ir_node *node);
 /** returns true if node is a Load node. */
 int      is_Load(const ir_node *node);
+/** returns true if node is a Store node. */
+int      is_Store(const ir_node *node);
 /** returns true if node is a Sync node. */
 int      is_Sync(const ir_node *node);
 /** returns true if node is a Confirm node. */
@@ -1162,6 +1204,8 @@ int      is_Pin(const ir_node *node);
 int      is_SymConst(const ir_node *node);
 /** returns true if node is a Cond node. */
 int      is_Cond(const ir_node *node);
+/** returns true of node is a CopyB node */
+int      is_CopyB(const ir_node *node);
 /** returns true if node is a Cmp node. */
 int      is_Cmp(const ir_node *node);
 /** returns true if node is an Alloc node */
@@ -1290,7 +1334,7 @@ unsigned register_additional_node_data(unsigned size);
  * Return a pointer to the node attributes.
  * Needed for user-defined nodes.
  */
-void *get_irn_generic_attr(ir_node *node);
+void *get_irn_generic_attr(const ir_node *node);
 
 /**
  * Returns the unique node index for the node in its graph.
@@ -1360,4 +1404,4 @@ int dump_node_opcode(FILE *F, ir_node *n);
 }
 #endif
 
-#endif /* _FIRM_IR_IRNODE_H_ */
+#endif