mie: implement ir generation for message sending

This commit is contained in:
2025-04-17 21:43:02 +01:00
parent 6d8809d325
commit 8388dfeb79
9 changed files with 252 additions and 10 deletions

View File

@@ -7,7 +7,7 @@
#include <mie/type.h>
#include <mie/value.h>
struct b_dict;
struct b_hashmap;
struct mie_block;
struct mie_module;
@@ -19,6 +19,7 @@ struct mie_ctx {
struct mie_const *ctx_true, *ctx_false;
struct mie_type *ctx_types[__MIE_TYPE_COUNT];
b_btree ctx_int_cache;
struct b_hashmap *ctx_sel_cache;
};
struct mie_builder {
@@ -28,6 +29,10 @@ struct mie_builder {
struct mie_instr *b_prev_instr;
};
enum mie_builder_flags {
MIE_BUILDER_IGNORE_RESULT = 0x01u,
};
extern struct mie_ctx *mie_ctx_create(void);
extern void mie_ctx_destroy(struct mie_ctx *ctx);
@@ -38,6 +43,7 @@ extern struct mie_type *mie_ctx_get_int_type(
extern struct mie_value *mie_ctx_get_bool(struct mie_ctx *ctx, bool val);
extern struct mie_value *mie_ctx_get_int(
struct mie_ctx *ctx, long long val, unsigned int nr_bits);
extern struct mie_value *mie_ctx_get_selector(struct mie_ctx *ctx, const char *sel);
extern struct mie_builder *mie_builder_create(
struct mie_ctx *ctx, struct mie_module *mod);
@@ -57,6 +63,9 @@ extern void mie_builder_put_type(struct mie_builder *builder, struct mie_type *t
extern void mie_builder_set_insert_point(
struct mie_builder *builder, struct mie_block *block);
extern struct mie_value *mie_builder_get_data_ptr(
struct mie_builder *builder, const char *data_ident);
extern struct mie_value *mie_builder_ret(
struct mie_builder *builder, struct mie_value *val);
extern struct mie_value *mie_builder_add(
@@ -88,8 +97,10 @@ extern struct mie_value *mie_builder_br_if(
struct mie_builder *builder, struct mie_value *cond,
struct mie_block *if_true, struct mie_block *if_false);
extern struct mie_value *mie_builder_msg(
struct mie_builder *builder, struct mie_value *ret_type,
struct mie_value *dest, struct mie_value *src, const char *name);
struct mie_builder *builder, struct mie_type *ret_type,
struct mie_value *recipient, struct mie_value *selector,
struct mie_value **args, size_t nr_args, enum mie_builder_flags flags,
const char *name);
extern struct mie_value *mie_builder_cmp_eq(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);

View File

@@ -18,5 +18,9 @@ struct mie_module {
extern struct mie_module *mie_module_create(void);
extern void mie_module_add_function(struct mie_module *mod, struct mie_func *func);
extern struct mie_data *mie_module_get_data(
struct mie_module *mod, const char *name);
extern enum b_status mie_module_put_data(
struct mie_module *mod, struct mie_data *data);
#endif

View File

@@ -4,12 +4,15 @@
#include <mie/instr.h>
#include <mie/type.h>
#define MIE_MSG(p) ((struct mie_msg *)(p))
struct mie_msg {
struct mie_instr msg_base;
struct mie_type *msg_ret_type;
struct mie_value *msg_recipient;
struct mie_value *msg_selector;
b_queue msg_args;
size_t msg_nr_args;
struct mie_value **msg_args;
};
#endif

View File

@@ -19,6 +19,7 @@ enum mie_value_type_id {
MIE_VALUE_BLOCK,
MIE_VALUE_INSTR,
MIE_VALUE_CONST,
MIE_VALUE_DATA,
};
enum mie_value_flags {