From 7d30e8f3ff1e8a8e9afd0d4f9c56fee09b1c056b Mon Sep 17 00:00:00 2001 From: Max Wash Date: Sun, 25 Jan 2026 14:51:34 +0000 Subject: [PATCH] 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. --- mie/include/mie/ir/emit.h | 42 +++++++++++++++++++++++++++++++++++++++ mie/ir/emit.c | 42 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 mie/include/mie/ir/emit.h create mode 100644 mie/ir/emit.c 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; +}