X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode_t.h;h=569178f93b4791bbfb7a409cb2d1ac7c474542c3;hb=cb91bddc9cacdab7c28e4336847bd3dc248aa549;hp=518c63c6db9950725d895dd50af306864e8dd30e;hpb=ac7a8d6d17e3080b94233fb5ab099591b9dc757b;p=libfirm diff --git a/ir/ir/irnode_t.h b/ir/ir/irnode_t.h index 518c63c6d..569178f93 100644 --- a/ir/ir/irnode_t.h +++ b/ir/ir/irnode_t.h @@ -37,7 +37,9 @@ # include "irloop.h" # include "array.h" -# include "exc.h" +#include "set.h" +#include "entity_t.h" +#include "type_t.h" /** ir node attributes **/ @@ -85,16 +87,10 @@ typedef struct { type *tp; /**< the source type, for analyses. default: type_unknown. */ } const_attr; -/** SymConst attributes - This union contains the symbolic information represented by the node */ -typedef union type_or_id { - type *typ; - ident *ptrinfo; -} type_or_id; - typedef struct { - type_or_id tori; + symconst_symbol sym; // old tori symconst_kind num; + type *tp; /**< the source type, for analyses. default: type_unknown. */ } symconst_attr; /** Sel attributes */ @@ -155,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,8 +188,10 @@ typedef union { callbegin_attr callbegin; /**< For CallBegin */ alloc_attr a; /**< For Alloc. */ io_attr io; /**< For InstOf */ - type *f; /**< For Free. */ + 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 @@ -186,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; @@ -203,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 @@ -238,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); /** @} */ /*-------------------------------------------------------------------*/ @@ -314,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); } @@ -324,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])); } /** @@ -335,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);