diff --git a/mie/ctx.c b/mie/ctx.c index 91b9e84..7204bda 100644 --- a/mie/ctx.c +++ b/mie/ctx.c @@ -88,7 +88,6 @@ struct mie_op *mie_ctx_create_op( out->op_flags |= MIE_OP_F_OP_RESOLVED; out->op_info = def; - out->op_dialect = def->op_parent; return out; } @@ -129,7 +128,6 @@ bool mie_ctx_resolve_op(const struct mie_ctx *ctx, struct mie_op *op) return false; } - op->op_dialect = dialect; op->op_info = op_info; free(op->op_name); diff --git a/mie/include/mie/ir/op.h b/mie/include/mie/ir/op.h index 52b1a11..963c757 100644 --- a/mie/include/mie/ir/op.h +++ b/mie/include/mie/ir/op.h @@ -76,6 +76,8 @@ MIE_API void mie_op_destroy(struct mie_op *op); MIE_API void mie_op_init(struct mie_op *op); MIE_API void mie_op_cleanup(struct mie_op *op); +MIE_API size_t mie_op_get_name(const struct mie_op *op, char *out, size_t max); + MIE_API struct mie_op_arg *mie_op_add_arg(struct mie_op *op); MIE_API struct mie_register *mie_op_add_result( struct mie_op *op, const struct mie_type *ty); diff --git a/mie/ir/builder.c b/mie/ir/builder.c index 9dde8a7..8b4aae4 100644 --- a/mie/ir/builder.c +++ b/mie/ir/builder.c @@ -145,7 +145,6 @@ struct mie_op *mie_builder_put_op( struct mie_op *op = mie_block_add_op(block); op->op_flags = MIE_OP_F_OP_RESOLVED; op->op_info = op_def; - op->op_dialect = op_def->op_parent; for (size_t i = 0; i < nr_args; i++) { struct mie_op_arg *arg = mie_op_add_arg(op); diff --git a/mie/ir/op.c b/mie/ir/op.c index 88dd13b..5fe4b6e 100644 --- a/mie/ir/op.c +++ b/mie/ir/op.c @@ -66,6 +66,17 @@ void mie_op_cleanup(struct mie_op *op) /* TODO */ } +size_t mie_op_get_name(const struct mie_op *op, char *out, size_t max) +{ + if (!(op->op_flags & MIE_OP_F_OP_RESOLVED)) { + return snprintf(out, max, "%s", op->op_name); + } + + return snprintf( + out, max, "%s.%s", op->op_info->op_parent->d_name, + op->op_info->op_name); +} + struct mie_op_arg *mie_op_add_arg(struct mie_op *op) { return mie_vector_emplace_back(op->op_args, &op_arg_vector_ops); @@ -139,11 +150,11 @@ struct mie_region *mie_op_add_region(struct mie_op *op) bool mie_op_is(const struct mie_op *op, const char *dialect_name, const char *op_name) { - if (!op->op_info || !op->op_dialect) { + if (!op->op_info || !op->op_info->op_parent) { return false; } - if (strcmp(op->op_dialect->d_name, dialect_name) != 0) { + if (strcmp(op->op_info->op_parent->d_name, dialect_name) != 0) { return false; } diff --git a/mie/ir/walk.c b/mie/ir/walk.c index 6b931ae..e128f62 100644 --- a/mie/ir/walk.c +++ b/mie/ir/walk.c @@ -326,7 +326,8 @@ static void print_stack(struct mie_walker *walker) case MIE_WALK_ITEM_OP: printf("* %zu: op %p", item->i_depth, item->i_op); if (item->i_op->op_flags & MIE_OP_F_OP_RESOLVED) { - printf(" %s.%s", item->i_op->op_dialect->d_name, + printf(" %s.%s", + item->i_op->op_info->op_parent->d_name, item->i_op->op_info->op_name); } else { printf(" %s", item->i_op->op_name); diff --git a/mie/pass/builtin/convert-scf-to-cf.c b/mie/pass/builtin/convert-scf-to-cf.c index 27750e9..b00075f 100644 --- a/mie/pass/builtin/convert-scf-to-cf.c +++ b/mie/pass/builtin/convert-scf-to-cf.c @@ -31,7 +31,7 @@ static enum mie_match_result if_match(const struct mie_op *op) static struct mie_rewrite_result if_rewrite( struct mie_op *op, struct mie_rewriter *rewriter) { - printf("if: rewriting %p %s.%s\n", op, op->op_dialect->d_name, + printf("if: rewriting %p %s.%s\n", op, op->op_info->op_parent->d_name, op->op_info->op_name); struct mie_register *cond = mie_op_get_arg(op, 0); @@ -111,7 +111,7 @@ static struct mie_pass_result transform( struct mie_pass *pass, struct mie_op *op, struct mie_pass_args *args) { printf("%s: taking a look at %p %s.%s\n", mie_pass_get_name(pass), op, - op->op_dialect->d_name, op->op_info->op_name); + op->op_info->op_parent->d_name, op->op_info->op_name); struct mie_convert_config *cfg = mie_convert_config_create(args->p_ctx); mie_convert_config_add_illegal_op(cfg, "scf", "if"); diff --git a/mie/pass/pass-manager.c b/mie/pass/pass-manager.c index 3c038a3..9e9458b 100644 --- a/mie/pass/pass-manager.c +++ b/mie/pass/pass-manager.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -153,7 +154,7 @@ static bool filter_check_op( return false; } - if (filter->f_dialect && op->op_dialect != filter->f_dialect) { + if (filter->f_dialect && op->op_info->op_parent != filter->f_dialect) { return false; } diff --git a/mie/print/op.c b/mie/print/op.c index 4beb9eb..f4b19b2 100644 --- a/mie/print/op.c +++ b/mie/print/op.c @@ -207,7 +207,7 @@ static void print_generic_op(struct mie_printer *printer, const struct mie_op *o if (op->op_flags & MIE_OP_F_OP_RESOLVED) { b_stream_write_fmt( printer->p_stream, NULL, "%s.%s", - op->op_dialect->d_name, op->op_info->op_name); + op->op_info->op_parent->d_name, op->op_info->op_name); } else { b_stream_write_string(printer->p_stream, op->op_name, NULL); } @@ -275,7 +275,7 @@ void mie_printer_print_op_name(struct mie_printer *printer, const struct mie_op if (printer->p_flags & MIE_PRINT_F_GENERIC) { generic = true; b_stream_write_char(printer->p_stream, '~'); - } else if (!strcmp(op->op_dialect->d_name, "builtin")) { + } else if (!strcmp(op->op_info->op_parent->d_name, "builtin")) { builtin = true; } @@ -286,7 +286,8 @@ void mie_printer_print_op_name(struct mie_printer *printer, const struct mie_op if (generic || !builtin || !abbreviate) { b_stream_write_fmt( - printer->p_stream, NULL, "%s.", op->op_dialect->d_name); + printer->p_stream, NULL, "%s.", + op->op_info->op_parent->d_name); } b_stream_write_string(printer->p_stream, op->op_info->op_name, NULL); diff --git a/mie/rewrite/rewriter.c b/mie/rewrite/rewriter.c index 8030a80..b5a7730 100644 --- a/mie/rewrite/rewriter.c +++ b/mie/rewrite/rewriter.c @@ -382,7 +382,6 @@ struct mie_op *mie_rewriter_put_op( op->op_flags = MIE_OP_F_OP_RESOLVED; op->op_info = op_def; - op->op_dialect = op_def->op_parent; for (size_t i = 0; i < nr_args; i++) { struct mie_op_arg *arg = mie_op_add_arg(op); @@ -407,7 +406,6 @@ struct mie_op *mie_rewriter_replace_op( } op->op_info = op_def; - op->op_dialect = op_def->op_parent; return op; }