stage1 修复设计问题 实现ir2vm
This commit is contained in:
@@ -15,6 +15,7 @@ static const char *const ir_kind_names[] = {
|
||||
void spl_ir_init(spl_ir_t *ir) {
|
||||
memset(ir, 0, sizeof *ir);
|
||||
vec_init(ir->funcs);
|
||||
vec_init(ir->gdata);
|
||||
/* func ref 0 保留为 error,占位 */
|
||||
spl_ir_func_t f0;
|
||||
memset(&f0, 0, sizeof f0);
|
||||
@@ -45,6 +46,9 @@ void spl_ir_drop(spl_ir_t *ir) {
|
||||
vec_free(f->labels);
|
||||
}
|
||||
vec_free(ir->funcs);
|
||||
for (usize i = 0; i < ir->gdata.size; i++)
|
||||
node_drop_vecs(&ir->gdata.data[i]);
|
||||
vec_free(ir->gdata);
|
||||
}
|
||||
|
||||
spl_ir_func_ref_t spl_ir_alloc_fn(spl_ir_t *ir) {
|
||||
@@ -300,6 +304,16 @@ static void dump_node(const spl_type_t *ty, const spl_ir_node_t *n) {
|
||||
dump_ref(n->mem_offset.offset);
|
||||
printf(")");
|
||||
break;
|
||||
case SPL_IR_MEM_FIELD_PTR:
|
||||
printf("@mem.field_ptr(");
|
||||
ir_type_dump(ty, n->mem_field_ptr.tid);
|
||||
printf(", %zu)(", (size_t)n->mem_field_ptr.field_idx);
|
||||
dump_ref(n->mem_field_ptr.agg);
|
||||
printf(")");
|
||||
break;
|
||||
case SPL_IR_MEM_GLOBAL_ALLOC:
|
||||
printf("@mem.global_alloc(gdata[%zu])()", (size_t)n->mem_global_alloc.const_node);
|
||||
break;
|
||||
case SPL_IR_MEM_COPY:
|
||||
printf("@mem.copy()(");
|
||||
dump_ref(n->mem_copy.dst);
|
||||
@@ -481,4 +495,12 @@ void spl_ir_dump(spl_ir_t *ir, const spl_type_t *ty) {
|
||||
printf("; SPL IR module (%zu funcs)\n", ir->funcs.size - 1);
|
||||
for (usize i = 1; i < ir->funcs.size; i++)
|
||||
dump_func(ty, &ir->funcs.data[i]);
|
||||
if (ir->gdata.size) {
|
||||
printf("; global data (%zu)\n", ir->gdata.size);
|
||||
for (usize i = 0; i < ir->gdata.size; i++) {
|
||||
printf("; gdata[%zu] = ", i);
|
||||
dump_node(ty, &ir->gdata.data[i]);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user