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_init(struct mie_op *op);
|
||||||
MIE_API void mie_op_cleanup(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(
|
MIE_API bool mie_op_has_trait(
|
||||||
const struct mie_op *op, const char *dialect_name, const char *trait_name);
|
const struct mie_op *op, const char *dialect_name, const char *trait_name);
|
||||||
MIE_API bool mie_op_has_interface(
|
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-definition.h>
|
||||||
#include <mie/ir/op.h>
|
#include <mie/ir/op.h>
|
||||||
|
#include <mie/ir/region.h>
|
||||||
#include <stdlib.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 *mie_op_create(void)
|
||||||
{
|
{
|
||||||
struct mie_op *out = malloc(sizeof *out);
|
struct mie_op *out = malloc(sizeof *out);
|
||||||
@@ -32,6 +64,31 @@ void mie_op_cleanup(struct mie_op *op)
|
|||||||
/* TODO */
|
/* 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(
|
bool mie_op_has_trait(
|
||||||
const struct mie_op *op, const char *dialect_name, const char *trait_name)
|
const struct mie_op *op, const char *dialect_name, const char *trait_name)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user