X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.h;h=5a97ff2d9d5f1b648b2b950f5e112854c250d1d1;hb=c23f6e062025e00e102d2e1ca95b48e696ad8cca;hp=aa96f26a59f9fe19945feebc54bb5e98d5502679;hpb=333a4e6fda9e1f2f8aa619c5b0ea6da1ac46a0ad;p=libfirm diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index aa96f26a5..5a97ff2d9 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -9,46 +9,19 @@ * Copyright: (c) 1998-2003 Universität Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ - # ifndef _IRNODE_H_ # define _IRNODE_H_ #include -/** - * Projection numbers of compare: use for Proj nodes! - * @remark there are numbers with normalized names below! - */ -typedef enum { - False = 0, /**< false */ - Eq, /**< equal */ - Lt, /**< less */ - Le, /**< less or equal */ - Gt, /**< greater */ - Ge, /**< greater or equal */ - Lg, /**< less or greater */ - Leg = 7, /**< less, equal or greater = ordered */ - Uo, /**< unordered */ - Ue, /**< unordered or equal */ - Ul, /**< unordered or less */ - Ule, /**< unordered, less or equal */ - Ug, /**< unordered or greater */ - Uge, /**< unordered, greater or equal */ - Ne, /**< unordered, less or greater = not equal */ - True = 15 /**< true */ - /* not_mask = Leg*/ /* bits to flip to negate comparison * @@ hack for jni interface */ -} pnc_number; /* pnc: Projection Number Cmp */ -#define not_mask Leg - -# include "tv.h" # include "irgraph.h" # include "entity.h" # include "firm_common.h" # include "irop.h" # include "irmode.h" # include "type.h" +# include "irextbb.h" # include "dbginfo.h" -/* # include "exc.h" */ /** * @file irnode.h @@ -120,8 +93,8 @@ int get_irn_inter_arity (const ir_node *node); Assumes that current_ir_graph is set to the graph containing "node". "in" must contain all predecessors except the block that are required for the nodes opcode. */ -void set_irn_in (ir_node *node, int arity, - ir_node *in[]); +void set_irn_in (ir_node *node, int arity, ir_node *in[]); + /* to iterate through the predecessors without touching the array. No order of predecessors guaranteed. To iterate over the operands iterate from 0 to i < get_irn_arity(), @@ -274,6 +247,9 @@ 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); void set_Block_matured (ir_node *node, bool 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); void set_Block_block_visited (ir_node *node, unsigned long visit); ir_node *set_Block_dead(ir_node *block); @@ -298,6 +274,11 @@ ir_node *get_Block_cg_cfgpred(ir_node * node, int pos); /* frees the memory. */ void remove_Block_cg_cfgpred_arr(ir_node * node); +/** returns the extended basic block a block belongs to */ +ir_extblk *get_Block_extbb(const ir_node *block); +/** sets the extended basic block a block belongs to */ +void set_Block_extbb(ir_node *block, ir_extblk *extblk); + /** Return the number of Keep alive node. */ int get_End_n_keepalives(ir_node *end); @@ -378,9 +359,25 @@ typedef enum { pn_Raise_max /**< number of projections from a Raise */ } pn_Raise; /* Projection numbers for Raise. */ +typedef enum { + CNST_NULL = 0, /**< The node is a const(0). */ + CNST_ONE = +1, /**< The node is a const(1). */ + CNST_ALL_ONE = -1, /**< The node is a const(11111...). */ + CNST_OTHER = 2, /**< The tarvel of the const has another value. */ + CNST_SYMCONST = 3, /**< The node is symconst. */ + CNST_NO_CONST = 4 /**< The node is no const at all. */ +} cnst_classify_t; + tarval *get_Const_tarval (ir_node *node); void set_Const_tarval (ir_node *node, tarval *con); +/** + * Classify a node concerning constant properties. + * @param irn A node to check for. + * @return Constant properties of that node. + */ +cnst_classify_t classify_Const(ir_node *irn); + /** Returns the source language type of a Const node. * Must be an atomic type. Mode of type must be mode of node. */ @@ -458,6 +455,14 @@ 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); +/** InstOf access */ +type *get_InstOf_ent (ir_node *node); +void set_InstOf_ent (ir_node *node, type *ent); +ir_node *get_InstOf_store (ir_node *node); +void set_InstOf_store (ir_node *node, ir_node *obj); +ir_node *get_InstOf_obj (ir_node *node); +void set_InstOf_obj (ir_node *node, ir_node *obj); + /** * Projection numbers for result of Call node: use for Proj nodes! */ @@ -471,6 +476,7 @@ typedef enum { an exception */ pn_Call_max = 5 /**< number of projections from a Call */ } pn_Call; /* Projection numbers for Call. */ +#define pn_Call_M pn_Call_M_regular ir_node *get_Call_mem (ir_node *node); void set_Call_mem (ir_node *node, ir_node *mem); @@ -672,8 +678,15 @@ typedef enum { } 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); + +/** Calculates the negated (Complement(R)) pnc condition. */ int get_negated_pnc(int pnc); + +/** Calculates the inversed (R^-1) pnc condition, i.e., "<" --> ">" */ +int get_inversed_pnc(int pnc); + ir_node *get_Cmp_left (ir_node *node); void set_Cmp_left (ir_node *node, ir_node *left); ir_node *get_Cmp_right (ir_node *node); @@ -713,6 +726,21 @@ 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); +/** Checks for upcast. + * + * Returns true if the Cast node casts a class type to a super type. + * Works also for pointers to classes (recursively). + */ +int is_Cast_upcast(ir_node *node); + +/** Checks for downcast. + * + * Returns true if the Cast node casts a class type to a sub type. + * Works also for pointers to classes (recursively). + */ +int is_Cast_downcast(ir_node *node); + + /** 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. */ @@ -820,14 +848,24 @@ void set_Free_size (ir_node *node, ir_node *size); type *get_Free_type (ir_node *node); void set_Free_type (ir_node *node, type *tp); +where_alloc get_Free_where (ir_node *node); +void set_Free_where (ir_node *node, where_alloc where); + ir_node **get_Sync_preds_arr (ir_node *node); int get_Sync_n_preds (ir_node *node); ir_node *get_Sync_pred (ir_node *node, int pos); void set_Sync_pred (ir_node *node, int pos, ir_node *pred); -ir_node *get_Proj_pred (ir_node *node); +/** Returns the source language type of a Proj node. + * Must be an atomic type. Mode of type must be mode of node. + */ +type *get_Proj_type (ir_node *node); + +/** Return the predecessor of a Proj node. */ +ir_node *get_Proj_pred (const ir_node *node); void set_Proj_pred (ir_node *node, ir_node *pred); -long get_Proj_proj (ir_node *node); +/** 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); ir_node **get_Tuple_preds_arr (ir_node *node); @@ -873,6 +911,12 @@ ir_node *skip_Id (ir_node *node); /* Same as skip_nop. */ ir_node *skip_Tuple (ir_node *node); /** returns operand of node if node is a Cast */ ir_node *skip_Cast (ir_node *node); +/** returns operand of node if node is a Confirm */ +ir_node *skip_Confirm (ir_node *node); +/** Skip all high-level Operations. */ +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 node is a Bad node. */ int is_Bad (const ir_node *node); /** returns true if the node is not a Block */ @@ -893,7 +937,7 @@ int is_cfop(const ir_node *node); int is_ip_cfop(const ir_node *node); /** Returns true if the operation can change the control flow because of an exception: Call, Quot, DivMod, Div, Mod, Load, Store, Alloc, - Bad. */ + Bad. Raise is not fragile, but a unconditional jump. */ int is_fragile_op(const ir_node *node); /** Returns the memory operand of fragile operations. */ ir_node *get_fragile_op_mem(ir_node *node); @@ -902,6 +946,11 @@ ir_node *get_fragile_op_mem(ir_node *node); * operation: Cond. */ int is_forking_op(const ir_node *node); +/** Return the type associated with the value produced by n + * if the node remarks this type as it is the case for + * Cast, Const, SymConst and some Proj nodes. */ +type *get_irn_type(ir_node *n); + /** * Access custom node data. * The data must have been registered with @@ -961,7 +1010,11 @@ void dump_irn(ir_node *n); /** Output the firm kind of the node */ #define DDMK(X) printf("%s(l.%i) %s: %p\n", __MYFUNC__, __LINE__, print_firm_kind(X), (void *)(X)); /** 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)) + +/*#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))*/ +int dump_node_opcode(FILE *F, ir_node *n); +#define DDMN(X) do { printf("%s(l.%i) ", __MYFUNC__, __LINE__); dump_node_opcode(stdout, X); printf(": %ld (%p)\n", get_irn_node_nr(X), (void *)(X)); } while (0) + /** 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))) /** Output information about a type */