X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=569178f93b4791bbfb7a409cb2d1ac7c474542c3;hb=cb91bddc9cacdab7c28e4336847bd3dc248aa549;hp=f0ca0dc915c6b523604b01a368b2121e33ce8374;hpb=b8f363d7be29eb5702e130be3796ff7162410e6a;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index f0ca0dc91..569178f93 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -37,8 +37,6 @@ # include "irloop.h" # include "array.h" -# include "exc.h" - #include "set.h" #include "entity_t.h" #include "type_t.h" @@ -92,6 +90,7 @@ typedef struct { typedef struct { symconst_symbol sym; // old tori symconst_kind num; + type *tp; /**< the source type, for analyses. default: type_unknown. */ } symconst_attr; /** Sel attributes */ @@ -152,6 +151,28 @@ typedef struct { type *totype; } cast_attr; +/** Load attributes */ +typedef struct { + ir_mode *load_mode; /**< the mode of this Load operation */ + ent_volatility volatility; /**< the volatility of a Load/Store operation */ +#if PRECISE_EXC_CONTEXT + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +#endif +} load_attr; + +/** Store attributes */ +typedef struct { + ent_volatility volatility; /**< the volatility of a Store operation */ +#if PRECISE_EXC_CONTEXT + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +#endif +} store_attr; + +/** Exception attributes */ +typedef struct { + struct ir_node **frag_arr; /**< For Phi node construction in case of exception */ +} except_attr; + typedef pn_Cmp confirm_attr; /** Attribute to hold compare operation */ /** Some irnodes just have one attribute, these are stored here, @@ -169,6 +190,8 @@ typedef union { io_attr io; /**< For InstOf */ type *f; /**< For Free. */ cast_attr cast; /**< For Cast. */ + load_attr load; /**< For Load. */ + store_attr store; /**< For Store. */ int phi0_pos; /**< For Phi. Used to remember the value defined by this Phi node. Needed when the Phi is completed to call get_r_internal_value to find the @@ -183,8 +206,7 @@ typedef union { filter_attr filter; /**< For Filter */ end_attr end; /**< For EndReg, EndExcept */ #if PRECISE_EXC_CONTEXT - struct ir_node **frag_arr; /**< For Phi node construction in case of exceptions - for nodes Store, Load, Div, Mod, Quot, DivMod. */ + except_attr except; /**< For Phi node construction in case of exceptions */ #endif } attr; @@ -200,24 +222,29 @@ struct ir_node { struct ir_node **in; /**< array with predecessors / operands */ void *link; /**< to attach additional information to the node, e.g. used while construction to link Phi0 nodes and - during optimization to link to nodes that - shall replace a node. */ + during optimization to link to nodes that + shall replace a node. */ /* ------- Fields for optimizations / analysis information ------- */ struct ir_node **out; /**< array of out edges */ struct dbg_info* dbi; /**< A pointer to information for debug support. */ /* ------- For debugging ------- */ #ifdef DEBUG_libfirm - int out_valid; /** < indicate that out edges are valid */ + int out_valid; /** < indicate that out edges are valid */ int node_nr; /**< a unique node number for each node to make output - readable. */ + readable. */ #endif /* ------- For analyses -------- */ ir_loop *loop; /**< the loop the node is in. Access routines in irloop.h */ +#ifdef DO_HEAPANALYSIS + struct abstval *av; + struct section *sec; +#endif /* ------- Opcode depending fields -------- */ attr attr; /**< attribute of this node. Depends on opcode. Must be last field of struct ir_node. */ }; + /** Copies all attributes stored in the old node to the new node. Assumes both have the same opcode and sufficient size. */ void @@ -235,11 +262,14 @@ INLINE long get_irn_proj_attr (ir_node *node); INLINE alloc_attr get_irn_alloc_attr (ir_node *node); INLINE type *get_irn_free_attr (ir_node *node); INLINE symconst_attr get_irn_symconst_attr (ir_node *node); -type *get_irn_call_attr (ir_node *node); -type *get_irn_funccall_attr (ir_node *node); -sel_attr get_irn_sel_attr (ir_node *node); -int get_irn_phi_attr (ir_node *node); -block_attr get_irn_block_attr (ir_node *node); +type *get_irn_call_attr (ir_node *node); +type *get_irn_funccall_attr (ir_node *node); +sel_attr get_irn_sel_attr (ir_node *node); +int get_irn_phi_attr (ir_node *node); +block_attr get_irn_block_attr (ir_node *node); +load_attr get_irn_load_attr (ir_node *node); +store_attr get_irn_store_attr (ir_node *node); +except_attr get_irn_except_attr (ir_node *node); /** @} */ /*-------------------------------------------------------------------*/ @@ -311,7 +341,6 @@ __get_irn_inter_arity (const ir_node *node) { */ static INLINE int __get_irn_arity (const ir_node *node) { - assert(node); if (interprocedural_view) return __get_irn_inter_arity(node); return __get_irn_intra_arity(node); } @@ -321,7 +350,7 @@ __get_irn_arity (const ir_node *node) { */ static INLINE ir_node * __get_irn_intra_n (ir_node *node, int n) { - return (node->in[n + 1] = skip_nop(node->in[n + 1])); + return (node->in[n + 1] = skip_Id(node->in[n + 1])); } /** @@ -332,9 +361,9 @@ __get_irn_inter_n (ir_node *node, int n) { /* handle Filter and Block specially */ if (__get_irn_opcode(node) == iro_Filter) { assert(node->attr.filter.in_cg); - return (node->attr.filter.in_cg[n + 1] = skip_nop(node->attr.filter.in_cg[n + 1])); + return (node->attr.filter.in_cg[n + 1] = skip_Id(node->attr.filter.in_cg[n + 1])); } else if (__get_irn_opcode(node) == iro_Block && node->attr.block.in_cg) { - return (node->attr.block.in_cg[n + 1] = skip_nop(node->attr.block.in_cg[n + 1])); + return (node->attr.block.in_cg[n + 1] = skip_Id(node->attr.block.in_cg[n + 1])); } return __get_irn_intra_n (node, n);