X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.h;h=8da48aa00bd60c6f88d0abbc5e6317ae83f82200;hb=637542932dc27dcdfc7def09b58d9d5d4c34fb77;hp=282c1f877710b487b843518dd143134ab2288060;hpb=cf79d3e7dfc60cb5ec8f2cdab9b620b40ff14566;p=libfirm diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index 282c1f877..8da48aa00 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -20,6 +20,7 @@ # include "irop.h" # include "irmode.h" # include "type.h" +# include "irextbb.h" # include "dbginfo.h" /** @@ -246,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); @@ -270,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); @@ -446,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! */ @@ -660,8 +677,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 pnc condition. */ int get_negated_pnc(int pnc); + +/** Calculates the swapped pnc condition, i.e., "<" --> ">" */ +int get_swapped_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); @@ -701,6 +725,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. */ @@ -822,10 +861,10 @@ void set_Sync_pred (ir_node *node, int pos, ir_node *pred); type *get_Proj_type (ir_node *node); /** Return the predecessor of a Proj node. */ -ir_node *get_Proj_pred (ir_node *node); +ir_node *get_Proj_pred (const ir_node *node); void set_Proj_pred (ir_node *node, ir_node *pred); /** Return the projection number of a Proj node. */ -long get_Proj_proj (ir_node *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); @@ -871,6 +910,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 */ @@ -964,7 +1009,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 */