X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.h;h=5d51cec6b9c6572ffd7ae09520008624b4cfd492;hb=16d8de24b7945a58705aa754530955768ca35486;hp=c615ad4ae062854eeb6e8160885e5ab6196f4a0b;hpb=3ce6d7f83a9ad4478370bc4a773226246915d792;p=libfirm diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index c615ad4ae..5d51cec6b 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -86,6 +86,11 @@ typedef enum { typedef struct ir_node ir_node; #endif +#ifdef __cplusplus + extern "C" { + +#endif + /** * you can work on the graph without considering the different types * of nodes, it's just a big graph. @@ -94,16 +99,17 @@ typedef struct ir_node ir_node; /** * 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 + * @param thing an arbitrary pointer + * @return non-zero if the thing is a ir mode, else zero */ -int -is_ir_node (const void *thing); +int is_ir_node (const void *thing); -/** returns the number of predecessors without the block predecessor: */ -int get_irn_arity (const ir_node *node); +/** + * Returns the number of predecessors without the block predecessor. + * + * @param node the IR-node + */ +int get_irn_arity (const ir_node *node); int get_irn_intra_arity (const ir_node *node); int get_irn_inter_arity (const ir_node *node); @@ -121,14 +127,20 @@ void set_irn_in (ir_node *node, int arity, to iterate including the Block predecessor iterate from i = -1 to i < get_irn_arity. */ /* Access predecessor n */ -/* get_irn_n removes Id predecessors. */ + +/** + * Get the n-th predecessor of a node. + * This function removes Id predecessors. + */ ir_node *get_irn_n (ir_node *node, int n); ir_node *get_irn_intra_n (ir_node *node, int n); ir_node *get_irn_inter_n (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); -/** Sets the mode struct of node */ +/* Sets the mode struct of node. */ void set_irn_mode (ir_node *node, ir_mode *mode); -/** Gets the mode struct. */ +/** Gets the mode struct of a node. */ ir_mode *get_irn_mode (const ir_node *node); /** Gets the mode-enum modecode. */ modecode get_irn_modecode (const ir_node *node); @@ -136,7 +148,7 @@ modecode get_irn_modecode (const ir_node *node); ident *get_irn_modeident (const ir_node *node); /** Gets the string representation of the mode .*/ const char *get_irn_modename (const ir_node *node); -/** Gets the opcode struct of the node */ +/** Gets the opcode struct of the node. */ 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); @@ -146,19 +158,28 @@ opcode get_irn_opcode (const ir_node *node); const char *get_irn_opname (const ir_node *node); /** Get the ident for a string representation of the opcode. */ ident *get_irn_opident (const ir_node *node); +/** Gets the visited counter of a node. */ unsigned long get_irn_visited (const ir_node *node); +/** Sets the visited counter of a node. */ void set_irn_visited (ir_node *node, unsigned long visited); /** Sets visited to get_irg_visited(current_ir_graph). */ void mark_irn_visited (ir_node *node); -/** Returns 1 if visited < get_irg_visited(current_ir_graph). */ +/** Returns 1 if visited < get_irg_visited(current_ir_graph). */ int irn_not_visited (const ir_node *node); -/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */ +/** Returns 1 if visited >= get_irg_visited(current_ir_graph). */ int irn_visited (const ir_node *node); + +/** + * Sets the link of a node. + * Only allowed if the graph is NOT in phase_building. + */ void set_irn_link (ir_node *node, void *link); + +/** Returns the link of a node. */ void *get_irn_link (const ir_node *node); /** Returns the ir_graph this node belongs to. Only valid if irg - * is in state pinned (irg is only stored in the block. */ + * is in state op_pin_state_pinned (irg is only stored in the block. */ ir_graph *get_irn_irg (ir_node *node); /** Outputs a unique number for this node if libFIRM is compiled for @@ -197,13 +218,18 @@ new_ir_node (dbg_info *db, * */ -/* This works for all except Block. To express the difference to - * access routines that work for all nodes we use infix "nodes". */ +/** This works for all except Block. To express the difference to + * access routines that work for all nodes we use infix "nodes" and do not + * name this function get_irn_block. */ #define get_nodes_block get_nodes_Block -ir_node *get_nodes_Block (ir_node *node); +ir_node *get_nodes_block (ir_node *node); #define set_nodes_block set_nodes_Block -void set_nodes_Block (ir_node *node, ir_node *block); +void set_nodes_block (ir_node *node, ir_node *block); +/** + * @function get_irn_block + * @see get_nodes_block() + */ /** * Projection numbers for result of Start node: use for Proj nodes! */ @@ -218,21 +244,6 @@ typedef enum { type of this method. */ } pn_Start; /* Projection numbers for Start. */ -/** - * Projection numbers for result of Start node: use for Proj nodes! - * @remark This is the old name convention, don't use anymore. - */ -typedef enum { - pns_initial_exec, /**< Projection on an executable, the initial control - flow. */ - pns_global_store, /**< Projection on the global store */ - 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_value_arg_base /**< Pointer to region of compound value arguments as defined by - type of this method. */ -} pns_number; /* pns: Projection Number Start */ /** Test whether arbitrary node is frame pointer. * @@ -255,7 +266,7 @@ int is_value_arg_pointer(ir_node *n); /* @@@ no more supported */ ir_node **get_Block_cfgpred_arr (ir_node *node); -int get_Block_n_cfgpreds (ir_node *node); +int get_Block_n_cfgpreds (ir_node *node); 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); @@ -280,10 +291,8 @@ ir_node *get_Block_cg_cfgpred(ir_node * node, int pos); /* frees the memory. */ void remove_Block_cg_cfgpred_arr(ir_node * node); -/* Start references the irg it is in. - @@@ old -- use get_irn_irg instead! */ -ir_graph *get_Start_irg(ir_node *node); - +/** Keep alive dedicated nodes. These must be either + * PhiM or Block nodes. */ int get_End_n_keepalives(ir_node *end); ir_node *get_End_keepalive(ir_node *end, int pos); void add_End_keepalive (ir_node *end, ir_node *ka); @@ -293,9 +302,6 @@ void set_End_keepalive(ir_node *end, int pos, ir_node *ka); free_End frees these data structures. */ void free_End (ir_node *end); -/* @@@ old -- use get_irn_irg instead! */ -ir_graph *get_EndReg_irg (ir_node *end); -ir_graph *get_EndExcept_irg (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. @@ -327,6 +333,7 @@ ir_node *get_Cond_selector (ir_node *node); void set_Cond_selector (ir_node *node, ir_node *selector); cond_kind get_Cond_kind (ir_node *node); void set_Cond_kind (ir_node *node, cond_kind kind); +long get_Cond_defaultProj (ir_node *node); /** * Projection numbers for conditions. @@ -368,28 +375,54 @@ void set_Const_type (ir_node *node, type *tp); represented by SymConst. The content of the attribute type_or_id depends on this tag. Use the proper access routine after testing this flag. */ + typedef enum { - type_tag, /**< The SymConst is a type tag for the given type. - Type_or_id_p is type *. */ - size, /**< The SymConst is the size of the given type. - Type_or_id_p is type *. */ - linkage_ptr_info /**< The SymConst is a symbolic pointer to be filled in - by the linker. Type_or_id_p is ident *. */ + symconst_type_tag, /**< The SymConst is a type tag for the given type. + Type_or_id_p is type *. */ + symconst_size, /**< The SymConst is the size of the given type. + Type_or_id_p is type *. */ + symconst_addr_name, /**< The SymConst is a symbolic pointer to be filled in + by the linker. The pointer is represented by a string. + Type_or_id_p is ident *. */ + symconst_addr_ent /**< The SymConst is a symbolic pointer to be filled in + by the linker. The pointer is represented by an entity. + Type_or_id_p is entity *. */ } symconst_kind; -typedef union type_or_id * type_or_id_p; +/** SymConst attributes + This union contains the symbolic information represented by the node */ +union symconst_symbol { + type *type_p; + ident *ident_p; + entity *entity_p; +}; + + +typedef union symconst_symbol symconst_symbol; + + +/** Access the kind of the SymConst. */ symconst_kind get_SymConst_kind (const ir_node *node); void set_SymConst_kind (ir_node *node, symconst_kind num); -/* Only to access SymConst of kind type_tag or size. Else assertion: */ + +/** Only to access SymConst of kind type_tag or size. Else assertion: */ type *get_SymConst_type (ir_node *node); void set_SymConst_type (ir_node *node, type *tp); -/* Only to access SymConst of kind linkage_ptr_info. Else assertion: */ -ident *get_SymConst_ptrinfo (ir_node *node); -void set_SymConst_ptrinfo (ir_node *node, ident *ptrinfo); -/* Sets both: type and ptrinfo. Needed to treat the node independent of - its semantics. Does a memcpy for the memory tori points to. */ -type_or_id_p get_SymConst_type_or_id (ir_node *node); -void set_SymConst_type_or_id (ir_node *node, type_or_id_p tori); + +/** Only to access SymConst of kind addr_name. Else assertion: */ +ident *get_SymConst_name (ir_node *node); +void set_SymConst_name (ir_node *node, ident *name); + +/** Only to access SymConst of kind addr_ent. Else assertion: */ +entity *get_SymConst_entity (ir_node *node); +void set_SymConst_entity (ir_node *node, entity *ent); + +/** 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); +void set_SymConst_symbol (ir_node *node, + union symconst_symbol sym); ir_node *get_Sel_mem (ir_node *node); void set_Sel_mem (ir_node *node, ir_node *mem); @@ -402,21 +435,6 @@ void set_Sel_index (ir_node *node, int pos, ir_node *index); entity *get_Sel_entity (ir_node *node); /* entity to select */ void set_Sel_entity (ir_node *node, entity *ent); -/** - * Projection numbers for result of Call node: use for Proj nodes! - * - * @remark old name convention! - */ -typedef enum { - pncl_memory = 0, /**< The memory result. */ - pncl_exc_target = 1, /**< The control flow result branching to the exception handler */ - pncl_result_tuple = 2, /**< The tuple containing all (0, 1, 2, ...) results */ - pncl_exc_memory = 3, /**< The memory result in case the called method terminated with - an exception */ - pncl_value_res_base = 4 /**< A pointer to the memory region containing copied results - passed by value (for compound result types). */ -} pncl_number; /* pncl: Projection Number CaLl */ - /** * Projection numbers for result of Call node: use for Proj nodes! */ @@ -426,8 +444,9 @@ typedef enum { pn_Call_P_value_res_base = 4,/**< A pointer to the memory region containing copied results passed by value (for compound result types). */ pn_Call_X_except = 1, /**< The control flow result branching to the exception handler */ - pn_Call_M_except = 3 /**< The memory result in case the called method terminated with + pn_Call_M_except = 3, /**< The memory result in case the called method terminated with an exception */ + pn_Call_max = 5 /**< number of prejections from a Call */ } pn_Call; /* Projection numbers for Call. */ ir_node *get_Call_mem (ir_node *node); @@ -461,8 +480,6 @@ void remove_Call_callee_arr(ir_node * node); ir_node *get_CallBegin_ptr (ir_node *node); void set_CallBegin_ptr (ir_node *node, ir_node *ptr); -/* @@@ old -- use get_irn_irg instead! */ -ir_graph *get_CallBegin_irg (ir_node *node); ir_node *get_CallBegin_call (ir_node *node); void set_CallBegin_call (ir_node *node, ir_node *call); @@ -680,8 +697,13 @@ 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); -/* Returns true if n is Phi or Filter in interprocedural_view. */ +/** 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. */ int is_Phi (ir_node *n); +/** Returns true if irg in phase building and the Phi has zero + predecessors: it's a Phi0. */ +int is_Phi0 (ir_node *n); /* These routines also work for Filter nodes in interprocedural view. */ ir_node **get_Phi_preds_arr (ir_node *node); int get_Phi_n_preds (ir_node *node); @@ -694,10 +716,21 @@ long get_Filter_proj(ir_node *node); void set_Filter_proj(ir_node *node, long proj); /* set the interprocedural predecessors, ...d_arr uses current_ir_graph. * @@@ Maybe better: arity is zero if no cg preds. */ -void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in); -void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred); -int get_Filter_n_cg_preds(ir_node *node); -ir_node * get_Filter_cg_pred(ir_node *node, int pos); +void set_Filter_cg_pred_arr(ir_node * node, int arity, ir_node ** in); +void set_Filter_cg_pred(ir_node * node, int pos, ir_node * pred); +int get_Filter_n_cg_preds(ir_node *node); +ir_node *get_Filter_cg_pred(ir_node *node, int pos); + +/** Return true if parameter is a memory operation. + * + * A memory operation is an operation that directly changes the + * memory. I.e., a Load or a Store operation. + */ +int is_memop(ir_node *node); +ir_node *get_memop_mem (ir_node *node); +void set_memop_mem (ir_node *node, ir_node *mem); +ir_node *get_memop_ptr (ir_node *node); +void set_memop_ptr (ir_node *node, ir_node *ptr); /** * Projection numbers for Load: use for Proj nodes! @@ -769,7 +802,6 @@ void set_Sync_pred (ir_node *node, int pos, ir_node *pred); ir_node *get_Proj_pred (ir_node *node); void set_Proj_pred (ir_node *node, ir_node *pred); -/* Why long? shouldn't int be enough, and smaller? Or even byte? */ long get_Proj_proj (ir_node *node); void set_Proj_proj (ir_node *node, long proj); @@ -802,7 +834,6 @@ void set_Confirm_cmp (ir_node *node, pn_Cmp cmp); /** returns operand of node if node is a Proj. */ ir_node *skip_Proj (ir_node *node); /** returns operand of node if node is a Id */ -ir_node *skip_nop (ir_node *node); ir_node *skip_Id (ir_node *node); /* Same as skip_nop. */ /* returns corresponding operand of Tuple if node is a Proj from a Tuple. */ @@ -824,9 +855,6 @@ int is_Proj (const ir_node *node); Start, End, Jmp, Cond, Return, Raise, Bad, CallBegin, EndReg, EndExcept */ int is_cfop(ir_node *node); -/* @@@ old -- use get_irn_irg instead! */ -ir_graph *get_ip_cfop_irg(ir_node *n); - /** Returns true if the operation manipulates interprocedural control flow: CallBegin, EndReg, EndExcept */ int is_ip_cfop(ir_node *node); @@ -837,6 +865,17 @@ int is_fragile_op(ir_node *node); /** Returns the memory operand of fragile operations. */ ir_node *get_fragile_op_mem(ir_node *node); +/*-----------------------------------------------------------------*/ +/** Debug aides **/ +/*-----------------------------------------------------------------*/ + + +/** Debug print the node. + * + * Writes the node, all its attributes and the predecessors to stdout if DEBUG_libfirm + * is set. Else does nothing. */ +void dump_irn(ir_node *n); + #include "ident.h" #ifdef __GNUC__ @@ -856,7 +895,7 @@ ir_node *get_fragile_op_mem(ir_node *node); /** 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), (void *)(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))) +#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), (void *)(X)) /** Output information about an entity */ @@ -866,9 +905,9 @@ ir_node *get_fragile_op_mem(ir_node *node); /** 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), (void *)(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), (void *)(X)) +#define DDMG(X) printf("%s(l.%i) graph %s: %ld (%p) in %s %s.\n", __MYFUNC__, __LINE__, get_entity_name(get_irg_entity(X)), get_irg_graph_nr(X), (void *)(X), get_type_tpop_name(get_entity_owner(get_irg_entity(X))), get_type_name(get_entity_owner(get_irg_entity(X)))) /** Output information about an ident */ -#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, id_to_str(X), (void *)(X)) +#define DDMI(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, get_id_str(X), (void *)(X)) /** Output information about a mode */ #define DDMM(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, get_mode_name(X), (void *)(X)) /** Output information about a loop */ @@ -879,4 +918,8 @@ ir_node *get_fragile_op_mem(ir_node *node); /*@}*/ /* end of ir_node group definition */ +#ifdef __cplusplus +} +#endif + # endif /* _IRNODE_H_ */