mie: ir: op: add function to add op arguments
This commit is contained in:
@@ -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(
|
||||
|
||||
57
mie/ir/op.c
57
mie/ir/op.c
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user