diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/codegen.cpp | 10 | ||||
| -rw-r--r-- | src/codegen/ssa.cpp | 126 |
2 files changed, 63 insertions, 73 deletions
diff --git a/src/codegen/codegen.cpp b/src/codegen/codegen.cpp index 04f1f88ea..a33b9e633 100644 --- a/src/codegen/codegen.cpp +++ b/src/codegen/codegen.cpp @@ -7,17 +7,9 @@ struct ssaGen { }; b32 ssa_gen_init(ssaGen *s, Checker *c) { - if (c->error_collector.count != 0) + if (global_error_collector.count != 0) return false; - gb_for_array(i, c->parser->files) { - AstFile *f = &c->parser->files[i]; - if (f->error_collector.count != 0) - return false; - if (f->tokenizer.error_count != 0) - return false; - } - isize tc = c->parser->total_token_count; if (tc < 2) { return false; diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index fac8423b0..a2ff2a50a 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -3053,82 +3053,80 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { case_end; case_ast_node(vd, VarDecl, node); - if (vd->kind == Declaration_Mutable) { - if (gb_array_count(vd->names) == gb_array_count(vd->values)) { // 1:1 assigment - gbArray(ssaAddr) lvals; - gbArray(ssaValue *) inits; - gb_array_init_reserve(lvals, gb_heap_allocator(), gb_array_count(vd->names)); - gb_array_init_reserve(inits, gb_heap_allocator(), gb_array_count(vd->names)); - defer (gb_array_free(lvals)); - defer (gb_array_free(inits)); + if (gb_array_count(vd->names) == gb_array_count(vd->values)) { // 1:1 assigment + gbArray(ssaAddr) lvals; + gbArray(ssaValue *) inits; + gb_array_init_reserve(lvals, gb_heap_allocator(), gb_array_count(vd->names)); + gb_array_init_reserve(inits, gb_heap_allocator(), gb_array_count(vd->names)); + defer (gb_array_free(lvals)); + defer (gb_array_free(inits)); + + gb_for_array(i, vd->names) { + AstNode *name = vd->names[i]; + ssaAddr lval = ssa_make_addr(NULL, NULL); + if (!ssa_is_blank_ident(name)) { + ssa_add_local_for_identifier(proc, name, false); + lval = ssa_build_addr(proc, name); + GB_ASSERT(lval.addr != NULL); + } - gb_for_array(i, vd->names) { - AstNode *name = vd->names[i]; - ssaAddr lval = ssa_make_addr(NULL, NULL); - if (!ssa_is_blank_ident(name)) { - ssa_add_local_for_identifier(proc, name, false); - lval = ssa_build_addr(proc, name); - GB_ASSERT(lval.addr != NULL); - } + gb_array_append(lvals, lval); + } + gb_for_array(i, vd->values) { + ssaValue *init = ssa_build_expr(proc, vd->values[i]); + gb_array_append(inits, init); + } - gb_array_append(lvals, lval); - } - gb_for_array(i, vd->values) { - ssaValue *init = ssa_build_expr(proc, vd->values[i]); - gb_array_append(inits, init); - } + gb_for_array(i, inits) { + ssaValue *v = ssa_emit_conv(proc, inits[i], ssa_addr_type(lvals[i])); + ssa_lvalue_store(proc, lvals[i], v); + } - gb_for_array(i, inits) { - ssaValue *v = ssa_emit_conv(proc, inits[i], ssa_addr_type(lvals[i])); - ssa_lvalue_store(proc, lvals[i], v); + } else if (gb_array_count(vd->values) == 0) { // declared and zero-initialized + gb_for_array(i, vd->names) { + AstNode *name = vd->names[i]; + if (!ssa_is_blank_ident(name)) { + ssa_add_local_for_identifier(proc, name, true); } - - } else if (gb_array_count(vd->values) == 0) { // declared and zero-initialized - gb_for_array(i, vd->names) { - AstNode *name = vd->names[i]; - if (!ssa_is_blank_ident(name)) { - ssa_add_local_for_identifier(proc, name, true); - } + } + } else { // Tuple(s) + gbArray(ssaAddr) lvals; + gbArray(ssaValue *) inits; + gb_array_init_reserve(lvals, gb_heap_allocator(), gb_array_count(vd->names)); + gb_array_init_reserve(inits, gb_heap_allocator(), gb_array_count(vd->names)); + defer (gb_array_free(lvals)); + defer (gb_array_free(inits)); + + gb_for_array(i, vd->names) { + AstNode *name = vd->names[i]; + ssaAddr lval = ssa_make_addr(NULL, NULL); + if (!ssa_is_blank_ident(name)) { + ssa_add_local_for_identifier(proc, name, false); + lval = ssa_build_addr(proc, name); } - } else { // Tuple(s) - gbArray(ssaAddr) lvals; - gbArray(ssaValue *) inits; - gb_array_init_reserve(lvals, gb_heap_allocator(), gb_array_count(vd->names)); - gb_array_init_reserve(inits, gb_heap_allocator(), gb_array_count(vd->names)); - defer (gb_array_free(lvals)); - defer (gb_array_free(inits)); - gb_for_array(i, vd->names) { - AstNode *name = vd->names[i]; - ssaAddr lval = ssa_make_addr(NULL, NULL); - if (!ssa_is_blank_ident(name)) { - ssa_add_local_for_identifier(proc, name, false); - lval = ssa_build_addr(proc, name); - } - - gb_array_append(lvals, lval); - } + gb_array_append(lvals, lval); + } - gb_for_array(i, vd->values) { - ssaValue *init = ssa_build_expr(proc, vd->values[i]); - Type *t = ssa_type(init); - if (t->kind == Type_Tuple) { - for (isize i = 0; i < t->Tuple.variable_count; i++) { - Entity *e = t->Tuple.variables[i]; - ssaValue *v = ssa_emit_struct_ev(proc, init, i, e->type); - gb_array_append(inits, v); - } - } else { - gb_array_append(inits, init); + gb_for_array(i, vd->values) { + ssaValue *init = ssa_build_expr(proc, vd->values[i]); + Type *t = ssa_type(init); + if (t->kind == Type_Tuple) { + for (isize i = 0; i < t->Tuple.variable_count; i++) { + Entity *e = t->Tuple.variables[i]; + ssaValue *v = ssa_emit_struct_ev(proc, init, i, e->type); + gb_array_append(inits, v); } + } else { + gb_array_append(inits, init); } + } - gb_for_array(i, inits) { - ssaValue *v = ssa_emit_conv(proc, inits[i], ssa_addr_type(lvals[i])); - ssa_lvalue_store(proc, lvals[i], v); - } + gb_for_array(i, inits) { + ssaValue *v = ssa_emit_conv(proc, inits[i], ssa_addr_type(lvals[i])); + ssa_lvalue_store(proc, lvals[i], v); } } case_end; |