From 72de4ce8450111740f1b1a569914e07ffe6ed079 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Wed, 21 Jan 2026 14:15:02 +0000 Subject: [PATCH] mie: ir: op: add function to add op arguments --- mie/include/mie/ir/op.h | 5 ++++ mie/ir/op.c | 57 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/mie/include/mie/ir/op.h b/mie/include/mie/ir/op.h index 4bc1402..c9b63f0 100644 --- a/mie/include/mie/ir/op.h +++ b/mie/include/mie/ir/op.h @@ -72,6 +72,11 @@ MIE_API void mie_op_destroy(struct mie_op *op); MIE_API void mie_op_init(struct mie_op *op); MIE_API void mie_op_cleanup(struct mie_op *op); +MIE_API struct mie_op_arg *mie_op_add_arg(struct mie_op *op); +MIE_API struct mie_register *mie_op_add_result( + struct mie_op *op, const struct mie_type *ty); +MIE_API struct mie_region *mie_op_add_region(struct mie_op *op); + MIE_API bool mie_op_has_trait( const struct mie_op *op, const char *dialect_name, const char *trait_name); MIE_API bool mie_op_has_interface( diff --git a/mie/ir/op.c b/mie/ir/op.c index f50f8b5..7a3b239 100644 --- a/mie/ir/op.c +++ b/mie/ir/op.c @@ -1,7 +1,39 @@ +#include #include #include +#include #include +static enum mie_status op_arg_cleanup(void *p) +{ + struct mie_op_arg *arg = p; + + if (arg->arg_flags & MIE_OP_F_ARG_RESOLVED) { + b_queue_delete( + &arg->arg_value.u_reg->reg_use, &arg->arg_value.u_entry); + } + + return MIE_SUCCESS; +} + +static enum mie_status op_arg_move(void *dst, void *src, size_t itemsz) +{ + assert(itemsz == sizeof(struct mie_op_arg)); + struct mie_op_arg *dest_arg = dst, *src_arg = src; + memmove(dest_arg, src_arg, sizeof *src_arg); + + if (src_arg->arg_flags & MIE_OP_F_ARG_RESOLVED) { + mie_register_use_move(&dest_arg->arg_value, &src_arg->arg_value); + } + + return MIE_SUCCESS; +} + +struct mie_vector_ops op_arg_vector_ops = { + .v_destroy = op_arg_cleanup, + .v_move = op_arg_move, +}; + struct mie_op *mie_op_create(void) { struct mie_op *out = malloc(sizeof *out); @@ -32,6 +64,31 @@ void mie_op_cleanup(struct mie_op *op) /* TODO */ } +struct mie_op_arg *mie_op_add_arg(struct mie_op *op) +{ + return mie_vector_emplace_back(op->op_args, &op_arg_vector_ops); +} + +struct mie_register *mie_op_add_result(struct mie_op *op, const struct mie_type *ty) +{ + struct mie_register *result = mie_vector_emplace_back( + op->op_result, &mie_register_vector_ops); + result->reg_flags = MIE_REGISTER_F_VIRTUAL | MIE_REGISTER_F_OP_RESULT; + result->reg_type = ty; + result->reg_op = op; + + return result; +} + +struct mie_region *mie_op_add_region(struct mie_op *op) +{ + struct mie_region *region = mie_vector_emplace_back(op->op_regions, NULL); + region->r_names = mie_name_map_create(NULL); + region->r_parent = op; + + return region; +} + bool mie_op_has_trait( const struct mie_op *op, const char *dialect_name, const char *trait_name) {