mie: ir: add an emitter interface for emitting IR constructs

mie_emitter can be inherited from by any structure that supports
emitting IR constructs like Ops and Blocks. Dialect Op emitter
functions can wrap mie_emitter to simplify emitting specific Ops,
and these functions can then be used with any struct that inherits
from mie_emitter.
This commit is contained in:
2026-01-25 14:51:34 +00:00
parent e9d2c0fbc7
commit 7d30e8f3ff
2 changed files with 84 additions and 0 deletions

42
mie/include/mie/ir/emit.h Normal file
View File

@@ -0,0 +1,42 @@
#ifndef MIE_IR_EMIT_H_
#define MIE_IR_EMIT_H_
#include <mie/misc.h>
#include <mie/status.h>
#include <stddef.h>
#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

42
mie/ir/emit.c Normal file
View File

@@ -0,0 +1,42 @@
#include <mie/ir/emit.h>
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;
}