mie: implement support for custom op print formats

This commit is contained in:
2026-01-15 14:20:13 +00:00
parent 3c4af9c26e
commit 65905bc55b
31 changed files with 442 additions and 64 deletions

View File

@@ -25,3 +25,15 @@ struct mie_attribute_definition *mie_attribute_definition_create(
return out; return out;
} }
bool mie_attribute_definition_check_name(
const struct mie_attribute_definition *def, const char *dialect_name,
const char *attrib_name)
{
if (!def || !def->a_parent) {
return false;
}
return (!strcmp(def->a_name, attrib_name)
&& !strcmp(def->a_parent->d_name, dialect_name));
}

View File

@@ -0,0 +1,14 @@
#include <mie/attribute/attribute-definition.h>
#include <mie/attribute/attribute.h>
bool mie_attribute_check_name(
const struct mie_attribute *attrib, const char *dialect_name,
const char *attrib_name)
{
if (!attrib || !attrib->a_def) {
return false;
}
return mie_attribute_definition_check_name(
attrib->a_def, dialect_name, attrib_name);
}

View File

@@ -1,9 +1,15 @@
#include <mie/dialect/dialect.h> #include <mie/dialect/dialect.h>
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/ir/op.h>
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/print/printer.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
const struct mie_attribute *sym_name
= mie_attribute_map_get(&op->op_attrib, "sym_name");
b_stream_write_fmt(printer->p_stream, NULL, " @%s", NULL);
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -0,0 +1,103 @@
#include <mie/attribute/attribute-definition.h>
#include <mie/attribute/attribute.h>
#include <mie/ctx.h>
#include <mie/dialect/builtin.h>
#include <mie/dialect/dialect.h>
#include <mie/macros.h>
#include <mie/parse/parser.h>
#include <mie/print/printer.h>
static enum mie_status print(
const struct mie_attribute *value, struct mie_printer *out)
{
const struct mie_array *array = (const struct mie_array *)value;
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) {
b_stream_write_string(out->p_stream, "#builtin.array<", NULL);
}
b_stream_write_char(out->p_stream, '[');
for (size_t i = 0; i < MIE_VECTOR_COUNT(array->a_items); i++) {
if (i > 0) {
b_stream_write_char(out->p_stream, ',');
}
b_stream_write_char(out->p_stream, ' ');
mie_printer_print_attribute(out, array->a_items.items[i]);
}
if (MIE_VECTOR_COUNT(array->a_items) != 0) {
b_stream_write_char(out->p_stream, ' ');
}
b_stream_write_char(out->p_stream, ']');
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) {
b_stream_write_char(out->p_stream, '>');
}
return MIE_SUCCESS;
}
static struct mie_array *array_create(struct mie_ctx *ctx)
{
struct mie_array *array = malloc(sizeof *array);
if (!array) {
return NULL;
}
memset(array, 0x0, sizeof *array);
array->a_base.a_def
= mie_ctx_get_attribute_definition(ctx, "builtin", "array");
return array;
}
static enum mie_status parse(
struct mie_parser *ctx, const struct mie_attribute **out)
{
if (!mie_parser_parse_symbol(ctx, MIE_SYM_LEFT_BRACKET)) {
return MIE_ERR_BAD_SYNTAX;
}
struct mie_array *array = array_create(mie_parser_get_mie_ctx(ctx));
if (!array) {
return MIE_ERR_NO_MEMORY;
}
const struct mie_attribute *item = NULL;
if (!mie_parser_parse_attribute(ctx, &item)) {
free(array);
return MIE_ERR_BAD_FORMAT;
}
mie_vector_push_back(array->a_items, &item);
while (1) {
if (mie_parser_parse_symbol(ctx, MIE_SYM_RIGHT_BRACKET)) {
break;
}
if (!mie_parser_parse_symbol(ctx, MIE_SYM_COMMA)) {
return false;
}
if (!mie_parser_parse_attribute(ctx, &item)) {
free(array);
return MIE_ERR_BAD_FORMAT;
}
mie_vector_push_back(array->a_items, &item);
}
*out = (struct mie_attribute *)array;
return MIE_SUCCESS;
}
MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_array, "array")
MIE_ATTRIBUTE_DEFINITION_STRUCT(struct mie_array);
MIE_ATTRIBUTE_DEFINITION_PRINT(print);
MIE_ATTRIBUTE_DEFINITION_PARSE(parse);
MIE_ATTRIBUTE_DEFINITION_END()

View File

@@ -51,31 +51,31 @@ static enum mie_status parse(
struct mie_file_span span; struct mie_file_span span;
if (!mie_parser_parse_float(ctx, &value, &span)) { if (!mie_parser_parse_float(ctx, &value, &span)) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
if (!mie_parser_parse_symbol(ctx, MIE_SYM_COLON)) { if (!mie_parser_parse_symbol(ctx, MIE_SYM_COLON)) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
const struct mie_type *type = NULL; const struct mie_type *type = NULL;
if (!mie_parser_parse_type(ctx, &type)) { if (!mie_parser_parse_type(ctx, &type)) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
size_t width = mie_float_type_get_width(type); size_t width = mie_float_type_get_width(type);
if (width == (size_t)-1) { if (width == (size_t)-1) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
struct mie_attribute *v struct mie_attribute *v
= mie_ctx_get_float(mie_parser_get_mie_ctx(ctx), value, width); = mie_ctx_get_float(mie_parser_get_mie_ctx(ctx), value, width);
if (!v) { if (!v) {
return false; return MIE_ERR_NO_MEMORY;
} }
*out = v; *out = v;
return true; return MIE_SUCCESS;
} }
MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_float, "float") MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_float, "float")

View File

@@ -15,20 +15,25 @@ static enum mie_status print(
{ {
const struct mie_int *int_val = (const struct mie_int *)value; const struct mie_int *int_val = (const struct mie_int *)value;
const struct int_type *int_ty = (const struct int_type *)int_val->i_type; const struct int_type *int_ty = (const struct int_type *)int_val->i_type;
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) { bool abbrev = ((out->p_flags & MIE_PRINT_F_ABBREVIATED) != 0);
if (!abbrev) {
b_stream_write_string(out->p_stream, "#builtin.int<", NULL); b_stream_write_string(out->p_stream, "#builtin.int<", NULL);
} }
if (int_ty->i_width <= 64) { if (int_ty->i_width < 64 || !abbrev) {
b_stream_write_fmt( b_stream_write_fmt(
out->p_stream, NULL, "%zu : i%zu", out->p_stream, NULL, "%zu : i%zu",
int_val->i_val.v_small, int_ty->i_width); int_val->i_val.v_small, int_ty->i_width);
} else if (int_ty->i_width == 64 && abbrev) {
b_stream_write_fmt(
out->p_stream, NULL, "%zu", int_val->i_val.v_small);
} else { } else {
b_stream_write_fmt( b_stream_write_fmt(
out->p_stream, NULL, "INF : i%zu", int_ty->i_width); out->p_stream, NULL, "INF : i%zu", int_ty->i_width);
} }
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) { if (!abbrev) {
b_stream_write_string(out->p_stream, ">", NULL); b_stream_write_string(out->p_stream, ">", NULL);
} }
@@ -42,31 +47,32 @@ static enum mie_status parse(
struct mie_file_span span; struct mie_file_span span;
if (!mie_parser_parse_int(ctx, &value, &span)) { if (!mie_parser_parse_int(ctx, &value, &span)) {
return false; return MIE_ERR_BAD_SYNTAX;
}
if (!mie_parser_parse_symbol(ctx, MIE_SYM_COLON)) {
return false;
} }
const struct mie_type *type = NULL; const struct mie_type *type = NULL;
if (!mie_parser_parse_type(ctx, &type)) { size_t width = (size_t)-1;
if (!mie_parser_parse_symbol(ctx, MIE_SYM_COLON)) {
width = 64;
} else if (!mie_parser_parse_type(ctx, &type)) {
return false; return false;
} else {
width = mie_int_type_get_width(type);
} }
size_t width = mie_int_type_get_width(type);
if (width == (size_t)-1) { if (width == (size_t)-1) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
struct mie_attribute *v struct mie_attribute *v
= mie_ctx_get_int(mie_parser_get_mie_ctx(ctx), value, width); = mie_ctx_get_int(mie_parser_get_mie_ctx(ctx), value, width);
if (!v) { if (!v) {
return false; return MIE_ERR_NO_MEMORY;
} }
*out = v; *out = v;
return true; return MIE_SUCCESS;
} }
MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_int, "int") MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_int, "int")

View File

@@ -26,18 +26,28 @@ static enum mie_status parse(
b_string *str = mie_parser_get_tempstr(ctx); b_string *str = mie_parser_get_tempstr(ctx);
struct mie_file_span span; struct mie_file_span span;
if (!mie_parser_parse_string(ctx, str, &span)) { if (!mie_parser_parse_string(ctx, str, &span)) {
return false; return MIE_ERR_BAD_SYNTAX;
} }
struct mie_attribute *v = mie_ctx_get_string( struct mie_attribute *v = mie_ctx_get_string(
mie_parser_get_mie_ctx(ctx), b_string_ptr(str)); mie_parser_get_mie_ctx(ctx), b_string_ptr(str));
if (!v) { if (!v) {
return false; return MIE_ERR_NO_MEMORY;
} }
*out = v; *out = v;
return true; return MIE_SUCCESS;
}
const char *mie_string_get_cstr(const struct mie_attribute *attrib)
{
if (!mie_attribute_check_name(attrib, "builtin", "string")) {
return NULL;
}
const struct mie_string *str = (const struct mie_string *)attrib;
return str->str_val;
} }
MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_string, "string") MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_string, "string")

View File

@@ -0,0 +1,78 @@
#include <mie/attribute/attribute-definition.h>
#include <mie/attribute/attribute.h>
#include <mie/ctx.h>
#include <mie/dialect/builtin.h>
#include <mie/dialect/dialect.h>
#include <mie/macros.h>
#include <mie/parse/parser.h>
#include <mie/print/printer.h>
static enum mie_status print(
const struct mie_attribute *value, struct mie_printer *out)
{
const struct mie_type_attr *ty = (const struct mie_type_attr *)value;
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) {
b_stream_write_string(out->p_stream, "#builtin.type<", NULL);
}
mie_printer_print_type(out, ty->ty_value);
if (!(out->p_flags & MIE_PRINT_F_ABBREVIATED)) {
b_stream_write_char(out->p_stream, '>');
}
return MIE_SUCCESS;
}
static struct mie_type_attr *type_attr_create(struct mie_ctx *ctx)
{
struct mie_type_attr *ty = malloc(sizeof *ty);
if (!ty) {
return NULL;
}
memset(ty, 0x0, sizeof *ty);
ty->ty_base.a_def
= mie_ctx_get_attribute_definition(ctx, "builtin", "type");
return ty;
}
static enum mie_status parse(
struct mie_parser *ctx, const struct mie_attribute **out)
{
struct mie_type_attr *ty = type_attr_create(mie_parser_get_mie_ctx(ctx));
if (!ty) {
return MIE_ERR_NO_MEMORY;
}
const struct mie_type *type = NULL;
if (!mie_parser_parse_type(ctx, &type)) {
free(ty);
return MIE_ERR_BAD_FORMAT;
}
ty->ty_value = type;
*out = (struct mie_attribute *)ty;
return MIE_SUCCESS;
}
const struct mie_type *mie_type_attr_get_type(const struct mie_attribute *attrib)
{
if (!mie_attribute_check_name(attrib, "builtin", "type")) {
return NULL;
}
const struct mie_type_attr *ty = (const struct mie_type_attr *)attrib;
return ty->ty_value;
}
MIE_ATTRIBUTE_DEFINITION_BEGIN(mie_builtin_type, "type")
MIE_ATTRIBUTE_DEFINITION_STRUCT(struct mie_type_attr);
MIE_ATTRIBUTE_DEFINITION_PRINT(print);
MIE_ATTRIBUTE_DEFINITION_PARSE(parse);
MIE_ATTRIBUTE_DEFINITION_END()

View File

@@ -91,6 +91,8 @@ MIE_DIALECT_BEGIN(mie_builtin, struct builtin_dialect, "builtin")
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_string); MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_string);
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_int); MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_int);
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_float); MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_float);
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_array);
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_type);
MIE_DIALECT_ADD_TRAIT(mie_builtin_isolated_from_above); MIE_DIALECT_ADD_TRAIT(mie_builtin_isolated_from_above);
MIE_DIALECT_ADD_TRAIT(mie_builtin_symbol_table); MIE_DIALECT_ADD_TRAIT(mie_builtin_symbol_table);
MIE_DIALECT_ADD_INTERFACE(mie_builtin_symbol); MIE_DIALECT_ADD_INTERFACE(mie_builtin_symbol);

View File

@@ -15,6 +15,10 @@ static void type_init(
static enum mie_status print(const struct mie_type *ty, struct mie_printer *out) static enum mie_status print(const struct mie_type *ty, struct mie_printer *out)
{ {
b_stream_write_string(
out->p_stream,
(out->p_flags & MIE_PRINT_F_ABBREVIATED) ? "str" : "!builtin.string",
NULL);
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -1,13 +1,69 @@
#include <mie/attribute/attribute-map.h>
#include <mie/ctx.h> #include <mie/ctx.h>
#include <mie/dialect/builtin.h> #include <mie/dialect/builtin.h>
#include <mie/dialect/dialect.h> #include <mie/dialect/dialect.h>
#include <mie/interface/interface-definition.h> #include <mie/interface/interface-definition.h>
#include <mie/interface/interface.h> #include <mie/interface/interface.h>
#include <mie/ir/block.h>
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/ir/op.h>
#include <mie/ir/region.h>
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/print/printer.h>
#include <mie/type/function.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
const struct mie_attribute *sym_name
= mie_attribute_map_get(&op->op_attrib, "sym_name");
const struct mie_attribute *function_type_attr
= mie_attribute_map_get(&op->op_attrib, "function_type");
const char *sym_name_cstr = mie_string_get_cstr(sym_name);
const struct mie_type *function_type_g
= mie_type_attr_get_type(function_type_attr);
const struct mie_function_type *function_ty
= (const struct mie_function_type *)function_type_g;
b_stream_write_fmt(printer->p_stream, NULL, " @%s(", sym_name_cstr);
const struct mie_region *code = &op->op_regions.items[0];
const struct mie_block *entry = code->r_blocks.items[0];
for (size_t i = 0; i < MIE_VECTOR_COUNT(entry->b_params); i++) {
if (i > 0) {
b_stream_write_string(printer->p_stream, ", ", NULL);
}
const struct mie_register *param = entry->b_params.items[i];
mie_printer_print_register(printer, param, MIE_PRINT_F_INCLUDE_TYPE);
}
b_stream_write_string(printer->p_stream, ") -> ", NULL);
if (MIE_VECTOR_COUNT(function_ty->func_out) != 1) {
b_stream_write_char(printer->p_stream, '(');
}
for (size_t i = 0; i < MIE_VECTOR_COUNT(function_ty->func_out); i++) {
if (i > 0) {
b_stream_write_string(printer->p_stream, ", ", NULL);
}
const struct mie_type *ty = function_ty->func_out.items[i];
mie_printer_print_type(printer, ty);
}
if (MIE_VECTOR_COUNT(function_ty->func_out) != 1) {
b_stream_write_char(printer->p_stream, ')');
}
b_stream_write_char(printer->p_stream, ' ');
mie_printer_print_region(
printer, code, MIE_PRINT_F_EXCLUDE_FIRST_BLOCK_HEADER);
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -2,7 +2,7 @@
#include <mie/ir/op-definition.h> #include <mie/ir/op-definition.h>
#include <mie/macros.h> #include <mie/macros.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -4,7 +4,7 @@
#include <mie/macros.h> #include <mie/macros.h>
#include <mie/trait/trait.h> #include <mie/trait/trait.h>
static enum mie_status print(const struct mie_op *op, b_stream *out) static enum mie_status print(struct mie_printer *printer, const struct mie_op *op)
{ {
return MIE_SUCCESS; return MIE_SUCCESS;
} }

View File

@@ -26,4 +26,8 @@ struct mie_attribute_definition {
MIE_API struct mie_attribute_definition *mie_attribute_definition_create( MIE_API struct mie_attribute_definition *mie_attribute_definition_create(
struct mie_dialect *parent, const char *name); struct mie_dialect *parent, const char *name);
MIE_API bool mie_attribute_definition_check_name(
const struct mie_attribute_definition *def, const char *dialect_name,
const char *attrib_name);
#endif #endif

View File

@@ -1,10 +1,17 @@
#ifndef MIE_ATTRIBUTE_ATTRIBUTE_H_ #ifndef MIE_ATTRIBUTE_ATTRIBUTE_H_
#define MIE_ATTRIBUTE_ATTRIBUTE_H_ #define MIE_ATTRIBUTE_ATTRIBUTE_H_
#include <mie/misc.h>
#include <stdbool.h>
struct mie_attribute_definition; struct mie_attribute_definition;
struct mie_attribute { struct mie_attribute {
const struct mie_attribute_definition *a_def; const struct mie_attribute_definition *a_def;
}; };
MIE_API bool mie_attribute_check_name(
const struct mie_attribute *attrib, const char *dialect_name,
const char *attrib_name);
#endif #endif

View File

@@ -6,6 +6,7 @@
#include <mie/interface/interface.h> #include <mie/interface/interface.h>
#include <mie/misc.h> #include <mie/misc.h>
#include <mie/trait/trait.h> #include <mie/trait/trait.h>
#include <mie/vector.h>
struct mie_dialect; struct mie_dialect;
@@ -54,6 +55,16 @@ struct mie_index {
size_t i_value; size_t i_value;
}; };
struct mie_array {
struct mie_attribute a_base;
MIE_VECTOR_DECLARE(const struct mie_attribute *, a_items);
};
struct mie_type_attr {
struct mie_attribute ty_base;
const struct mie_type *ty_value;
};
struct mie_symbol { struct mie_symbol {
struct mie_interface sym_base; struct mie_interface sym_base;
const char *(*sym_get_name)(const struct mie_op *); const char *(*sym_get_name)(const struct mie_op *);
@@ -100,6 +111,10 @@ MIE_API struct mie_attribute *mie_ctx_get_string(
struct mie_ctx *ctx, const char *s); struct mie_ctx *ctx, const char *s);
MIE_API struct mie_attribute *mie_ctx_get_index(struct mie_ctx *ctx, size_t val); MIE_API struct mie_attribute *mie_ctx_get_index(struct mie_ctx *ctx, size_t val);
MIE_API const char *mie_string_get_cstr(const struct mie_attribute *attrib);
MIE_API const struct mie_type *mie_type_attr_get_type(
const struct mie_attribute *attrib);
MIE_API struct mie_type *mie_ctx_get_int_type(struct mie_ctx *ctx, size_t bit_width); MIE_API struct mie_type *mie_ctx_get_int_type(struct mie_ctx *ctx, size_t bit_width);
MIE_API struct mie_type *mie_ctx_get_float_type( MIE_API struct mie_type *mie_ctx_get_float_type(
struct mie_ctx *ctx, size_t bit_width); struct mie_ctx *ctx, size_t bit_width);

View File

@@ -12,6 +12,7 @@
#define MIE_OP_MAX_RESULTS 8 #define MIE_OP_MAX_RESULTS 8
struct mie_op; struct mie_op;
struct mie_printer;
struct mie_parser; struct mie_parser;
struct mie_dialect; struct mie_dialect;
@@ -101,7 +102,7 @@ struct mie_op_definition {
const struct mie_op_param op_params[MIE_OP_MAX_PARAMS]; const struct mie_op_param op_params[MIE_OP_MAX_PARAMS];
const struct mie_op_result op_results[MIE_OP_MAX_RESULTS]; const struct mie_op_result op_results[MIE_OP_MAX_RESULTS];
enum mie_status (*op_print)(const struct mie_op *, b_stream *); enum mie_status (*op_print)(struct mie_printer *, const struct mie_op *);
enum mie_status (*op_parse)(struct mie_parser *, struct mie_op *); enum mie_status (*op_parse)(struct mie_parser *, struct mie_op *);
}; };

View File

@@ -17,6 +17,10 @@ struct mie_register;
enum mie_print_flags { enum mie_print_flags {
MIE_PRINT_F_GENERIC = 0x01u, MIE_PRINT_F_GENERIC = 0x01u,
MIE_PRINT_F_ABBREVIATED = 0x02u, MIE_PRINT_F_ABBREVIATED = 0x02u,
MIE_PRINT_F_INCLUDE_TYPE = 0x04u,
MIE_PRINT_F_EXCLUDE_BLOCK_HEADER = 0x08u,
MIE_PRINT_F_EXCLUDE_FIRST_BLOCK_HEADER = 0x10u,
}; };
struct mie_printer { struct mie_printer {
@@ -34,14 +38,17 @@ MIE_API void mie_printer_print_module(
MIE_API void mie_printer_print_op( MIE_API void mie_printer_print_op(
struct mie_printer *printer, const struct mie_op *op); struct mie_printer *printer, const struct mie_op *op);
MIE_API void mie_printer_print_region( MIE_API void mie_printer_print_region(
struct mie_printer *printer, const struct mie_region *region); struct mie_printer *printer, const struct mie_region *region,
enum mie_print_flags flags);
MIE_API void mie_printer_print_block( MIE_API void mie_printer_print_block(
struct mie_printer *printer, const struct mie_block *block); struct mie_printer *printer, const struct mie_block *block,
enum mie_print_flags flags);
MIE_API void mie_printer_print_type( MIE_API void mie_printer_print_type(
struct mie_printer *printer, const struct mie_type *type); struct mie_printer *printer, const struct mie_type *type);
MIE_API void mie_printer_print_attribute( MIE_API void mie_printer_print_attribute(
struct mie_printer *printer, const struct mie_attribute *attrib); struct mie_printer *printer, const struct mie_attribute *attrib);
MIE_API void mie_printer_print_register( MIE_API void mie_printer_print_register(
struct mie_printer *printer, const struct mie_register *reg); struct mie_printer *printer, const struct mie_register *reg,
enum mie_print_flags flags);
#endif #endif

View File

@@ -355,10 +355,27 @@ static bool parse_type_name(struct mie_parser *ctx, const struct mie_type **out)
return false; return false;
} }
*out = NULL; const struct mie_type_definition *ty_def
= get_type_by_full_name(ctx, name);
if (!ty_def) {
return false; return false;
} }
const struct mie_type *ty = NULL;
enum mie_status status = MIE_SUCCESS;
if (ty_def->ty_parse) {
status = ty_def->ty_parse(ctx, &ty);
} else {
ty = mie_ctx_get_type(
ctx->p_ctx, ty_def->ty_parent->d_name, ty_def->ty_name);
}
*out = ty;
return ty != NULL;
}
static bool parse_composite_type(struct mie_parser *ctx, const struct mie_type **out) static bool parse_composite_type(struct mie_parser *ctx, const struct mie_type **out)
{ {
const struct mie_type *temp = NULL; const struct mie_type *temp = NULL;
@@ -1244,6 +1261,10 @@ bool mie_parser_parse_attribute(
attribute = mie_ctx_get_attribute_definition( attribute = mie_ctx_get_attribute_definition(
ctx->p_ctx, "builtin", "dict"); ctx->p_ctx, "builtin", "dict");
break; break;
case MIE_SYM_LEFT_PAREN:
attribute = mie_ctx_get_attribute_definition(
ctx->p_ctx, "builtin", "type");
break;
default: default:
break; break;
} }
@@ -1273,7 +1294,7 @@ bool mie_parser_parse_attribute(
return false; return false;
} }
if (!attribute->a_parse(ctx, dest)) { if (attribute->a_parse(ctx, dest) != MIE_SUCCESS) {
return false; return false;
} }

View File

@@ -17,7 +17,7 @@ static void print_block_header_params(
b_stream_write_string(printer->p_stream, ", ", NULL); b_stream_write_string(printer->p_stream, ", ", NULL);
} }
mie_printer_print_register(printer, block->b_params.items[i]); mie_printer_print_register(printer, block->b_params.items[i], 0);
b_stream_write_string(printer->p_stream, ": ", NULL); b_stream_write_string(printer->p_stream, ": ", NULL);
@@ -46,9 +46,13 @@ static void print_block_header(
} }
void mie_printer_print_block( void mie_printer_print_block(
struct mie_printer *printer, const struct mie_block *block) struct mie_printer *printer, const struct mie_block *block,
enum mie_print_flags flags)
{ {
if (!(flags & MIE_PRINT_F_EXCLUDE_BLOCK_HEADER)) {
print_block_header(printer, block); print_block_header(printer, block);
}
b_stream_push_indent(printer->p_stream, 4); b_stream_push_indent(printer->p_stream, 4);
for (size_t i = 0; i < MIE_VECTOR_COUNT(block->b_ops); i++) { for (size_t i = 0; i < MIE_VECTOR_COUNT(block->b_ops); i++) {

View File

@@ -101,7 +101,7 @@ static void print_region_list(struct mie_printer *printer, const struct mie_op *
b_stream_write_string(printer->p_stream, ", ", NULL); b_stream_write_string(printer->p_stream, ", ", NULL);
} }
mie_printer_print_region(printer, &op->op_regions.items[i]); mie_printer_print_region(printer, &op->op_regions.items[i], 0);
} }
b_stream_write_string(printer->p_stream, ")", NULL); b_stream_write_string(printer->p_stream, ")", NULL);
@@ -182,23 +182,9 @@ static void print_type_signature(
} }
} }
void mie_printer_print_op(struct mie_printer *printer, const struct mie_op *op) static void print_generic_op(struct mie_printer *printer, const struct mie_op *op)
{ {
for (size_t i = 0; i < MIE_VECTOR_COUNT(op->op_result); i++) {
if (i > 0) {
b_stream_write_string(printer->p_stream, ", ", NULL);
}
mie_printer_print_register(printer, op->op_result.items[i]);
}
if (MIE_VECTOR_COUNT(op->op_result) > 0) {
b_stream_write_string(printer->p_stream, " = ", NULL);
}
if (printer->p_flags & MIE_PRINT_F_GENERIC) {
b_stream_write_char(printer->p_stream, '~'); b_stream_write_char(printer->p_stream, '~');
}
if (op->op_flags & MIE_OP_F_OP_RESOLVED) { if (op->op_flags & MIE_OP_F_OP_RESOLVED) {
b_stream_write_fmt( b_stream_write_fmt(
@@ -225,3 +211,32 @@ void mie_printer_print_op(struct mie_printer *printer, const struct mie_op *op)
print_attribute_list(printer, op); print_attribute_list(printer, op);
print_type_signature(printer, op); print_type_signature(printer, op);
} }
void mie_printer_print_op(struct mie_printer *printer, const struct mie_op *op)
{
for (size_t i = 0; i < MIE_VECTOR_COUNT(op->op_result); i++) {
if (i > 0) {
b_stream_write_string(printer->p_stream, ", ", NULL);
}
mie_printer_print_register(printer, op->op_result.items[i], 0);
}
if (MIE_VECTOR_COUNT(op->op_result) > 0) {
b_stream_write_string(printer->p_stream, " = ", NULL);
}
bool use_generic = !op->op_info || !op->op_info->op_print
|| printer->p_flags & MIE_PRINT_F_GENERIC;
if (use_generic) {
print_generic_op(printer, op);
return;
}
b_stream_write_fmt(
printer->p_stream, NULL, "%s.%s", op->op_dialect->d_name,
op->op_info->op_name);
op->op_info->op_print(printer, op);
}

View File

@@ -3,13 +3,20 @@
#include <mie/print/printer.h> #include <mie/print/printer.h>
void mie_printer_print_region( void mie_printer_print_region(
struct mie_printer *printer, const struct mie_region *region) struct mie_printer *printer, const struct mie_region *region,
enum mie_print_flags flags)
{ {
b_stream_write_string(printer->p_stream, "{\n", NULL); b_stream_write_string(printer->p_stream, "{\n", NULL);
for (size_t i = 0; i < MIE_VECTOR_COUNT(region->r_blocks); i++) { for (size_t i = 0; i < MIE_VECTOR_COUNT(region->r_blocks); i++) {
enum mie_print_flags block_flags = 0;
if ((flags & MIE_PRINT_F_EXCLUDE_FIRST_BLOCK_HEADER) && (i == 0)) {
block_flags = MIE_PRINT_F_EXCLUDE_BLOCK_HEADER;
}
const struct mie_block *block = region->r_blocks.items[i]; const struct mie_block *block = region->r_blocks.items[i];
mie_printer_print_block(printer, block); mie_printer_print_block(printer, block, block_flags);
} }
b_stream_write_string(printer->p_stream, "}", NULL); b_stream_write_string(printer->p_stream, "}", NULL);

View File

@@ -2,7 +2,8 @@
#include <mie/print/printer.h> #include <mie/print/printer.h>
void mie_printer_print_register( void mie_printer_print_register(
struct mie_printer *printer, const struct mie_register *reg) struct mie_printer *printer, const struct mie_register *reg,
enum mie_print_flags flags)
{ {
if (reg->reg_flags & MIE_REGISTER_F_VIRTUAL) { if (reg->reg_flags & MIE_REGISTER_F_VIRTUAL) {
b_stream_write_fmt( b_stream_write_fmt(
@@ -14,4 +15,9 @@ void mie_printer_print_register(
} else { } else {
b_stream_write_string(printer->p_stream, "?REG", NULL); b_stream_write_string(printer->p_stream, "?REG", NULL);
} }
if (flags & MIE_PRINT_F_INCLUDE_TYPE) {
b_stream_write_string(printer->p_stream, ": ", NULL);
mie_printer_print_type(printer, reg->reg_type);
}
} }