X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.h;h=8da48aa00bd60c6f88d0abbc5e6317ae83f82200;hb=637542932dc27dcdfc7def09b58d9d5d4c34fb77;hp=553e1ff62f964e336c71a86bda658069f983dceb;hpb=144121df27dc1290c96c8a1c393e867663216580;p=libfirm diff --git a/ir/ir/irnode.h b/ir/ir/irnode.h index 553e1ff62..8da48aa00 100644 --- a/ir/ir/irnode.h +++ b/ir/ir/irnode.h @@ -9,20 +9,18 @@ * Copyright: (c) 1998-2003 Universität Karlsruhe * Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE. */ - # ifndef _IRNODE_H_ # define _IRNODE_H_ #include -# include "pnc.h" -# 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" /** @@ -249,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); @@ -273,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); @@ -354,12 +360,12 @@ typedef enum { } pn_Raise; /* Projection numbers for Raise. */ typedef enum { - CNST_NULL = TV_CLASSIFY_NULL, /**< The node is a const(0). */ - CNST_ONE = TV_CLASSIFY_ONE, /**< The node is a const(1). */ - CNST_ALL_ONE = TV_CLASSIFY_ALL_ONE, /**< The node is a const(11111...). */ - CNST_OTHER = TV_CLASSIFY_OTHER, /**< The tarvel of the const has another value. */ - CNST_SYMCONST, /**< The node is symconst. */ - CNST_NO_CONST /**< The node is no const at all. */ + 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); @@ -449,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! */ @@ -663,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); @@ -704,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. */ @@ -819,9 +855,16 @@ 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); @@ -867,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 */ @@ -896,6 +945,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 @@ -955,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 */