mie: add lots more mie_value sub-types

This commit is contained in:
2025-04-10 12:18:07 +01:00
parent f6623883ff
commit 0db5d0dc2a
16 changed files with 373 additions and 21 deletions

12
mie/include/mie/alloca.h Normal file
View File

@@ -0,0 +1,12 @@
#ifndef MIE_ALLOCA_H_
#define MIE_ALLOCA_H_
#include <mie/instr.h>
#include <mie/type.h>
struct mie_alloca {
struct mie_instr a_base;
struct mie_type *a_type;
};
#endif

View File

@@ -5,6 +5,14 @@
struct mie_block {
struct mie_value b_base;
/* the phi instruction(s). these must appear at the start of the block
* and are separated to make traversing the CFG easier */
b_queue b_phi;
/* the rest of the instructions in the block */
b_queue b_instr;
/* the instruction that transfers control to the next block,
* could be a switch, branch, or ret */
struct mie_instr *b_terminator;
};
#endif

19
mie/include/mie/branch.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef MIE_BRANCH_H_
#define MIE_BRANCH_H_
#include <mie/const.h>
#include <mie/instr.h>
struct mie_branch {
struct mie_instr b_base;
struct mie_label *b_dest;
};
struct mie_branch_if {
struct mie_instr b_base;
struct mie_value *b_cond;
struct mie_block *b_true_block;
struct mie_block *b_false_block;
};
#endif

96
mie/include/mie/builder.h Normal file
View File

@@ -0,0 +1,96 @@
#ifndef MIE_BUILDER_H_
#define MIE_BUILDER_H_
#include <mie/switch.h>
#include <mie/value.h>
struct b_dict;
struct mie_block;
struct mie_data;
struct mie_type;
struct mie_phi;
struct mie_ctx {
};
struct mie_builder {
struct mie_instr *b_prev_instr;
struct mie_block *b_current_block;
};
extern struct mie_ctx *mie_ctx_create(void);
extern void mie_ctx_destroy(struct mie_ctx *ctx);
extern struct mie_value mie_ctx_get_bool(struct mie_ctx, bool val);
extern struct mie_value mie_ctx_get_int(struct mie_ctx, long long val);
extern struct mie_builder *mie_builder_create(void);
extern void mie_builder_destroy(struct mie_builder *builder);
extern void mie_builder_put_record(
struct mie_builder *builder, const char *name, struct mie_value *val);
extern void mie_builder_put_data(struct mie_builder *builder, struct mie_data *data);
extern void mie_builder_put_type(struct mie_builder *builder, struct mie_type *type);
extern void mie_builder_set_insert_point(
struct mie_builder *builder, struct mie_block *block);
extern struct mie_value *mie_builder_ret(
struct mie_builder *builder, struct mie_value *val);
extern struct mie_value *mie_builder_add(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_sub(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_mul(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_div(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_load(
struct mie_builder *builder, struct mie_value *type,
struct mie_value *src, const char *name);
extern struct mie_value *mie_builder_store(
struct mie_builder *builder, struct mie_value *val, struct mie_value *dest);
extern struct mie_value *mie_builder_alloca(
struct mie_builder *builder, struct mie_type *type, const char *name);
extern struct mie_value *mie_builder_switch(
struct mie_builder *builder, struct mie_value *cond,
struct mie_switch_branch *branches, size_t nr_branches,
struct mie_block *default_block);
extern struct mie_value *mie_builder_br(
struct mie_builder *builder, struct mie_block *dest);
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);
extern struct mie_value *mie_builder_cmp_eq(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_cmp_lt(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_cmp_gt(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_cmp_leq(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_cmp_geq(
struct mie_builder *builder, struct mie_value *left,
struct mie_value *right, const char *name);
extern struct mie_value *mie_builder_getelementptr(
struct mie_builder *builder, struct mie_type *container_type,
struct mie_value *container, struct mie_value *index, const char *name);
extern struct mie_value *mie_builder_setelementptr(
struct mie_builder *builder, struct mie_type *container_type,
struct mie_value *container, struct mie_value *index);
extern struct mie_phi *mie_builder_phi(
struct mie_builder *builder, struct mie_type *type,
unsigned int nr_edges, const char *name);
#endif

View File

@@ -10,19 +10,44 @@ enum mie_const_type {
MIE_CONST_STRING,
MIE_CONST_SYMBOL,
MIE_CONST_LABEL,
MIE_CONST_ARRAY,
};
struct mie_const {
struct mie_value c_base;
enum mie_const_type c_type;
};
union {
int v_int;
float v_float;
char *v_str;
char *v_sym;
char *v_label;
} c_v;
struct mie_int {
struct mie_const i_base;
unsigned short i_width;
long long i_value;
};
struct mie_float {
struct mie_const f_base;
double f_value;
};
struct mie_str {
struct mie_const s_base;
char *s_value;
};
struct mie_sym {
struct mie_const s_base;
char *s_value;
};
struct mie_label {
struct mie_const l_base;
char *l_value;
};
struct mie_array {
struct mie_const a_base;
unsigned int a_nr_values;
struct mie_value **a_values;
};
#endif

18
mie/include/mie/data.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef MIE_DATA_H_
#define MIE_DATA_H_
#include <mie/value.h>
enum mie_data_type {
MIE_DATA_NONE = 0,
MIE_DATA_EXTERN_GLOBAL,
MIE_DATA_CONST,
};
struct mie_data {
struct mie_value d_base;
enum mie_data_type d_type;
struct mie_value *d_data;
};
#endif

28
mie/include/mie/func.h Normal file
View File

@@ -0,0 +1,28 @@
#ifndef MIE_FUNC_H_
#define MIE_FUNC_H_
#include <mie/value.h>
struct mie_type;
struct b_dict;
enum mie_func_type {
MIE_FUNC_NONE = 0x00u,
MIE_FUNC_STATIC = 0x01u,
MIE_FUNC_INSTANCE = 0x02u,
MIE_FUNC_LAMBDA = 0x03u,
};
struct mie_func {
struct mie_value f_base;
struct b_dict *f_named_values;
enum mie_func_type f_type;
struct mie_type *f_ret;
b_queue f_args;
b_queue f_blocks;
};
#endif

View File

@@ -5,13 +5,30 @@
enum mie_instr_type {
MIE_INSTR_NONE = 0,
MIE_INSTR_RET,
MIE_INSTR_ADD,
MIE_INSTR_SUB,
MIE_INSTR_MUL,
MIE_INSTR_DIV,
MIE_INSTR_LOAD,
MIE_INSTR_STORE,
MIE_INSTR_ALLOCA,
MIE_INSTR_SWITCH,
MIE_INSTR_BR,
MIE_INSTR_MSG,
MIE_INSTR_CMP_EQ,
MIE_INSTR_CMP_LT,
MIE_INSTR_CMP_GT,
MIE_INSTR_CMP_LEQ,
MIE_INSTR_CMP_GEQ,
MIE_INSTR_GETELEMENTPTR,
MIE_INSTR_SETELEMENTPTR,
MIE_INSTR_PHI,
};
struct mie_instr {
struct mie_value i_base;
enum mie_instr_type i_type;
b_queue i_operands;
};
#endif

15
mie/include/mie/module.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef MIE_MODULE_H_
#define MIE_MODULE_H_
#include <blue/core/queue.h>
#include <mie/value.h>
struct mie_module {
struct mie_value m_base;
b_queue m_records;
b_queue m_data;
b_queue m_types;
b_queue m_func;
};
#endif

15
mie/include/mie/msg.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef MIE_MSG_H_
#define MIE_MSG_H_
#include <mie/instr.h>
#include <mie/type.h>
struct mie_msg {
struct mie_instr msg_base;
struct mie_type *msg_ret_type;
struct mie_value *msg_recipient;
const char *msg_name;
b_queue msg_args;
};
#endif

13
mie/include/mie/op.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef MIE_ARITH_H_
#define MIE_ARITH_H_
#include <mie/instr.h>
struct mie_binary_op {
struct mie_instr op_base;
struct mie_type *op_type;
struct mie_value *op_left;
struct mie_value *op_right;
};
#endif

19
mie/include/mie/phi.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef MIE_PHI_H_
#define MIE_PHI_H_
#include <mie/instr.h>
struct mie_phi_edge {
struct mie_block *e_incoming_block;
struct mie_value *e_value;
};
struct mie_phi {
struct mie_instr p_base;
struct mie_type *p_type;
unsigned int p_nr_edges;
struct mie_phi_edge *p_edges;
};
#endif

33
mie/include/mie/ptr.h Normal file
View File

@@ -0,0 +1,33 @@
#ifndef MIE_PTR_H_
#define MIE_PTR_H_
#include <mie/instr.h>
#include <mie/type.h>
struct mie_getelementptr {
struct mie_instr gep_base;
struct mie_type *gep_container_type;
struct mie_value *gep_container;
struct mie_value *gep_index;
};
struct mie_setelementptr {
struct mie_instr sep_base;
struct mie_type *sep_container_type;
struct mie_value *sep_container;
struct mie_value *sep_index;
};
struct mie_load {
struct mie_instr l_base;
struct mie_type *l_type;
struct mie_value *l_src;
};
struct mie_store {
struct mie_instr s_base;
struct mie_value *s_val;
struct mie_value *s_dest;
};
#endif

21
mie/include/mie/switch.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef MIE_SWITCH_H_
#define MIE_SWITCH_H_
#include <mie/const.h>
#include <mie/instr.h>
struct mie_switch_branch {
struct mie_value *b_value;
struct mie_block *b_jump_to;
};
struct mie_switch {
struct mie_instr s_base;
struct mie_value *s_src;
struct mie_block *s_default;
size_t s_nr_branches;
struct mie_switch_branch *s_branches;
};
#endif

25
mie/include/mie/type.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef MIE_TYPE_H_
#define MIE_TYPE_H_
#include <mie/value.h>
enum mie_type_id {
MIE_TYPE_VOID = 0x00u,
MIE_TYPE_INT = 0x01u,
MIE_TYPE_ID = 0x02u,
MIE_TYPE_STR = 0x03u,
MIE_TYPE_SYM = 0x04u,
MIE_TYPE_CLASS = 0x05u,
};
struct mie_type {
struct mie_value t_base;
enum mie_type_id t_id;
union {
unsigned int t_width;
b_queue t_vars;
};
};
#endif

View File

@@ -1,12 +0,0 @@
#ifndef MIE_UNIT_H_
#define MIE_UNIT_H_
#include <blue/core/queue.h>
#include <mie/value.h>
struct mie_unit {
struct mie_value u_base;
b_queue u_children;
};
#endif