normalized various syntactic constructs for firm jni.
[libfirm] / ir / ir / ircons.h
index 51448e5..66b43e8 100644 (file)
  *    ir_node *new_simpleSel (ir_node *store, ir_node *objptr, entity *ent);
  *    ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity,
  *                         ir_node **in, entity *ent);
+ *    ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent);
  *    ir_node *new_Call   (ir_node *store, ir_node *callee, int arity,
  *                    ir_node **in, type_method *type);
  *    ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode);
  *      attr.con   A tarval* pointer to the proper entry in the constant
  *                 table.
  *
- *    ir_node *new_SymConst (type *type, symconst_kind kind)
+ *    ir_node *new_SymConst (type *tp, symconst_kind kind)
  *    ------------------------------------------------------------
  *
  *    There are three kinds of symbolic constants:
  *      size      The symbolic constant represents the size of a class.
  *      link_info Information for the linker, e.g. the name of a global
  *                variable.
+ *    To represent a pointer to an entity that is represented by an entity
+ *    datastructure don't use
+ *      new_SymConst((type_or_id*)get_entity_ld_ident(ent), linkage_ptr_info);.
+ *    Use a real const instead:
+ *      new_Const(mode_p, tarval_p_from_entity(ent));
+ *    This makes the Constant independent of name changes of the entity due to
+ *    mangling.
  *
  *    Parameters
  *      kind        The kind of the symbolic constant: type_tag, size or link_info.
 # ifndef _IRCONS_H_
 # define _IRCONS_H_
 
-# include "common.h"
+# include "firm_common.h"
 # include "irgraph.h"
 # include "irnode.h"
 # include "irmode.h"
 # include "entity.h"
 # include "tv.h"
 # include "type.h"
+# include "dbginfo.h"
 
 /***************************************************************************/
 /* The raw interface                                                       */
 /* Constructs a Block with a fixed number of predecessors.
    Does not set current_block.  Can not be used with automatic
    Phi node construction. */
+ir_node *new_rd_Block  (dbg_info *db, ir_graph *irg,  int arity, ir_node **in);
+ir_node *new_rd_Start  (dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_End    (dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_Jmp    (dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_Cond   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *c);
+ir_node *new_rd_Return (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *store, int arity, ir_node **in);
+ir_node *new_rd_Raise  (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *store, ir_node *obj);
+ir_node *new_rd_Const  (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_mode *mode, tarval *con);
+ir_node *new_rd_SymConst (dbg_info *db, ir_graph *irg, ir_node *block,
+                       type_or_id_p value, symconst_kind symkind);
+ir_node *new_rd_Sel    (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+                       ir_node *objptr, int n_index, ir_node **index,
+                      entity *ent);
+ir_node *new_rd_Call   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+                      ir_node *callee, int arity, ir_node **in,
+                      type *tp);
+ir_node *new_rd_Add    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Sub    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Minus  (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op,  ir_mode *mode);
+ir_node *new_rd_Mul    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Quot   (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_rd_DivMod (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_rd_Div    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_rd_Mod    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_rd_Abs    (dbg_info *db, ir_graph *irg, ir_node *block,
+                       ir_node *op, ir_mode *mode);
+ir_node *new_rd_And    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Or     (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Eor    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_rd_Not    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_mode *mode);
+ir_node *new_rd_Cmp    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op1, ir_node *op2);
+ir_node *new_rd_Shl    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_rd_Shr    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_rd_Shrs   (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_rd_Rot    (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_node *k, ir_mode *mode);
+ir_node *new_rd_Conv   (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *op, ir_mode *mode);
+ir_node *new_rd_Phi    (dbg_info *db, ir_graph *irg, ir_node *block, int arity,
+                      ir_node **in, ir_mode *mode);
+ir_node *new_rd_Load   (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *store, ir_node *adr);
+ir_node *new_rd_Store  (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *store, ir_node *adr, ir_node *val);
+ir_node *new_rd_Alloc  (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+                      ir_node *size, type *alloc_type, where_alloc where);
+ir_node *new_rd_Free   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *store,
+                      ir_node *ptr, ir_node *size, type *free_type);
+ir_node *new_rd_Sync   (dbg_info *db, ir_graph *irg, ir_node *block, int arity, ir_node **in);
+ir_node *new_rd_Proj   (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
+                      ir_mode *mode, long proj);
+ir_node *new_rd_defaultProj (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
+                           long max_proj);
+ir_node *new_rd_Tuple  (dbg_info *db, ir_graph *irg, ir_node *block,
+                      int arity, ir_node **in);
+ir_node *new_rd_Id     (dbg_info *db, ir_graph *irg, ir_node *block,
+                      ir_node *val, ir_mode *mode);
+ir_node *new_rd_Bad    ();
+ir_node *new_rd_Unknown();
+ir_node *new_rd_CallBegin(dbg_info *db, ir_graph *irg, ir_node *block, ir_node *callee);
+ir_node *new_rd_EndReg (dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_EndExcept(dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_Break  (dbg_info *db, ir_graph *irg, ir_node *block);
+ir_node *new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg,
+                      ir_mode *mode, long proj);
+
+/***************************************************************************/
+/* The raw interface without debug support                                 */
+/***************************************************************************/
+
+/* Constructs a Block with a fixed number of predecessors.
+   Does not set current_block.  Can not be used with automatic
+   Phi node costruction. */
 ir_node *new_r_Block  (ir_graph *irg,  int arity, ir_node **in);
 ir_node *new_r_Start  (ir_graph *irg, ir_node *block);
 ir_node *new_r_End    (ir_graph *irg, ir_node *block);
@@ -1099,7 +1200,7 @@ ir_node *new_r_Sel    (ir_graph *irg, ir_node *block, ir_node *store,
                       entity *ent);
 ir_node *new_r_Call   (ir_graph *irg, ir_node *block, ir_node *store,
                       ir_node *callee, int arity, ir_node **in,
-                      type *type);
+                      type *tp);
 ir_node *new_r_Add    (ir_graph *irg, ir_node *block,
                       ir_node *op1, ir_node *op2, ir_mode *mode);
 ir_node *new_r_Sub    (ir_graph *irg, ir_node *block,
@@ -1158,7 +1259,13 @@ ir_node *new_r_Tuple  (ir_graph *irg, ir_node *block,
 ir_node *new_r_Id     (ir_graph *irg, ir_node *block,
                       ir_node *val, ir_mode *mode);
 ir_node *new_r_Bad    ();
-
+ir_node *new_r_Unknown();
+ir_node *new_r_CallBegin(ir_graph *irg, ir_node *block, ir_node *callee);
+ir_node *new_r_EndReg (ir_graph *irg, ir_node *block);
+ir_node *new_r_EndExcept(ir_graph *irg, ir_node *block);
+ir_node *new_r_Break  (ir_graph *irg, ir_node *block);
+ir_node *new_r_Filter (ir_graph *irg, ir_node *block, ir_node *arg,
+                      ir_mode *mode, long proj);
 
 /*************************************************************************/
 /* The block oriented interface                                          */
@@ -1168,13 +1275,81 @@ ir_node *new_r_Bad    ();
    nodes they construct. */
 void switch_block (ir_node *target);
 
+/* Constructs a Block with a fixed number of predecessors.
+   Does set current_block.  Can be used with automatic Phi
+   node construction. */
+
+
+ir_node *new_d_Block(dbg_info* db, int arity, ir_node **in);
+ir_node *new_d_Start  (dbg_info* db);
+ir_node *new_d_End    (dbg_info* db);
+ir_node *new_d_Jmp    (dbg_info* db);
+ir_node *new_d_Cond   (dbg_info* db, ir_node *c);
+ir_node *new_d_Return (dbg_info* db, ir_node *store, int arity, ir_node **in);
+ir_node *new_d_Raise  (dbg_info* db, ir_node *store, ir_node *obj);
+ir_node *new_d_Const  (dbg_info* db, ir_mode *mode, tarval *con);
+ir_node *new_d_SymConst (dbg_info* db, type_or_id_p value, symconst_kind kind);
+ir_node *new_d_simpleSel(dbg_info* db, ir_node *store, ir_node *objptr, entity *ent);
+ir_node *new_d_Sel    (dbg_info* db, ir_node *store, ir_node *objptr, int arity, ir_node **in,
+                     entity *ent);
+ir_node *new_d_Call   (dbg_info* db, ir_node *store, ir_node *callee, int arity, ir_node **in,
+                    type *tp);
+ir_node *new_d_Add    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Sub    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Minus  (dbg_info* db, ir_node *op,  ir_mode *mode);
+ir_node *new_d_Mul    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Quot   (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_d_DivMod (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_d_Div    (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_d_Mod    (dbg_info* db, ir_node *memop, ir_node *op1, ir_node *op2);
+ir_node *new_d_Abs    (dbg_info* db, ir_node *op,                ir_mode *mode);
+ir_node *new_d_And    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Or     (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Eor    (dbg_info* db, ir_node *op1, ir_node *op2, ir_mode *mode);
+ir_node *new_d_Not    (dbg_info* db, ir_node *op,                ir_mode *mode);
+ir_node *new_d_Shl    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
+ir_node *new_d_Shr    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
+ir_node *new_d_Shrs   (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
+ir_node *new_d_Rot    (dbg_info* db, ir_node *op,  ir_node *k,   ir_mode *mode);
+ir_node *new_d_Cmp    (dbg_info* db, ir_node *op1, ir_node *op2);
+ir_node *new_d_Conv   (dbg_info* db, ir_node *op, ir_mode *mode);
+ir_node *new_d_Phi    (dbg_info* db, int arity, ir_node **in, ir_mode *mode);
+ir_node *new_d_Load   (dbg_info* db, ir_node *store, ir_node *addr);
+ir_node *new_d_Store  (dbg_info* db, ir_node *store, ir_node *addr, ir_node *val);
+ir_node *new_d_Alloc  (dbg_info* db, ir_node *store, ir_node *size, type *alloc_type,
+                     where_alloc where);
+ir_node *new_d_Free   (dbg_info* db, ir_node *store, ir_node *ptr, ir_node *size,
+                    type *free_type);
+ir_node *new_d_Sync   (dbg_info* db, int arity, ir_node **in);
+ir_node *new_d_Proj   (dbg_info* db, ir_node *arg, ir_mode *mode, long proj);
+ir_node *new_d_defaultProj (dbg_info* db, ir_node *arg, long max_proj);
+ir_node *new_d_Tuple  (dbg_info* db, int arity, ir_node **in);
+ir_node *new_d_Id     (dbg_info* db, ir_node *val, ir_mode *mode);
+ir_node *new_d_Bad    (void);
+ir_node *new_d_Unknown(void);
+ir_node *new_d_CallBegin(dbg_info *db, ir_node *callee);
+ir_node *new_d_EndReg (dbg_info *db);
+ir_node *new_d_EndExcept(dbg_info *db);
+ir_node *new_d_Break (dbg_info *db);
+ir_node *new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj);
+
+/*************************************************************************/
+/* The block oriented interface without debug support                    */
+/*************************************************************************/
+
+/* Needed from the interfase with debug support:
+void switch_block (ir_node *target);   */
+
 /* Constructs a Block with a fixed number of predecessors.
    Does set current_block.  Can be used with automatic Phi
    node construction. */
 ir_node *new_Block(int arity, ir_node **in);
 ir_node *new_Start  (void);
 ir_node *new_End    (void);
+ir_node *new_EndReg (void);
+ir_node *new_EndExcept(void);
 ir_node *new_Jmp    (void);
+ir_node *new_Break  (void);
 ir_node *new_Cond   (ir_node *c);
 ir_node *new_Return (ir_node *store, int arity, ir_node **in);
 ir_node *new_Raise  (ir_node *store, ir_node *obj);
@@ -1183,8 +1358,10 @@ ir_node *new_SymConst (type_or_id_p value, symconst_kind kind);
 ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent);
 ir_node *new_Sel    (ir_node *store, ir_node *objptr, int arity, ir_node **in,
                      entity *ent);
+ir_node *new_InstOf (ir_node *store, ir_node *objptr, type *ent);
 ir_node *new_Call   (ir_node *store, ir_node *callee, int arity, ir_node **in,
-                    type *type);
+                    type *tp);
+ir_node *new_CallBegin(ir_node *callee);
 ir_node *new_Add    (ir_node *op1, ir_node *op2, ir_mode *mode);
 ir_node *new_Sub    (ir_node *op1, ir_node *op2, ir_mode *mode);
 ir_node *new_Minus  (ir_node *op,  ir_mode *mode);
@@ -1213,10 +1390,12 @@ ir_node *new_Free   (ir_node *store, ir_node *ptr, ir_node *size,
                     type *free_type);
 ir_node *new_Sync   (int arity, ir_node **in);
 ir_node *new_Proj   (ir_node *arg, ir_mode *mode, long proj);
+ir_node *new_Filter (ir_node *arg, ir_mode *mode, long proj);
 ir_node *new_defaultProj (ir_node *arg, long max_proj);
 ir_node *new_Tuple  (int arity, ir_node **in);
 ir_node *new_Id     (ir_node *val, ir_mode *mode);
 ir_node *new_Bad    (void);
+ir_node *new_Unknown(void);
 
 /***********************************************************************/
 /* The comfortable interface.                                          */
@@ -1227,6 +1406,7 @@ ir_node *new_Bad    (void);
 
 /** Block construction **/
 /* immature Block without predecessors */
+ir_node *new_d_immBlock (dbg_info* db);
 ir_node *new_immBlock (void);
 
 /* Add a control flow edge to an immature block. */
@@ -1239,6 +1419,7 @@ void mature_block (ir_node *block);
 /* Read a value from the array with the local variables.  Use this
    function to obtain the last definition of the value associated with
    pos.  Pos may not exceed the value passed as n_loc to new_ir_graph. */
+ir_node *get_d_value (dbg_info* db, int pos, ir_mode *mode);
 ir_node *get_value (int pos, ir_mode *mode);
 
 /* Write a value in the array with the local variables. Use this function
@@ -1255,7 +1436,7 @@ ir_node *get_store (void);
 void set_store (ir_node *store);
 
 /* keep this node alive even if End is not control-reachable from it */
-inline void keep_alive (ir_node *ka);
+void keep_alive (ir_node *ka);
 
 /** Useful access routines **/
 /* Returns the current block of the current graph.  To set the current
@@ -1267,9 +1448,11 @@ type *get_cur_frame_type();
 
 
 /***********************************************************************/
-/* initialize ir construction                                          */
+/* initialize and finalize ir construction                             */
 /***********************************************************************/
-void init_cons (void);
+
+/* Puts the graph into state "phase_high" */
+void finalize_cons (ir_graph *irg);
 
 
 # endif /* _IRCONS_H_ */