X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=f4d51d82f355722255256bf222aa80ca46667200;hb=b519dd6a1e6d85e843eff533be787d1f138a07ff;hp=b2ac8b5930ec20d181de3a468677f551622e7531;hpb=a9c0fd51347b4b1aff689b476ad91824e494be54;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index b2ac8b593..f4d51d82f 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -35,7 +35,6 @@ #include "irnode_t.h" #include "irgraph_t.h" #include "irmode_t.h" -#include "typegmod.h" #include "irbackedge_t.h" #include "irdump.h" #include "irop_t.h" @@ -65,6 +64,8 @@ static const char *pnc_name_arr [] = { * returns the pnc name from an pnc constant */ const char *get_pnc_string(int pnc) { + assert(pnc >= 0 && pnc < + (int) (sizeof(pnc_name_arr)/sizeof(pnc_name_arr[0]))); return pnc_name_arr[pnc]; } @@ -107,7 +108,7 @@ unsigned firm_add_node_size = 0; /* register new space for every node */ -unsigned register_additional_node_data(unsigned size) { +unsigned firm_register_additional_node_data(unsigned size) { assert(!forbid_new_data && "Too late to register additional node data"); if (forbid_new_data) @@ -130,8 +131,8 @@ init_irnode(void) { * If arity is negative, a node with a dynamic array is created. */ ir_node * -new_ir_node (dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode, - int arity, ir_node **in) +new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mode, + int arity, ir_node **in) { ir_node *res; size_t node_size = offsetof(ir_node, attr) + op->attr_size + firm_add_node_size; @@ -281,7 +282,7 @@ ir_node * } void -set_irn_n (ir_node *node, int n, ir_node *in) { +set_irn_n(ir_node *node, int n, ir_node *in) { assert(node && node->kind == k_ir_node); assert(-1 <= n); assert(n < get_irn_arity(node)); @@ -315,8 +316,7 @@ set_irn_n (ir_node *node, int n, ir_node *in) { node->in[n + 1] = in; } -int add_irn_n(ir_node *node, ir_node *in) -{ +int add_irn_n(ir_node *node, ir_node *in) { int pos; ir_graph *irg = get_irn_irg(node); @@ -332,25 +332,21 @@ int add_irn_n(ir_node *node, ir_node *in) } int -(get_irn_deps)(const ir_node *node) -{ +(get_irn_deps)(const ir_node *node) { return _get_irn_deps(node); } ir_node * -(get_irn_dep)(const ir_node *node, int pos) -{ +(get_irn_dep)(const ir_node *node, int pos) { return _get_irn_dep(node, pos); } void -(set_irn_dep)(ir_node *node, int pos, ir_node *dep) -{ +(set_irn_dep)(ir_node *node, int pos, ir_node *dep) { _set_irn_dep(node, pos, dep); } -int add_irn_dep(ir_node *node, ir_node *dep) -{ +int add_irn_dep(ir_node *node, ir_node *dep) { int res = 0; if (node->deps == NULL) { @@ -430,7 +426,7 @@ void _set_irn_op(node, op); } -ir_opcode +unsigned (get_irn_opcode)(const ir_node *node) { return _get_irn_opcode(node); } @@ -522,10 +518,22 @@ void firm_set_irn_section(ir_node *n, struct section *s) { } #else /* Dummies needed for firmjni. */ -struct abstval *get_irn_abst_value(ir_node *n) { return NULL; } -void set_irn_abst_value(ir_node *n, struct abstval *os) {} -struct section *firm_get_irn_section(ir_node *n) { return NULL; } -void firm_set_irn_section(ir_node *n, struct section *s) {} +struct abstval *get_irn_abst_value(ir_node *n) { + (void) n; + return NULL; +} +void set_irn_abst_value(ir_node *n, struct abstval *os) { + (void) n; + (void) os; +} +struct section *firm_get_irn_section(ir_node *n) { + (void) n; + return NULL; +} +void firm_set_irn_section(ir_node *n, struct section *s) { + (void) n; + (void) s; +} #endif /* DO_HEAPANALYSIS */ @@ -539,10 +547,10 @@ long get_irn_node_nr(const ir_node *node) { #endif } -const_attr +const_attr * get_irn_const_attr(ir_node *node) { assert(node->op == op_Const); - return node->attr.con; + return &node->attr.con; } long @@ -551,22 +559,22 @@ get_irn_proj_attr(ir_node *node) { return node->attr.proj; } -alloc_attr +alloc_attr * get_irn_alloc_attr(ir_node *node) { assert(node->op == op_Alloc); - return node->attr.alloc; + return &node->attr.alloc; } -free_attr +free_attr * get_irn_free_attr(ir_node *node) { assert(node->op == op_Free); - return node->attr.free; + return &node->attr.free; } -symconst_attr +symconst_attr * get_irn_symconst_attr(ir_node *node) { assert(node->op == op_SymConst); - return node->attr.symc; + return &node->attr.symc; } ir_type * @@ -575,10 +583,10 @@ get_irn_call_attr(ir_node *node) { return node->attr.call.cld_tp = skip_tid(node->attr.call.cld_tp); } -sel_attr +sel_attr * get_irn_sel_attr(ir_node *node) { assert(node->op == op_Sel); - return node->attr.sel; + return &node->attr.sel; } int @@ -587,29 +595,29 @@ get_irn_phi0_attr(ir_node *node) { return node->attr.phi0.pos; } -block_attr +block_attr * get_irn_block_attr(ir_node *node) { assert(node->op == op_Block); - return node->attr.block; + return &node->attr.block; } -load_attr +load_attr * get_irn_load_attr(ir_node *node) { assert(node->op == op_Load); - return node->attr.load; + return &node->attr.load; } -store_attr +store_attr * get_irn_store_attr(ir_node *node) { assert(node->op == op_Store); - return node->attr.store; + return &node->attr.store; } -except_attr +except_attr * get_irn_except_attr(ir_node *node) { assert(node->op == op_Div || node->op == op_Quot || node->op == op_DivMod || node->op == op_Mod || node->op == op_Call || node->op == op_Alloc); - return node->attr.except; + return &node->attr.except; } void *(get_irn_generic_attr)(ir_node *node) { @@ -638,18 +646,14 @@ int get_irn_pred_pos(ir_node *node, ir_node *arg) { /** manipulate fields of individual nodes **/ -/* this works for all except Block */ ir_node * -get_nodes_block(const ir_node *node) { - assert(node->op != op_Block); - assert(is_irn_pinned_in_irg(node) && "block info may be incorrect"); - return get_irn_n(node, -1); +(get_nodes_block)(const ir_node *node) { + return _get_nodes_block(node); } void set_nodes_block(ir_node *node, ir_node *block) { - assert(node->op != op_Block); - set_irn_n(node, -1, block); + node->op->ops.set_block(node, block); } /* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base) @@ -846,11 +850,18 @@ void set_Block_extbb(ir_node *block, ir_extblk *extblk) { block->attr.block.extblk = extblk; } +/* returns the macro block header of a block. */ ir_node *get_Block_MacroBlock(const ir_node *block) { assert(is_Block(block)); return get_irn_n(block, -1); } +/* returns the graph of a Block. */ +ir_graph *get_Block_irg(const ir_node *block) { + assert(is_Block(block)); + return block->attr.block.irg; +} + int get_End_n_keepalives(ir_node *end) { assert(end->op == op_End); @@ -1915,16 +1926,6 @@ set_Proj_pred(ir_node *node, ir_node *pred) { set_irn_n(node, 0, pred); } -long get_VProj_proj(const ir_node *node) -{ - return node->attr.proj; -} - -void set_VProj_proj(ir_node *node, long value) -{ - node->attr.proj = value; -} - long get_Proj_proj(const ir_node *node) { assert(is_Proj(node)); @@ -2005,17 +2006,16 @@ void set_Confirm_bound(ir_node *node, ir_node *bound) { set_irn_n(node, 0, bound); } -pn_Cmp get_Confirm_cmp(ir_node *node) { +pn_Cmp get_Confirm_cmp(const ir_node *node) { assert(node->op == op_Confirm); - return node->attr.confirm_cmp; + return node->attr.confirm.cmp; } void set_Confirm_cmp(ir_node *node, pn_Cmp cmp) { assert(node->op == op_Confirm); - node->attr.confirm_cmp = cmp; + node->attr.confirm.cmp = cmp; } - ir_node * get_Filter_pred(ir_node *node) { assert(node->op == op_Filter); @@ -2337,11 +2337,46 @@ void set_Pin_op(ir_node *pin, ir_node *node) { } /* Return the assembler text of an ASM pseudo node. */ -const char *get_ASM_text(const ir_node *node) { +ident *get_ASM_text(const ir_node *node) { + assert(node->op == op_ASM); + return node->attr.assem.asm_text; +} + +/* Return the number of input constraints for an ASM node. */ +int get_ASM_n_input_constraints(const ir_node *node) { + assert(node->op == op_ASM); + return ARR_LEN(node->attr.assem.inputs); +} + +/* Return the input constraints for an ASM node. This is a flexible array. */ +const ir_asm_constraint *get_ASM_input_constraints(const ir_node *node) { + assert(node->op == op_ASM); + return node->attr.assem.inputs; +} + +/* Return the number of output constraints for an ASM node. */ +int get_ASM_n_output_constraints(const ir_node *node) { + assert(node->op == op_ASM); + return ARR_LEN(node->attr.assem.outputs); +} + +/* Return the output constraints for an ASM node. */ +const ir_asm_constraint *get_ASM_output_constraints(const ir_node *node) { assert(node->op == op_ASM); - return get_id_str(node->attr.assem.asm_text); + return node->attr.assem.outputs; } +/* Return the number of clobbered registers for an ASM node. */ +int get_ASM_n_clobbers(const ir_node *node) { + assert(node->op == op_ASM); + return ARR_LEN(node->attr.assem.clobber); +} + +/* Return the list of clobbered registers for an ASM node. */ +ident **get_ASM_clobbers(const ir_node *node) { + assert(node->op == op_ASM); + return node->attr.assem.clobber; +} /* returns the graph of a node */ ir_graph * @@ -2353,9 +2388,9 @@ get_irn_irg(const ir_node *node) { * irg. */ if (! is_Block(node)) - node = get_irn_n(node, -1); + node = get_nodes_block(node); if (is_Bad(node)) /* sometimes bad is predecessor of nodes instead of block: in case of optimization */ - node = get_irn_n(node, -1); + node = get_nodes_block(node); assert(get_irn_op(node) == op_Block); return node->attr.block.irg; } @@ -2504,6 +2539,11 @@ int return _is_NoMem(node); } +int +(is_Minus)(const ir_node *node) { + return _is_Minus(node); +} + int (is_Mod)(const ir_node *node) { return _is_Mod(node); @@ -2529,11 +2569,41 @@ int return _is_Add(node); } +int +(is_And)(const ir_node *node) { + return _is_And(node); +} + +int +(is_Or)(const ir_node *node) { + return _is_Or(node); +} + +int +(is_Eor)(const ir_node *node) { + return _is_Eor(node); +} + int (is_Sub)(const ir_node *node) { return _is_Sub(node); } +int +(is_Not)(const ir_node *node) { + return _is_Not(node); +} + +int +(is_Psi)(const ir_node *node) { + return _is_Psi(node); +} + +int +(is_Tuple)(const ir_node *node) { + return _is_Tuple(node); +} + int (is_Start)(const ir_node *node) { return _is_Start(node); @@ -2665,6 +2735,12 @@ int return _is_Raise(node); } +/* returns true if a node is an ASM node. */ +int +(is_ASM)(const ir_node *node) { + return _is_ASM(node); +} + int is_Proj(const ir_node *node) { assert(node); @@ -2809,6 +2885,7 @@ void (set_Cond_jmp_pred)(ir_node *cond, cond_jmp_predicate pred) { /** the get_type operation must be always implemented and return a firm type */ static ir_type *get_Default_type(ir_node *n) { + (void) n; return get_unknown_type(); } @@ -2846,6 +2923,7 @@ static ir_entity *get_SymConst_attr_entity(ir_node *self) { /** the get_type_attr operation must be always implemented */ static ir_type *get_Null_type(ir_node *n) { + (void) n; return firm_unknown_type; } @@ -2868,6 +2946,7 @@ ir_op_ops *firm_set_default_get_type_attr(ir_opcode code, ir_op_ops *ops) { /** the get_entity_attr operation must be always implemented */ static ir_entity *get_Null_ent(ir_node *n) { + (void) n; return NULL; } @@ -2885,12 +2964,28 @@ ir_op_ops *firm_set_default_get_entity_attr(ir_opcode code, ir_op_ops *ops) { return ops; } +/* Sets the debug information of a node. */ +void (set_irn_dbg_info)(ir_node *n, dbg_info *db) { + _set_irn_dbg_info(n, db); +} + +/** + * Returns the debug information of an node. + * + * @param n The node. + */ +dbg_info *(get_irn_dbg_info)(const ir_node *n) { + return _get_irn_dbg_info(n); +} + + + #ifdef DEBUG_libfirm void dump_irn(ir_node *n) { int i, arity = get_irn_arity(n); printf("%s%s: %ld (%p)\n", get_irn_opname(n), get_mode_name(get_irn_mode(n)), get_irn_node_nr(n), (void *)n); if (!is_Block(n)) { - ir_node *pred = get_irn_n(n, -1); + ir_node *pred = get_nodes_block(n); printf(" block: %s%s: %ld (%p)\n", get_irn_opname(pred), get_mode_name(get_irn_mode(pred)), get_irn_node_nr(pred), (void *)pred); }