diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-09-17 11:39:08 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-09-17 11:40:00 +0100 |
| commit | 67694c0df07c758effbc7dcb10c76a2b2bffe5d0 (patch) | |
| tree | d1b0d26cfbb81fba0b16410856dcf21a3f274a69 /src/codegen/ssa.cpp | |
| parent | eb424bb315a880bf52fe843733445dfb502c1525 (diff) | |
VarDecl and ConstDecl split; error, warning, et al. now global
Diffstat (limited to 'src/codegen/ssa.cpp')
| -rw-r--r-- | src/codegen/ssa.cpp | 126 |
1 files changed, 62 insertions, 64 deletions
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; |