diff --git a/mie/include/mie/ir/emit.h b/mie/include/mie/ir/emit.h new file mode 100644 index 0000000..790149b --- /dev/null +++ b/mie/include/mie/ir/emit.h @@ -0,0 +1,42 @@ +#ifndef MIE_IR_EMIT_H_ +#define MIE_IR_EMIT_H_ + +#include +#include +#include + +#define MIE_EMITTER(p) ((struct mie_emitter *)(p)) + +struct mie_op; +struct mie_name; +struct mie_block; +struct mie_register; + +struct mie_emitter; + +typedef struct mie_ctx *(*mie_emit_get_ctx)(const struct mie_emitter *); +typedef enum mie_status (*mie_emit_put_name)( + struct mie_emitter *, struct mie_name *, const char *); +typedef struct mie_op *(*mie_emit_put_op)( + struct mie_emitter *, const char *, const char *, + struct mie_register **, size_t); +typedef struct mie_block *(*mie_emit_put_block)( + struct mie_emitter *, struct mie_block *); + +struct mie_emitter { + mie_emit_get_ctx e_get_ctx; + mie_emit_put_name e_put_name; + mie_emit_put_op e_put_op; + mie_emit_put_block e_put_block; +}; + +MIE_API struct mie_ctx *mie_emitter_get_ctx(struct mie_emitter *emitter); +MIE_API enum mie_status mie_emitter_put_name( + struct mie_emitter *emitter, struct mie_name *name, const char *hint); +MIE_API struct mie_op *mie_emitter_put_op( + struct mie_emitter *emitter, const char *dialect_name, + const char *op_name, struct mie_register **args, size_t nr_args); +MIE_API struct mie_block *mie_emitter_put_block( + struct mie_emitter *emitter, struct mie_block *insert_point); + +#endif diff --git a/mie/ir/emit.c b/mie/ir/emit.c new file mode 100644 index 0000000..bfb43a9 --- /dev/null +++ b/mie/ir/emit.c @@ -0,0 +1,42 @@ +#include + +struct mie_ctx *mie_emitter_get_ctx(struct mie_emitter *emitter) +{ + if (emitter->e_get_ctx) { + return emitter->e_get_ctx(emitter); + } + + return NULL; +} + +enum mie_status mie_emitter_put_name( + struct mie_emitter *emitter, struct mie_name *name, const char *hint) +{ + if (emitter->e_put_name) { + return emitter->e_put_name(emitter, name, hint); + } + + return MIE_ERR_NOT_SUPPORTED; +} + +struct mie_op *mie_emitter_put_op( + struct mie_emitter *emitter, const char *dialect_name, + const char *op_name, struct mie_register **args, size_t nr_args) +{ + if (emitter->e_put_op) { + return emitter->e_put_op( + emitter, dialect_name, op_name, args, nr_args); + } + + return NULL; +} + +struct mie_block *mie_emitter_put_block( + struct mie_emitter *emitter, struct mie_block *insert_point) +{ + if (emitter->e_put_block) { + return emitter->e_put_block(emitter, insert_point); + } + + return NULL; +}