From ac7860b6bd013edd8a6a561fa70b15a53328812b Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 23 Jan 2026 23:21:42 +0000 Subject: [PATCH] mie: ir: rewrite: add pattern and rewriter interface --- mie/include/mie/ir/rewrite.h | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/mie/include/mie/ir/rewrite.h b/mie/include/mie/ir/rewrite.h index 0997f63..a9dd5e6 100644 --- a/mie/include/mie/ir/rewrite.h +++ b/mie/include/mie/ir/rewrite.h @@ -1,6 +1,60 @@ #ifndef MIE_IR_REWRITE_H_ #define MIE_IR_REWRITE_H_ +#include +#include +#include + +struct mie_op; +struct mie_ctx; struct mie_rewriter; +struct mie_register; + +#define MIE_REWRITE_RESULT(result, status) \ + ((struct mie_rewrite_result) {.r_result = (result), .r_status = (status)}) + +enum mie_match_result { + MIE_NO_MATCH_FOUND = 0, + MIE_MATCH_FOUND, +}; + +struct mie_rewrite_result { + enum { + MIE_REWRITE_SUCCESS = 0, + MIE_REWRITE_IGNORE, + MIE_REWRITE_FAILURE, + } r_result; + enum mie_status r_status; +}; + +struct mie_rewrite_pattern { + struct { + const char *t_dialect_name, *t_op_name; + const struct mie_op_definition *t_op; + } p_root; + + enum mie_match_result (*p_match)(const struct mie_op *); + struct mie_rewrite_result (*p_rewrite)( + struct mie_op *, struct mie_rewriter *); +}; + +MIE_API struct mie_rewriter *mie_rewriter_create(struct mie_ctx *ctx); + +MIE_API struct mie_block *mie_rewriter_get_insertion_block( + struct mie_rewriter *rewriter); +MIE_API struct mie_op *mie_rewriter_get_insertion_point( + struct mie_rewriter *rewriter); + +MIE_API struct mie_block *mie_rewriter_split_block( + struct mie_rewriter *rewriter, struct mie_block *block, + struct mie_op *before); +MIE_API struct mie_block *mie_rewriter_create_block( + struct mie_rewriter *rewriter, struct mie_block *insert_before); + +MIE_API struct mie_op *mie_rewriter_put_op( + struct mie_rewriter *rewriter, const char *dialect, const char *op, + struct mie_register **args, size_t nr_args); +MIE_API enum mie_status mie_rewriter_erase_op( + struct mie_rewriter *rewriter, struct mie_op *op); #endif