aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-10-30 17:49:30 +0000
committerGinger Bill <bill@gingerbill.org>2016-10-30 17:49:30 +0000
commitca311c4a59a34c0b516a415df37e7dd9d9fb65bf (patch)
tree8dedc0eef2950c77120b31787f8ba433b0e551a7 /src
parent3ec67853e1359015f516aac346760b299d261015 (diff)
Begin work on the Interpreter
Diffstat (limited to 'src')
-rw-r--r--src/llvm/ssa_to_text.cpp3
-rw-r--r--src/main.cpp16
-rw-r--r--src/ssa/make.cpp13
-rw-r--r--src/ssa/proc.cpp3
-rw-r--r--src/ssa/ssa.cpp15
5 files changed, 32 insertions, 18 deletions
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<vmValue> 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<ssaValue *> params;
Array<ssaDefer> defer_stmts;
Array<ssaBlock *> blocks;
i32 scope_index;
@@ -308,7 +309,6 @@ enum ssaValueKind {
ssaValue_Constant,
ssaValue_ConstantSlice,
- ssaValue_ConstantString,
ssaValue_Nil,
ssaValue_TypeName,
ssaValue_Global,
@@ -335,10 +335,6 @@ struct ssaValue {
i64 count;
} ConstantSlice;
struct {
- Type * type;
- String string;
- } ConstantString;
- struct {
Type *type;
} Nil;
struct {
@@ -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: