X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=569178f93b4791bbfb7a409cb2d1ac7c474542c3;hb=cb91bddc9cacdab7c28e4336847bd3dc248aa549;hp=1a99728a966e2c6872077596a0a4b0e02032295c;hpb=dddcc630819f338c3b45e2bc646233e6872d5bb6;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 1a99728a9..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" @@ -153,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, @@ -170,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 @@ -184,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; @@ -201,16 +222,16 @@ 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 */ @@ -223,6 +244,7 @@ struct ir_node { 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 @@ -240,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); /** @} */ /*-------------------------------------------------------------------*/ @@ -316,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); }