X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firnode.c;h=d98b1dec749488fddce38e83c5c9daf54da75c41;hb=672b5c243e900427b5dcae01441d4fa3327d692c;hp=c3be35a34f2bc927633c9e6b26e107f5dd5dcd05;hpb=e93c2b0ff34a60adeb2cea4f39dc4c8ad7c336dc;p=libfirm diff --git a/ir/ir/irnode.c b/ir/ir/irnode.c index c3be35a34..d98b1dec7 100644 --- a/ir/ir/irnode.c +++ b/ir/ir/irnode.c @@ -154,7 +154,11 @@ new_ir_node(dbg_info *db, ir_graph *irg, ir_node *block, ir_op *op, ir_mode *mod if (arity < 0) { res->in = NEW_ARR_F(ir_node *, 1); /* 1: space for block */ } else { - res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1)); + /* not nice but necessary: End and Sync must always have a flexible array */ + if (op == op_End || op == op_Sync) + res->in = NEW_ARR_F(ir_node *, (arity+1)); + else + res->in = NEW_ARR_D(ir_node *, irg->obst, (arity+1)); memcpy(&res->in[1], in, sizeof(ir_node *) * arity); } @@ -321,6 +325,15 @@ int add_irn_n(ir_node *node, ir_node *in) { return pos; } +void del_Sync_n(ir_node *n, int i) +{ + int arity = get_Sync_n_preds(n); + ir_node *last_pred = get_Sync_pred(n, arity - 1); + set_Sync_pred(n, i, last_pred); + edges_notify_edge(n, arity - 1, NULL, last_pred, get_irn_irg(n)); + ARR_SHRINKLEN(get_irn_in(n), arity); +} + int (get_irn_deps)(const ir_node *node) { return _get_irn_deps(node); } @@ -636,22 +649,10 @@ ir_type *is_frame_pointer(const ir_node *n) { return NULL; } -/* Test whether arbitrary node is globals pointer, i.e. Proj(pn_Start_P_globals) - * from Start. If so returns global type, else Null. */ -ir_type *is_globals_pointer(const ir_node *n) { - if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) { - ir_node *start = get_Proj_pred(n); - if (is_Start(start)) { - return get_glob_type(); - } - } - return NULL; -} - /* Test whether arbitrary node is tls pointer, i.e. Proj(pn_Start_P_tls) * from Start. If so returns tls type, else Null. */ ir_type *is_tls_pointer(const ir_node *n) { - if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_globals)) { + if (is_Proj(n) && (get_Proj_proj(n) == pn_Start_P_tls)) { ir_node *start = get_Proj_pred(n); if (is_Start(start)) { return get_tls_type(); @@ -1099,13 +1100,13 @@ set_Const_type(ir_node *node, ir_type *tp) { symconst_kind get_SymConst_kind(const ir_node *node) { assert(node->op == op_SymConst); - return node->attr.symc.num; + return node->attr.symc.kind; } void -set_SymConst_kind(ir_node *node, symconst_kind num) { +set_SymConst_kind(ir_node *node, symconst_kind kind) { assert(node->op == op_SymConst); - node->attr.symc.num = num; + node->attr.symc.kind = kind; } ir_type * @@ -2591,6 +2592,11 @@ int return _is_Minus(node); } +int +(is_Abs)(const ir_node *node) { + return _is_Abs(node); +} + int (is_Mod)(const ir_node *node) { return _is_Mod(node); @@ -3066,7 +3072,40 @@ dbg_info *(get_irn_dbg_info)(const ir_node *n) { return _get_irn_dbg_info(n); } +#if 0 /* allow the global pointer */ +/* checks whether a node represents a global address */ +int is_Global(const ir_node *node) { + ir_node *ptr; + + if (is_SymConst_addr_ent(node)) + return 1; + if (! is_Sel(node)) + return 0; + + ptr = get_Sel_ptr(node); + return is_globals_pointer(ptr) != NULL; +} + +/* returns the entity of a global address */ +ir_entity *get_Global_entity(const ir_node *node) { + if (is_SymConst(node)) + return get_SymConst_entity(node); + else + return get_Sel_entity(node); +} +#else + +/* checks whether a node represents a global address */ +int is_Global(const ir_node *node) { + return is_SymConst_addr_ent(node); +} + +/* returns the entity of a global address */ +ir_entity *get_Global_entity(const ir_node *node) { + return get_SymConst_entity(node); +} +#endif #ifdef DEBUG_libfirm void dump_irn(const ir_node *n) {