Files
ivy/lang/codegen/codegen.h

86 lines
2.6 KiB
C

#ifndef _LANG_CODEGEN_H_
#define _LANG_CODEGEN_H_
#include <blue/core/queue.h>
#include <ivy/lang/ast.h>
#include <ivy/lang/lex.h>
#include <mie/builder.h>
#define CODEGEN_RESULT_OK(flags) \
(struct code_generator_result) \
{ \
.r_status = (IVY_OK), .r_flags = (flags) \
}
#define CODEGEN_RESULT_ERR(status) \
(struct code_generator_result) \
{ \
.r_status = (status), .r_flags = (0) \
}
struct ivy_codegen;
struct ivy_ast_node;
struct mie_value;
struct mie_func;
enum code_generator_type {
CODE_GENERATOR_NONE = 0,
CODE_GENERATOR_UNIT,
CODE_GENERATOR_EXPR,
};
struct code_generator_result {
enum ivy_status r_status;
enum code_generator_result_flags {
CODEGEN_REPEAT_NODE = 0x01u,
} r_flags;
};
struct code_generator_state;
typedef enum ivy_status (*code_generator_state_init_callback)(
struct ivy_codegen *, struct code_generator_state *);
typedef enum ivy_status (*code_generator_state_fini_callback)(
struct ivy_codegen *, struct code_generator_state *);
typedef struct code_generator_result (*code_generator_callback)(
struct ivy_codegen *);
typedef struct code_generator_result (*code_generator_node_callback)(
struct ivy_codegen *, struct code_generator_state *, struct ivy_ast_node *);
struct code_generator {
enum code_generator_type g_type;
size_t g_state_size;
code_generator_state_init_callback g_state_init;
code_generator_state_fini_callback g_state_fini;
code_generator_node_callback g_node_generators_pre[IVY_AST_TYPE_COUNT];
code_generator_node_callback g_node_generators_post[IVY_AST_TYPE_COUNT];
};
struct code_generator_state {
b_queue_entry s_entry;
void *s_arg;
const struct code_generator *s_gen;
};
struct ivy_codegen {
b_queue c_ir_values;
b_queue c_state;
struct mie_builder *c_builder;
struct mie_ctx *c_ctx;
struct mie_module *c_module;
};
extern const struct code_generator *get_code_generator(
enum code_generator_type type);
extern enum ivy_status codegen_push_generator(
struct ivy_codegen *gen, enum code_generator_type gen_type, void *arg);
extern enum ivy_status codegen_pop_generator(struct ivy_codegen *gen);
extern void codegen_push_value(struct ivy_codegen *gen, struct mie_value *value);
extern struct mie_value *codegen_pop_value(struct ivy_codegen *gen);
#endif