mie: add lots more mie_value sub-types
This commit is contained in:
12
mie/include/mie/alloca.h
Normal file
12
mie/include/mie/alloca.h
Normal 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
|
||||||
@@ -5,6 +5,14 @@
|
|||||||
|
|
||||||
struct mie_block {
|
struct mie_block {
|
||||||
struct mie_value b_base;
|
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
|
#endif
|
||||||
|
|||||||
19
mie/include/mie/branch.h
Normal file
19
mie/include/mie/branch.h
Normal 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
96
mie/include/mie/builder.h
Normal 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
|
||||||
@@ -10,19 +10,44 @@ enum mie_const_type {
|
|||||||
MIE_CONST_STRING,
|
MIE_CONST_STRING,
|
||||||
MIE_CONST_SYMBOL,
|
MIE_CONST_SYMBOL,
|
||||||
MIE_CONST_LABEL,
|
MIE_CONST_LABEL,
|
||||||
|
MIE_CONST_ARRAY,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mie_const {
|
struct mie_const {
|
||||||
struct mie_value c_base;
|
struct mie_value c_base;
|
||||||
enum mie_const_type c_type;
|
enum mie_const_type c_type;
|
||||||
|
};
|
||||||
|
|
||||||
union {
|
struct mie_int {
|
||||||
int v_int;
|
struct mie_const i_base;
|
||||||
float v_float;
|
unsigned short i_width;
|
||||||
char *v_str;
|
long long i_value;
|
||||||
char *v_sym;
|
};
|
||||||
char *v_label;
|
|
||||||
} c_v;
|
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
|
#endif
|
||||||
|
|||||||
18
mie/include/mie/data.h
Normal file
18
mie/include/mie/data.h
Normal 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
28
mie/include/mie/func.h
Normal 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
|
||||||
@@ -5,13 +5,30 @@
|
|||||||
|
|
||||||
enum mie_instr_type {
|
enum mie_instr_type {
|
||||||
MIE_INSTR_NONE = 0,
|
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_instr {
|
||||||
struct mie_value i_base;
|
struct mie_value i_base;
|
||||||
enum mie_instr_type i_type;
|
enum mie_instr_type i_type;
|
||||||
|
|
||||||
b_queue i_operands;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
15
mie/include/mie/module.h
Normal file
15
mie/include/mie/module.h
Normal 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
15
mie/include/mie/msg.h
Normal 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
13
mie/include/mie/op.h
Normal 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
19
mie/include/mie/phi.h
Normal 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
33
mie/include/mie/ptr.h
Normal 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
21
mie/include/mie/switch.h
Normal 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
25
mie/include/mie/type.h
Normal 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
|
||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user