aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/codegen.cpp10
-rw-r--r--src/codegen/ssa.cpp126
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;