diff --git a/mie/dialect/func/func.c b/mie/dialect/func/func.c index 8ebd12a..f96aa3c 100644 --- a/mie/dialect/func/func.c +++ b/mie/dialect/func/func.c @@ -3,6 +3,7 @@ #include MIE_DIALECT_BEGIN(mie_func, struct mie_dialect, "func") + MIE_DIALECT_ADD_TRAIT(mie_func_function_like); MIE_DIALECT_ADD_OP(mie_func_func); MIE_DIALECT_ADD_OP(mie_func_return); MIE_DIALECT_END() diff --git a/mie/dialect/func/op/func.c b/mie/dialect/func/op/func.c index de5cd22..985acf8 100644 --- a/mie/dialect/func/op/func.c +++ b/mie/dialect/func/op/func.c @@ -130,6 +130,7 @@ MIE_OP_DEFINITION_BEGIN(mie_func_func, "func") MIE_OP_DEFINITION_PRINT(print); MIE_OP_DEFINITION_PARSE(parse); MIE_OP_DEFINITION_TRAIT("builtin", "isolated-from-above"); + MIE_OP_DEFINITION_TRAIT("func", "function-like"); MIE_OP_INTERFACE_BEGIN("builtin", "symbol", struct mie_symbol) MIE_OP_INTERFACE_FUNC(sym_get_name) = NULL; MIE_OP_INTERFACE_END() diff --git a/mie/dialect/func/trait/function-like.c b/mie/dialect/func/trait/function-like.c new file mode 100644 index 0000000..9b86c3c --- /dev/null +++ b/mie/dialect/func/trait/function-like.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +static enum mie_status validate( + const struct mie_trait_definition *trait_def, + const struct mie_trait *trait, const struct mie_trait_target *target) +{ + return MIE_SUCCESS; +} + +/* func.function-like trait: + * the op behaves like a func.func. this means that it: + * a) has a single region + * b) that region has one or more blocks representing the body of a function. + * c) the op has sym_name, function_type, and other function-related attributes. + */ +MIE_TRAIT_DEFINITION_BEGIN(mie_func_function_like, "function-like") + MIE_TRAIT_DEFINITION_TARGETS(MIE_TRAIT_TARGET_OP); + MIE_TRAIT_DEFINITION_STRUCT(struct mie_trait); + MIE_TRAIT_DEFINITION_VALIDATE(validate); +MIE_TRAIT_DEFINITION_END()