diff --git a/mie/include/mie/alloca.h b/mie/include/mie/alloca.h new file mode 100644 index 0000000..85f6102 --- /dev/null +++ b/mie/include/mie/alloca.h @@ -0,0 +1,12 @@ +#ifndef MIE_ALLOCA_H_ +#define MIE_ALLOCA_H_ + +#include +#include + +struct mie_alloca { + struct mie_instr a_base; + struct mie_type *a_type; +}; + +#endif diff --git a/mie/include/mie/block.h b/mie/include/mie/block.h index 43ad3df..0d6c69d 100644 --- a/mie/include/mie/block.h +++ b/mie/include/mie/block.h @@ -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 diff --git a/mie/include/mie/branch.h b/mie/include/mie/branch.h new file mode 100644 index 0000000..ced504d --- /dev/null +++ b/mie/include/mie/branch.h @@ -0,0 +1,19 @@ +#ifndef MIE_BRANCH_H_ +#define MIE_BRANCH_H_ + +#include +#include + +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 diff --git a/mie/include/mie/builder.h b/mie/include/mie/builder.h new file mode 100644 index 0000000..9b31dc0 --- /dev/null +++ b/mie/include/mie/builder.h @@ -0,0 +1,96 @@ +#ifndef MIE_BUILDER_H_ +#define MIE_BUILDER_H_ + +#include +#include + +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 diff --git a/mie/include/mie/const.h b/mie/include/mie/const.h index dc18882..4f1a453 100644 --- a/mie/include/mie/const.h +++ b/mie/include/mie/const.h @@ -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 diff --git a/mie/include/mie/data.h b/mie/include/mie/data.h new file mode 100644 index 0000000..519d5db --- /dev/null +++ b/mie/include/mie/data.h @@ -0,0 +1,18 @@ +#ifndef MIE_DATA_H_ +#define MIE_DATA_H_ + +#include + +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 diff --git a/mie/include/mie/func.h b/mie/include/mie/func.h new file mode 100644 index 0000000..64c878a --- /dev/null +++ b/mie/include/mie/func.h @@ -0,0 +1,28 @@ +#ifndef MIE_FUNC_H_ +#define MIE_FUNC_H_ + +#include + +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 diff --git a/mie/include/mie/instr.h b/mie/include/mie/instr.h index e317f8e..11ea515 100644 --- a/mie/include/mie/instr.h +++ b/mie/include/mie/instr.h @@ -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 diff --git a/mie/include/mie/module.h b/mie/include/mie/module.h new file mode 100644 index 0000000..6b7f23e --- /dev/null +++ b/mie/include/mie/module.h @@ -0,0 +1,15 @@ +#ifndef MIE_MODULE_H_ +#define MIE_MODULE_H_ + +#include +#include + +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 diff --git a/mie/include/mie/msg.h b/mie/include/mie/msg.h new file mode 100644 index 0000000..08a1a40 --- /dev/null +++ b/mie/include/mie/msg.h @@ -0,0 +1,15 @@ +#ifndef MIE_MSG_H_ +#define MIE_MSG_H_ + +#include +#include + +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 diff --git a/mie/include/mie/op.h b/mie/include/mie/op.h new file mode 100644 index 0000000..46fede9 --- /dev/null +++ b/mie/include/mie/op.h @@ -0,0 +1,13 @@ +#ifndef MIE_ARITH_H_ +#define MIE_ARITH_H_ + +#include + +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 diff --git a/mie/include/mie/phi.h b/mie/include/mie/phi.h new file mode 100644 index 0000000..bea4870 --- /dev/null +++ b/mie/include/mie/phi.h @@ -0,0 +1,19 @@ +#ifndef MIE_PHI_H_ +#define MIE_PHI_H_ + +#include + +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 diff --git a/mie/include/mie/ptr.h b/mie/include/mie/ptr.h new file mode 100644 index 0000000..3bc3467 --- /dev/null +++ b/mie/include/mie/ptr.h @@ -0,0 +1,33 @@ +#ifndef MIE_PTR_H_ +#define MIE_PTR_H_ + +#include +#include + +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 diff --git a/mie/include/mie/switch.h b/mie/include/mie/switch.h new file mode 100644 index 0000000..54032cc --- /dev/null +++ b/mie/include/mie/switch.h @@ -0,0 +1,21 @@ +#ifndef MIE_SWITCH_H_ +#define MIE_SWITCH_H_ + +#include +#include + +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 diff --git a/mie/include/mie/type.h b/mie/include/mie/type.h new file mode 100644 index 0000000..346530f --- /dev/null +++ b/mie/include/mie/type.h @@ -0,0 +1,25 @@ +#ifndef MIE_TYPE_H_ +#define MIE_TYPE_H_ + +#include + +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 diff --git a/mie/include/mie/unit.h b/mie/include/mie/unit.h deleted file mode 100644 index 0c5ef27..0000000 --- a/mie/include/mie/unit.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef MIE_UNIT_H_ -#define MIE_UNIT_H_ - -#include -#include - -struct mie_unit { - struct mie_value u_base; - b_queue u_children; -}; - -#endif