120 lines
4.6 KiB
C
120 lines
4.6 KiB
C
#ifndef MIE_BUILDER_H_
|
|
#define MIE_BUILDER_H_
|
|
|
|
#include <blue/core/btree.h>
|
|
#include <mie/ir/switch.h>
|
|
#include <mie/ir/value.h>
|
|
#include <mie/misc.h>
|
|
#include <mie/type.h>
|
|
|
|
struct b_hashmap;
|
|
|
|
struct mie_block;
|
|
struct mie_module;
|
|
struct mie_data;
|
|
struct mie_type;
|
|
struct mie_phi;
|
|
struct mie_phi_edge;
|
|
struct mie_ctx;
|
|
|
|
struct mie_builder {
|
|
struct mie_ctx *b_ctx;
|
|
struct mie_module *b_module;
|
|
struct mie_block *b_current_block;
|
|
struct mie_instr *b_prev_instr;
|
|
};
|
|
|
|
enum mie_builder_flags {
|
|
MIE_BUILDER_IGNORE_RESULT = 0x01u,
|
|
};
|
|
|
|
extern struct mie_builder *mie_builder_create(
|
|
struct mie_ctx *ctx, struct mie_module *mod);
|
|
extern void mie_builder_destroy(struct mie_builder *builder);
|
|
|
|
extern struct mie_func *mie_builder_get_current_func(struct mie_builder *builder);
|
|
static inline struct mie_block *mie_builder_get_current_block(
|
|
struct mie_builder *builder)
|
|
{
|
|
return builder->b_current_block;
|
|
}
|
|
|
|
extern struct mie_record *mie_builder_put_record(
|
|
struct mie_builder *builder, struct mie_const *val, const char *name);
|
|
extern struct mie_record *mie_builder_get_record(
|
|
struct mie_builder *builder, const char *name);
|
|
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_get_data_ptr(
|
|
struct mie_builder *builder, const char *data_ident);
|
|
extern struct mie_value *mie_builder_get_string_ptr(
|
|
struct mie_builder *builder, const char *s);
|
|
|
|
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_type *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_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);
|
|
extern struct mie_value *mie_builder_cmp_neq(
|
|
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_value *mie_builder_phi(
|
|
struct mie_builder *builder, struct mie_type *type,
|
|
struct mie_phi_edge *edges, unsigned int nr_edges, const char *name);
|
|
|
|
#endif
|