/* 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)
* 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;
#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
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 *
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
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) {
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);
}
set_irn_n(node, -1, block);
}
+/* this works for all except Block */
+ir_node *
+get_nodes_MacroBlock(const ir_node *node) {
+ assert(node->op != op_Block);
+ return get_Block_MacroBlock(get_irn_n(node, -1));
+}
+
/* Test whether arbitrary node is frame pointer, i.e. Proj(pn_Start_P_frame_base)
* from Start. If so returns frame type, else Null. */
ir_type *is_frame_pointer(ir_node *n) {
node->attr.block.graph_arr[pos+1] = value;
}
+#ifdef INTERPROCEDURAL_VIEW
void set_Block_cg_cfgpred_arr(ir_node *node, int arity, ir_node *in[]) {
assert(node->op == op_Block);
if (node->attr.block.in_cg == NULL || arity != ARR_LEN(node->attr.block.in_cg) - 1) {
assert(node->op == op_Block);
node->attr.block.in_cg = NULL;
}
+#endif
ir_node *(set_Block_dead)(ir_node *block) {
return _set_Block_dead(block);
/* returns the macro block header of a block. */
ir_node *get_Block_MacroBlock(const ir_node *block) {
+ ir_node *mbh;
assert(is_Block(block));
- return get_irn_n(block, -1);
+ mbh = get_irn_n(block, -1);
+ /* once macro block header is respected by all optimizations,
+ this assert can be removed */
+ assert(mbh != NULL);
+ return mbh;
}
/* returns the graph of a Block. */
return block->attr.block.irg;
}
+int has_Block_label(const ir_node *block) {
+ assert(is_Block(block));
+ return block->attr.block.has_label;
+}
+
+ir_label_t get_Block_label(const ir_node *block) {
+ assert(is_Block(block));
+ return block->attr.block.label;
+}
+
+void set_Block_label(ir_node *block, ir_label_t label) {
+ assert(is_Block(block));
+ block->attr.block.has_label = 1;
+ block->attr.block.label = label;
+}
+
int
get_End_n_keepalives(ir_node *end) {
assert(end->op == op_End);
node->attr.con.tv = con;
}
-cnst_classify_t (classify_Const)(ir_node *node) {
- return _classify_Const(node);
+int (is_Const_null)(const ir_node *node) {
+ return _is_Const_null(node);
+}
+
+int (is_Const_one)(const ir_node *node) {
+ return _is_Const_one(node);
+}
+
+int (is_Const_all_one)(const ir_node *node) {
+ return _is_Const_all_one(node);
}
node->attr.symc.sym = sym;
}
+ir_label_t get_SymConst_label(const ir_node *node) {
+ assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
+ return node->attr.symc.sym.label;
+}
+
+void set_SymConst_label(ir_node *node, ir_label_t label) {
+ assert(node->op == op_SymConst && SYMCONST_HAS_LABEL(get_SymConst_kind(node)));
+ node->attr.symc.sym.label = label;
+}
+
ir_type *
get_SymConst_value_type(ir_node *node) {
assert(node->op == op_SymConst);
BINOP(Sub)
UNOP(Minus)
BINOP(Mul)
+BINOP(Mulh)
DIVOP(Quot)
DIVOP(DivMod)
DIVOP(Div)
node->attr.load.volatility = volatility;
}
+ir_align
+get_Load_align(ir_node *node) {
+ assert(node->op == op_Load);
+ return node->attr.load.aligned;
+}
+
+void
+set_Load_align(ir_node *node, ir_align align) {
+ assert(node->op == op_Load);
+ node->attr.load.aligned = align;
+}
+
ir_node *
get_Store_mem(ir_node *node) {
node->attr.store.volatility = volatility;
}
+ir_align
+get_Store_align(ir_node *node) {
+ assert(node->op == op_Store);
+ return node->attr.store.aligned;
+}
+
+void
+set_Store_align(ir_node *node, ir_align align) {
+ assert(node->op == op_Store);
+ node->attr.store.aligned = align;
+}
+
ir_node *
get_Alloc_mem(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_Shl)(const ir_node *node) {
+ return _is_Shl(node);
+}
+
+int
+(is_Shr)(const ir_node *node) {
+ return _is_Shr(node);
+}
+
+int
+(is_Shrs)(const ir_node *node) {
+ return _is_Shrs(node);
+}
+
+int
+(is_Rot)(const ir_node *node) {
+ return _is_Rot(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);
return _is_Conv(node);
}
+int
+(is_Cast)(const ir_node *node) {
+ return _is_Cast(node);
+}
+
int
(is_no_Block)(const ir_node *node) {
return _is_no_Block(node);
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);