diff --git a/mie/include/mie/rewrite/rewriter.h b/mie/include/mie/rewrite/rewriter.h index 1792b33..12a77e1 100644 --- a/mie/include/mie/rewrite/rewriter.h +++ b/mie/include/mie/rewrite/rewriter.h @@ -9,6 +9,7 @@ struct mie_op; struct mie_ctx; +struct mie_type; struct mie_region; struct mie_register; struct mie_op_successor; @@ -41,6 +42,9 @@ MIE_API struct mie_block *mie_rewriter_split_block( const char *name); MIE_API struct mie_block *mie_rewriter_create_block( struct mie_rewriter *rw, struct mie_block *insert_before, const char *name); +MIE_API struct mie_register *mie_rewriter_add_block_parameter( + struct mie_rewriter *rw, struct mie_block *block, const char *name, + const struct mie_type *type); MIE_API enum mie_status mie_rewriter_move_block_to_start( struct mie_rewriter *rw, struct mie_block *block, @@ -91,6 +95,11 @@ MIE_API struct mie_op *mie_rewriter_replace_op( MIE_API struct mie_op_successor *mie_rewriter_add_op_successor( struct mie_rewriter *rw, struct mie_op *op, struct mie_block *dest, struct mie_register **args, size_t nr_args); +MIE_API struct mie_op_arg *mie_rewriter_add_op_successor_arg( + struct mie_rewriter *rw, struct mie_op *op, struct mie_op_successor *s, + struct mie_register *reg); +MIE_API struct mie_op_arg *mie_rewriter_add_op_arg( + struct mie_rewriter *rw, struct mie_op *op, struct mie_register *reg); MIE_API enum mie_status mie_rewriter_erase_op( struct mie_rewriter *rw, struct mie_op *op); MIE_API enum mie_status mie_rewriter_move_op_args_to_successor( diff --git a/mie/rewrite/rewriter.c b/mie/rewrite/rewriter.c index b5a7730..b6afc60 100644 --- a/mie/rewrite/rewriter.c +++ b/mie/rewrite/rewriter.c @@ -41,6 +41,7 @@ struct mie_block *mie_rewriter_set_insertion_block( struct mie_rewriter *rw, struct mie_block *block) { rw->r_insert_block = block; + rw->r_insert_point = NULL; return block; } @@ -109,7 +110,28 @@ struct mie_block *mie_rewriter_split_block( struct mie_block *mie_rewriter_create_block( struct mie_rewriter *rw, struct mie_block *insert_before, const char *name) { - return NULL; + struct mie_region *parent = insert_before->b_parent; + struct mie_block *block + = mie_region_add_block_before(parent, insert_before); + mie_rewriter_put_name(rw, &block->b_name, name); + return block; +} + +struct mie_register *mie_rewriter_add_block_parameter( + struct mie_rewriter *rw, struct mie_block *block, const char *name, + const struct mie_type *type) +{ + struct mie_register *reg = mie_block_add_param(block); + + if (mie_rewriter_put_name(rw, ®->reg_name, name) != MIE_SUCCESS) { + return NULL; + } + + reg->reg_flags = MIE_REGISTER_F_VIRTUAL | MIE_REGISTER_F_BLOCK_PARAM; + reg->reg_block = block; + reg->reg_type = type; + + return reg; } enum mie_status mie_rewriter_move_block_to_start( @@ -410,6 +432,31 @@ struct mie_op *mie_rewriter_replace_op( return op; } +struct mie_op_arg *mie_rewriter_add_op_arg( + struct mie_rewriter *rw, struct mie_op *op, struct mie_register *value) +{ + struct mie_op_arg *arg = mie_op_add_arg(op); + arg->arg_flags = MIE_OP_F_ARG_RESOLVED; + arg->arg_value.u_reg = value; + arg->arg_value.u_user = op; + b_queue_push_back(&value->reg_use, &arg->arg_value.u_entry); + + return arg; +} + +MIE_API struct mie_op_arg *mie_rewriter_add_op_successor_arg( + struct mie_rewriter *rw, struct mie_op *op, struct mie_op_successor *s, + struct mie_register *value) +{ + struct mie_op_arg *arg = mie_vector_emplace_back(s->s_args, NULL); + arg->arg_flags = MIE_OP_F_ARG_RESOLVED; + arg->arg_value.u_reg = value; + arg->arg_value.u_user = op; + b_queue_push_back(&value->reg_use, &arg->arg_value.u_entry); + + return arg; +} + struct mie_op_successor *mie_rewriter_add_op_successor( struct mie_rewriter *rw, struct mie_op *op, struct mie_block *dest, struct mie_register **args, size_t nr_args)