Files
spl/stage1/spl_ir2vm.c
T

76 lines
2.3 KiB
C

#include "spl_ir2vm.h"
static int emit_instr(spl_ir2vm_t *ctx, spl_ir_func_t *fn, spl_ir_node_t *node) {
int pos = 0;
switch (node->kind) {
case SPL_IR_TYPE_CONST:
break;
case SPL_IR_CONTROL_RET:
spl_type_node_t *tn = spl_type_node(ctx->type, node->control_ret.tid);
spl_ir_node_t *ret_node = &vec_at(fn->nodes, node->control_ret.val);
switch (tn->kind) {
case SPL_TYPE_INT:
break;
default:
UNREACHABLE();
}
// if (is_agg(ty, tid)) {
// if (n->control_ret.val) {
// emit_value(fc, n->control_ret.val);
// emit_laddr(fc, fc->sret_off);
// emit_load_insn(fc, SPL_PTR);
// add_insn(fc, SPL_SWAP, SPL_VOID, 0);
// emit_memcpy(fc, type_size(ty, tid));
// }
// add_insn(fc, SPL_RET, SPL_VOID, 0);
// } else if (!is_void(ty, tid)) {
// if (n->control_ret.val)
// emit_value(fc, n->control_ret.val);
// else
// emit_push(fc, 0); /* 空体函数:返回未定义0 */
// add_insn(fc, SPL_RET, vm_tag(ty, tid), 0);
// } else {
// add_insn(fc, SPL_RET, SPL_VOID, 0);
// }
spl_prog_add_instr(&ctx->prog, SPL_PUSH, SPL_I32, 0);
spl_prog_add_instr(&ctx->prog, SPL_RET, SPL_I32, 0);
break;
default:
break;
}
return pos;
}
void spl_ir2vm_init(spl_ir2vm_t *ctx, const spl_ir_t *ir, const spl_type_t *type) {
ctx->ir = ir;
ctx->type = type;
spl_prog_init(&ctx->prog);
}
void spl_ir2vm_drop(spl_ir2vm_t *ctx) { (void)ctx; }
int spl_ir2vm_run(spl_ir2vm_t *ctx) {
int addr = 0;
vec_for(ctx->ir->funcs, i) {
if (i == 0) {
continue;
}
spl_ir_func_t *fn = &vec_at(ctx->ir->funcs, i);
Assert(fn != NULL);
spl_vm_func_t vm_fn = {0};
vm_fn.name = (char *)fn->name; // FIXME
vm_fn.address = addr;
vm_fn.nargs = 0;
vm_fn.ninsns = 0;
vec_for(fn->nodes, j) {
spl_ir_node_t *node = &vec_at(fn->nodes, j);
emit_instr(ctx, fn, node);
}
spl_prog_add_func(&ctx->prog, &vm_fn);
}
return 0;
}
void spl_ir2vm_dump(spl_ir2vm_t *ctx) { (void)ctx; }