mie: ir: op: add function to add op arguments

This commit is contained in:
2026-01-21 14:15:02 +00:00
parent 937dc57c4e
commit 72de4ce845
2 changed files with 62 additions and 0 deletions

View File

@@ -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(

View File

@@ -1,7 +1,39 @@
#include <assert.h>
#include <mie/ir/op-definition.h>
#include <mie/ir/op.h>
#include <mie/ir/region.h>
#include <stdlib.h>
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)
{