aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/ssa.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-17 11:39:08 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-17 11:40:00 +0100
commit67694c0df07c758effbc7dcb10c76a2b2bffe5d0 (patch)
treed1b0d26cfbb81fba0b16410856dcf21a3f274a69 /src/codegen/ssa.cpp
parenteb424bb315a880bf52fe843733445dfb502c1525 (diff)
VarDecl and ConstDecl split; error, warning, et al. now global
Diffstat (limited to 'src/codegen/ssa.cpp')
-rw-r--r--src/codegen/ssa.cpp126
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;