X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Fircons.h;h=66b43e8a0b34b2ee6b5191f311d06cf83fee3dde;hb=677f67f9b487e35b983148f48b933d54ee383db6;hp=81c239a768261cb97e1d650ae883387517b54398;hpb=b4eb108c1ed94e9945ef56e7c89ac866594f7cb0;p=libfirm diff --git a/ir/ir/ircons.h b/ir/ir/ircons.h index 81c239a76..66b43e8a0 100644 --- a/ir/ir/ircons.h +++ b/ir/ir/ircons.h @@ -326,6 +326,7 @@ * 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); @@ -362,7 +363,7 @@ * void set_value (int pos, ir_node *value); * ir_node *get_store (void); * void set_store (ir_node *store); - * + * keep_alive (ir_node ka) * * IR_NODES AND CONSTRUCTORS FOR IR_NODES * ======================================= @@ -582,7 +583,7 @@ * 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: @@ -590,6 +591,13 @@ * 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. @@ -1050,6 +1058,15 @@ * * Returns the node defining the actual store. * Requires current_block to be set correctly. + * + * + * inline void keep_alive (ir_node *ka) + * ------------------------------------ + * + * Keep this node alive because it is (might be) not in the control + * flow from Start to End. Adds the node to the list in the end + * node. + * ***** */ @@ -1057,13 +1074,14 @@ # 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 */ @@ -1072,6 +1090,98 @@ /* 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); @@ -1090,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, @@ -1149,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 */ @@ -1159,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); @@ -1174,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); @@ -1204,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. */ @@ -1218,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. */ @@ -1230,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 @@ -1245,6 +1435,9 @@ ir_node *get_store (void); /* Write a store. */ void set_store (ir_node *store); +/* keep this node alive even if End is not control-reachable from it */ +void keep_alive (ir_node *ka); + /** Useful access routines **/ /* Returns the current block of the current graph. To set the current block use switch_block(). */ @@ -1255,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_ */