diff --git a/mie/include/mie/ir/block.h b/mie/include/mie/ir/block.h new file mode 100644 index 0000000..71af2aa --- /dev/null +++ b/mie/include/mie/ir/block.h @@ -0,0 +1,21 @@ +#ifndef MIE_IR_BLOCK_H_ +#define MIE_IR_BLOCK_H_ + +#include +#include +#include +#include + +struct mie_op; +struct mie_register; + +struct mie_block { + struct mie_name b_name; + + MIE_VECTOR_DECLARE(struct mie_register, b_params); + MIE_VECTOR_DECLARE(struct mie_op, b_ops); +}; + +MIE_API struct mie_op *mie_block_add_op(struct mie_block *block); + +#endif diff --git a/mie/include/mie/ir/module.h b/mie/include/mie/ir/module.h new file mode 100644 index 0000000..4ccff9a --- /dev/null +++ b/mie/include/mie/ir/module.h @@ -0,0 +1,21 @@ +#ifndef MIE_IR_MODULE_H_ +#define MIE_IR_MODULE_H_ + +#include +#include +#include +#include + +struct mie_op; + +struct mie_module { + struct mie_name_map *m_names; + MIE_VECTOR_DECLARE(struct mie_op, m_ops); +}; + +MIE_API struct mie_module *mie_module_create(void); +MIE_API void mie_module_destroy(struct mie_module *mod); + +MIE_API struct mie_op *mie_module_add_op(struct mie_module *mod); + +#endif diff --git a/mie/include/mie/ir/op.h b/mie/include/mie/ir/op.h new file mode 100644 index 0000000..fb33239 --- /dev/null +++ b/mie/include/mie/ir/op.h @@ -0,0 +1,55 @@ +#ifndef MIE_IR_OP_H_ +#define MIE_IR_OP_H_ + +#include "mie/vector.h" + +#include +#include + +struct mie_type; + +struct mie_value; +struct mie_block; +struct mie_region; +struct mie_register; + +struct mie_dialect; +struct mie_dialect_op; + +enum mie_op_flags { + MIE_OP_F_RESOLVED = 0x01u, +}; + +struct mie_op_successor { + struct mie_block *s_block; + MIE_VECTOR_DECLARE(struct mie_register *, s_params); +}; + +struct mie_op_attribute { + char *attrib_name; + struct mie_value *attrib_value; +}; + +struct mie_op { + enum mie_op_flags op_flags; + + /* these pointers are only valid if the F_RESOLVED flag is set */ + const struct mie_dialect *op_dialect; + const struct mie_dialect_op *op_info; + + /* this pointer is only valid if the F_RESOLVED flag is NOT set */ + char *op_name; + + MIE_VECTOR_DECLARE(struct mie_region, op_regions); + MIE_VECTOR_DECLARE(struct mie_op_successor, op_successors); + MIE_VECTOR_DECLARE(struct mie_op_attribute, op_attrib); + MIE_VECTOR_DECLARE(struct mie_register *, op_args); + MIE_VECTOR_DECLARE(struct mie_register, op_result); +}; + +MIE_API void mie_op_destroy(struct mie_op *op); + +MIE_API struct mie_region *mie_op_add_region(struct mie_op *op); +MIE_API struct mie_op_successor *mie_op_add_successor(struct mie_op *op); + +#endif diff --git a/mie/include/mie/ir/region.h b/mie/include/mie/ir/region.h new file mode 100644 index 0000000..f8870c8 --- /dev/null +++ b/mie/include/mie/ir/region.h @@ -0,0 +1,17 @@ +#ifndef MIE_IR_REGION_H_ +#define MIE_IR_REGION_H_ + +#include +#include +#include + +struct mie_block; + +struct mie_region { + struct mie_name_map *r_names; + MIE_VECTOR_DECLARE(struct mie_block, r_blocks); +}; + +MIE_API struct mie_block *mie_region_add_block(struct mie_region *region); + +#endif diff --git a/mie/include/mie/ir/register.h b/mie/include/mie/ir/register.h new file mode 100644 index 0000000..0ff67f7 --- /dev/null +++ b/mie/include/mie/ir/register.h @@ -0,0 +1,38 @@ +#ifndef MIE_IR_REGISTER_H_ +#define MIE_IR_REGISTER_H_ + +#include + +struct mie_target_register; + +enum mie_register_flags { + MIE_REGISTER_F_NONE = 0, + MIE_REGISTER_F_OP_RESULT = 0x01u, + MIE_REGISTER_F_OP_PARAM = 0x02u, + MIE_REGISTER_F_BLOCK_PARAM = 0x04u, + + MIE_REGISTER_F_VIRTUAL = 0x10u, + MIE_REGISTER_F_MACHINE = 0x20u, +}; + +struct mie_register { + enum mie_register_flags reg_flags; + struct mie_name reg_name; + /* only valid if F_MACHINE is set. */ + struct mie_target_register *reg_mach; + struct mie_type *reg_value_type; + /* if this is an OP_RESULT register, this points to the block within + * which this register is defined. + * if this is an OP_PARAM register, this pointer is NULL. + * if this is a BLOCK_PARAM register, this points to the block for + * which this register is a parameter. */ + struct mie_block *reg_block; + /* if this is an OP_RESULT register, this points to the operation + * that defines the register. + * if this is an OP_PARAM register, this points to the operation + * for which this register is a parameter + * if this is a BLOCK_PARAM register, this pointer is NULL */ + struct mie_op *reg_op; +}; + +#endif