rewrite: add functions to add new args to ops

This commit is contained in:
2026-03-16 11:55:28 +00:00
parent 06101b6316
commit 81fde5d43b
2 changed files with 57 additions and 1 deletions

View File

@@ -9,6 +9,7 @@
struct mie_op; struct mie_op;
struct mie_ctx; struct mie_ctx;
struct mie_type;
struct mie_region; struct mie_region;
struct mie_register; struct mie_register;
struct mie_op_successor; struct mie_op_successor;
@@ -41,6 +42,9 @@ MIE_API struct mie_block *mie_rewriter_split_block(
const char *name); const char *name);
MIE_API struct mie_block *mie_rewriter_create_block( MIE_API struct mie_block *mie_rewriter_create_block(
struct mie_rewriter *rw, struct mie_block *insert_before, const char *name); 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( MIE_API enum mie_status mie_rewriter_move_block_to_start(
struct mie_rewriter *rw, struct mie_block *block, 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( 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_rewriter *rw, struct mie_op *op, struct mie_block *dest,
struct mie_register **args, size_t nr_args); 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( MIE_API enum mie_status mie_rewriter_erase_op(
struct mie_rewriter *rw, struct mie_op *op); struct mie_rewriter *rw, struct mie_op *op);
MIE_API enum mie_status mie_rewriter_move_op_args_to_successor( MIE_API enum mie_status mie_rewriter_move_op_args_to_successor(

View File

@@ -41,6 +41,7 @@ struct mie_block *mie_rewriter_set_insertion_block(
struct mie_rewriter *rw, struct mie_block *block) struct mie_rewriter *rw, struct mie_block *block)
{ {
rw->r_insert_block = block; rw->r_insert_block = block;
rw->r_insert_point = NULL;
return block; return block;
} }
@@ -109,7 +110,28 @@ struct mie_block *mie_rewriter_split_block(
struct mie_block *mie_rewriter_create_block( struct mie_block *mie_rewriter_create_block(
struct mie_rewriter *rw, struct mie_block *insert_before, const char *name) struct mie_rewriter *rw, struct mie_block *insert_before, const char *name)
{ {
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->reg_name, name) != MIE_SUCCESS) {
return NULL; 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( enum mie_status mie_rewriter_move_block_to_start(
@@ -410,6 +432,31 @@ struct mie_op *mie_rewriter_replace_op(
return 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_op_successor *mie_rewriter_add_op_successor(
struct mie_rewriter *rw, struct mie_op *op, struct mie_block *dest, struct mie_rewriter *rw, struct mie_op *op, struct mie_block *dest,
struct mie_register **args, size_t nr_args) struct mie_register **args, size_t nr_args)