diff --git a/code/demo.odin b/code/demo.odin index f2844f0b5..0899cc111 100644 --- a/code/demo.odin +++ b/code/demo.odin @@ -1,5 +1,6 @@ #import "fmt.odin" main :: proc() { - + x, y: i64 = 123, 321 + y = x + 2 - y } diff --git a/src/llvm/ssa_to_text.cpp b/src/llvm/ssa_to_text.cpp index efa79f012..bc67136c8 100644 --- a/src/llvm/ssa_to_text.cpp +++ b/src/llvm/ssa_to_text.cpp @@ -811,8 +811,9 @@ void ssa_print_instr(ssaFileBuffer *f, ssaModule *m, ssaValue *value) { } } } else { - if (is_type_float(elem_type)) + if (is_type_float(elem_type)) { ssa_fprintf(f, "f"); + } switch (bo->op) { case Token_Add: ssa_fprintf(f, "add"); break; diff --git a/src/main.cpp b/src/main.cpp index 8098182e1..e11207e89 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,7 @@ #include "checker/checker.cpp" #include "ssa/ssa.cpp" #include "llvm/ssa_to_text.cpp" +#include "vm/vm.cpp" // NOTE(bill): `name` is used in debugging and profiling modes i32 win32_exec_command_line_app(char *name, char *fmt, ...) { @@ -165,7 +166,20 @@ int main(int argc, char **argv) { ssa_gen_tree(&ssa); - // TODO(bill): Speedup writing to file for IR code + { + VirtualMachine vm = {}; + vm_init(&vm, &ssa.module); + defer (vm_destroy(&vm)); + + String name = make_string("main"); + ssaValue *main_proc_value = *map_get(&vm.module->members, hash_string(name)); + GB_ASSERT(main_proc_value->kind == ssaValue_Proc); + + ssaProcedure *start_proc = &main_proc_value->Proc; + Array args = {}; // Empty + vm_call_procedure(&vm, start_proc, args); + } + { ssaFileBuffer buf = {}; ssa_file_buffer_init(&buf, &ssa.output_file); diff --git a/src/ssa/make.cpp b/src/ssa/make.cpp index 76f4c3416..8441dac5d 100644 --- a/src/ssa/make.cpp +++ b/src/ssa/make.cpp @@ -295,14 +295,6 @@ ssaValue *ssa_make_value_constant_slice(gbAllocator a, Type *type, ssaValue *bac return v; } -ssaValue *ssa_make_value_constant_string(gbAllocator a, Type *type, String string) { - ssaValue *v = ssa_alloc_value(a, ssaValue_ConstantString); - v->ConstantString.type = type; - v->ConstantString.string = string; - return v; -} - - ssaValue *ssa_make_const_int(gbAllocator a, i64 i) { return ssa_make_value_constant(a, t_int, make_exact_value_integer(i)); } @@ -328,6 +320,11 @@ ssaValue *ssa_make_value_procedure(gbAllocator a, ssaModule *m, Entity *entity, v->Proc.body = body; v->Proc.name = name; array_init(&v->Proc.referrers, heap_allocator(), 0); // TODO(bill): replace heap allocator + + Type *t = base_type(type); + GB_ASSERT(is_type_proc(t)); + array_init(&v->Proc.params, heap_allocator(), t->Proc.param_count); + return v; } diff --git a/src/ssa/proc.cpp b/src/ssa/proc.cpp index 262c44972..4d2b03bdf 100644 --- a/src/ssa/proc.cpp +++ b/src/ssa/proc.cpp @@ -11,7 +11,8 @@ void ssa_begin_procedure_body(ssaProcedure *proc) { auto *params = &proc->type->Proc.params->Tuple; for (isize i = 0; i < params->variable_count; i++) { Entity *e = params->variables[i]; - ssa_add_param(proc, e); + ssaValue *param = ssa_add_param(proc, e); + array_add(&proc->params, param); } } } diff --git a/src/ssa/ssa.cpp b/src/ssa/ssa.cpp index 9e1ff1ecc..a28f84e26 100644 --- a/src/ssa/ssa.cpp +++ b/src/ssa/ssa.cpp @@ -93,6 +93,7 @@ struct ssaProcedure { AstNode * body; u64 tags; + Array params; Array defer_stmts; Array blocks; i32 scope_index; @@ -308,7 +309,6 @@ enum ssaValueKind { ssaValue_Constant, ssaValue_ConstantSlice, - ssaValue_ConstantString, ssaValue_Nil, ssaValue_TypeName, ssaValue_Global, @@ -334,10 +334,6 @@ struct ssaValue { ssaValue *backing_array; i64 count; } ConstantSlice; - struct { - Type * type; - String string; - } ConstantString; struct { Type *type; } Nil; @@ -579,6 +575,13 @@ void ssa_file_write(ssaFileBuffer *f, void *data, isize len) { ssa_file_buffer_write(f, data, len); } +ssaValue *ssa_lookup_member(ssaModule *m, String name) { + ssaValue **v = map_get(&m->members, hash_string(name)); + if (v != NULL) { + return *v; + } + return NULL; +} Type *ssa_type(ssaValue *value); @@ -636,8 +639,6 @@ Type *ssa_type(ssaValue *value) { return value->Constant.type; case ssaValue_ConstantSlice: return value->ConstantSlice.type; - case ssaValue_ConstantString: - return value->ConstantString.type; case ssaValue_Nil: return value->Nil.type; case ssaValue_TypeName: