X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Firnode.h;h=7c922e70137bee0bb0087878b981de7addd9e0ba;hb=1da43c3844e6865b0384d4370810fc936e828c32;hp=8b68014414394052330e3f372b6c8360494a2f45;hpb=0b4ffc9e2d57b0393ad86820e9415c0ccbc54549;p=libfirm diff --git a/include/libfirm/irnode.h b/include/libfirm/irnode.h index 8b6801441..7c922e701 100644 --- a/include/libfirm/irnode.h +++ b/include/libfirm/irnode.h @@ -211,6 +211,9 @@ void set_irn_visited(ir_node *node, ir_visited_t visited); void mark_irn_visited(ir_node *node); /** Returns 1 if visited >= get_irg_visited(current_ir_graph). */ int irn_visited(const ir_node *node); +/** Returns 1 if visited >= get_irg_visited(current_ir_graph). Marks the node + * visited, if it was not. */ +int irn_visited_else_mark(ir_node *node); /** * Sets the link of a node. @@ -440,6 +443,9 @@ void set_End_keepalives(ir_node *end, int n, ir_node *in[]); /** Remove irn from the keep-alive set. */ void remove_End_keepalive(ir_node *end, ir_node *irn); +/* Remove Bads, NoMem and doublets from the keep-alive set. */ +void remove_End_Bads_and_doublets(ir_node *end); + /** Some parts of the End node are allocated separately -- their memory is not recovered by dead_node_elimination if a End node is dead. free_End() frees these data structures. */ @@ -518,30 +524,6 @@ ir_type *get_Const_type(ir_node *node); /** Sets the source language type of a Const node. */ void set_Const_type(ir_node *node, ir_type *tp); -/** This enum names the three different kinds of symbolic Constants - 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 { - symconst_type_tag, /**< The SymConst is a type tag for the given type. - symconst_symbol is type *. */ - symconst_type_size, /**< The SymConst is the size of the given type. - symconst_symbol is type *. */ - symconst_type_align, /**< The SymConst is the alignment of the given type. - symconst_symbol 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. - symconst_symbol 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. - symconst_symbol is entity *. */ - symconst_ofs_ent, /**< The SymConst is the offset of its entity in the entities - owner type. */ - symconst_enum_const, /**< The SymConst is a enumeration constant of an - enumeration type. */ - symconst_label /**< The SymConst is a label address. */ -} symconst_kind; - /** Returns non-zero if s symconst kind has a type attribute */ #define SYMCONST_HAS_TYPE(kind) ((kind) <= symconst_type_align) @@ -557,18 +539,6 @@ typedef enum { /** Returns non-zero if s symconst kind has a label attribute */ #define SYMCONST_HAS_LABEL(kind) ((kind) == symconst_label) -/** SymConst attribute. - * - * This union contains the symbolic information represented by the node. - */ -typedef union symconst_symbol { - ir_type *type_p; /**< The type of a SymConst. */ - ident *ident_p; /**< The ident of a SymConst. */ - ir_entity *entity_p; /**< The entity of a SymConst. */ - ir_enum_const *enum_p; /**< The enumeration constant of a SymConst. */ - ir_label_t label; /**< The label of a SymConst. */ -} symconst_symbol; - /** Get the kind of the SymConst. */ symconst_kind get_SymConst_kind(const ir_node *node); /** Set the kind of the SymConst. */ @@ -650,8 +620,6 @@ void set_Call_param(ir_node *node, int pos, ir_node *param); ir_type *get_Call_type(ir_node *node); /** Sets the type of a call. */ void set_Call_type(ir_node *node, ir_type *tp); -/** Gets the arity of a call. Identical to get_Call_n_params(). */ -int get_Call_arity(const ir_node *node); /** * Returns non-zero if a Call is surely a self-recursive Call. @@ -686,6 +654,33 @@ ir_entity *get_Call_callee(const ir_node *node, int pos); void set_Call_callee_arr(ir_node *node, const int n, ir_entity **arr); void remove_Call_callee_arr(ir_node *node); +/** + * Projection numbers for result of Builtin node: use for Proj nodes! + */ +typedef enum { + pn_Builtin_M = pn_Generic_M_regular, /**< The memory result. */ + pn_Builtin_1_result = pn_Generic_other, /**< first result. */ + pn_Builtin_max /**< number of projections from a Builtin */ +} pn_Builtin; /* Projection numbers for Builtin. */ + +ir_node *get_Builtin_mem(const ir_node *node); +void set_Builtin_mem(ir_node *node, ir_node *mem); +ir_builtin_kind get_Builtin_kind(const ir_node *node); +void set_Builtin_kind(ir_node *node, ir_builtin_kind kind); +ir_node **get_Builtin_param_arr(ir_node *node); +/** Gets the number of parameters of a Builtin. */ +int get_Builtin_n_params(const ir_node *node); +/** Gets the Builtin parameter at position pos. */ +ir_node *get_Builtin_param(const ir_node *node, int pos); +/** Sets the Builtin parameter at position pos. */ +void set_Builtin_param(ir_node *node, int pos, ir_node *param); +/** Gets the type of a builtin. */ +ir_type *get_Builtin_type(ir_node *node); +/** Sets the type of a Builtin. */ +void set_Builtin_type(ir_node *node, ir_type *tp); +/** Returns a human readable string for the ir_builtin_kind. */ +const char *get_builtin_kind_name(ir_builtin_kind kind); + ir_node *get_CallBegin_ptr(const ir_node *node); void set_CallBegin_ptr(ir_node *node, ir_node *ptr); ir_node *get_CallBegin_call(const ir_node *node); @@ -837,34 +832,6 @@ void set_Eor_right(ir_node *node, ir_node *right); ir_node *get_Not_op(const ir_node *node); void set_Not_op(ir_node *node, ir_node *op); -/** - * Projection numbers for Cmp are defined several times. - * The bit patterns are used for various tests, so don't change. - * The "unordered" values are possible results of comparing - * floating point numbers. - * Note that the encoding is imported, so do NOT change the order. - */ -typedef enum { - pn_Cmp_False = 0, /**< false */ - pn_Cmp_Eq = 1, /**< equal */ - pn_Cmp_Lt = 2, /**< less */ - pn_Cmp_Le = pn_Cmp_Eq|pn_Cmp_Lt, /**< less or equal */ - pn_Cmp_Gt = 4, /**< greater */ - pn_Cmp_Ge = pn_Cmp_Eq|pn_Cmp_Gt, /**< greater or equal */ - pn_Cmp_Lg = pn_Cmp_Lt|pn_Cmp_Gt, /**< less or greater */ - pn_Cmp_Leg = pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt, /**< less, equal or greater = ordered */ - pn_Cmp_Uo = 8, /**< unordered */ - pn_Cmp_Ue = pn_Cmp_Uo|pn_Cmp_Eq, /**< unordered or equal */ - pn_Cmp_Ul = pn_Cmp_Uo|pn_Cmp_Lt, /**< unordered or less */ - pn_Cmp_Ule = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Lt, /**< unordered, less or equal */ - pn_Cmp_Ug = pn_Cmp_Uo|pn_Cmp_Gt, /**< unordered or greater */ - pn_Cmp_Uge = pn_Cmp_Uo|pn_Cmp_Eq|pn_Cmp_Gt, /**< unordered, greater or equal */ - pn_Cmp_Ne = pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt, /**< unordered, less or greater = not equal */ - pn_Cmp_True = 15 /**< true */ - /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for JNI interface */ -} pn_Cmp; /* Projection numbers for Cmp */ -/* #define not_mask pn_Cmp_Leg */ - /** returns the pnc name from an pnc constant */ const char *get_pnc_string(int pnc); @@ -1035,12 +1002,6 @@ void set_Alloc_size(ir_node *node, ir_node *size); ir_type *get_Alloc_type(ir_node *node); void set_Alloc_type(ir_node *node, ir_type *tp); -/** The allocation place. */ -typedef enum { - stack_alloc, /**< Alloc allocates the object on the stack. */ - heap_alloc /**< Alloc allocates the object on the heap. */ -} ir_where_alloc; - ir_where_alloc get_Alloc_where(const ir_node *node); void set_Alloc_where(ir_node *node, ir_where_alloc where); @@ -1198,13 +1159,6 @@ void set_Bound_upper(ir_node *bound, ir_node *upper); ir_node *get_Pin_op(const ir_node *pin); void set_Pin_op(ir_node *pin, ir_node *node); -/** A input/output constraint attribute */ -typedef struct { - unsigned pos; /**< The inputs/output position for this constraint. */ - ident *constraint; /**< The constraint for this input/output. */ - ir_mode *mode; /**< The mode of the constraint. */ -} ir_asm_constraint; - /** Return the assembler text of an ASM pseudo node. */ ident *get_ASM_text(const ir_node *node); /** Return the number of input constraints for an ASM node. */ @@ -1308,6 +1262,8 @@ int is_Unknown(const ir_node *node); int is_Return(const ir_node *node); /** Returns true if node is a Call node. */ int is_Call(const ir_node *node); +/** Returns true if node is a Builtin node. */ +int is_Builtin(const ir_node *node); /** Returns true if node is a CallBegin node. */ int is_CallBegin(const ir_node *node); /** Returns true if node is a Sel node. */ @@ -1511,6 +1467,11 @@ dbg_info *get_irn_dbg_info(const ir_node *n); */ unsigned firm_default_hash(const ir_node *node); +/** + * returns a descriptive name of a node (containing type+number) + */ +const char *gdb_node_helper(void *firm_object); + /*@}*/ /* end of ir_node group definition */ #endif