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:
42
mie/include/mie/ir/emit.h
Normal file
42
mie/include/mie/ir/emit.h
Normal 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
42
mie/ir/emit.c
Normal 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user