aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-23 14:59:58 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-23 14:59:58 +0100
commita31bab5aae10757f5029b00e39beb0e3815b92b1 (patch)
treeb7d2f888cc553f4d6e4b47ff1470c303c5d05c7e /src/codegen
parentee0aa7b9de907e70e00ca3ab891087c2ee86a31b (diff)
Unicode file loading; push_allocator & push_context
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/codegen.cpp1
-rw-r--r--src/codegen/print_llvm.cpp15
-rw-r--r--src/codegen/ssa.cpp50
3 files changed, 55 insertions, 11 deletions
diff --git a/src/codegen/codegen.cpp b/src/codegen/codegen.cpp
index 4a4a7da46..e66d4fd03 100644
--- a/src/codegen/codegen.cpp
+++ b/src/codegen/codegen.cpp
@@ -48,7 +48,6 @@ String ssa_mangle_name(ssaGen *s, String path, String name) {
if (str[i] == '\\') {
str[i] = '/';
}
-
}
char const *base = gb_path_base_name(str);
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index 313299552..9b90106df 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -84,8 +84,11 @@ void ssa_print_escape_string(ssaFileBuffer *f, String name, b32 print_quotes) {
char hex_table[] = "0123456789ABCDEF";
isize buf_len = name.len + extra + 2;
- u8 *buf = gb_alloc_array(gb_heap_allocator(), u8, buf_len);
- defer (gb_free(gb_heap_allocator(), buf));
+
+ gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&string_buffer_arena);
+ defer (gb_temp_arena_memory_end(tmp));
+
+ u8 *buf = gb_alloc_array(string_buffer_allocator, u8, buf_len);
isize j = 0;
@@ -809,9 +812,11 @@ void ssa_print_proc(ssaFileBuffer *f, ssaModule *m, ssaProcedure *proc) {
if (proc->module->generate_debug_info && proc->entity != NULL) {
- ssaDebugInfo *di = *map_get(&proc->module->debug_info, hash_pointer(proc->entity));
- GB_ASSERT(di->kind == ssaDebugInfo_Proc);
- ssa_fprintf(f, "!dbg !%d ", di->id);
+ if (proc->body != NULL) {
+ ssaDebugInfo *di = *map_get(&proc->module->debug_info, hash_pointer(proc->entity));
+ GB_ASSERT(di->kind == ssaDebugInfo_Proc);
+ ssa_fprintf(f, "!dbg !%d ", di->id);
+ }
}
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index 66d00ed0f..f64da951c 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -2200,10 +2200,10 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssaValue *elem_size = ssa_make_const_int(allocator, s);
ssaValue *elem_align = ssa_make_const_int(allocator, a);
- ssaValue *len = ssa_build_expr(proc, ce->args[1]);
+ ssaValue *len =ssa_emit_conv(proc, ssa_build_expr(proc, ce->args[1]), t_int);
ssaValue *cap = len;
if (gb_array_count(ce->args) == 3) {
- cap = ssa_build_expr(proc, ce->args[2]);
+ cap = ssa_emit_conv(proc, ssa_build_expr(proc, ce->args[2]), t_int);
}
ssa_slice_bounds_check(proc, ast_node_token(ce->args[1]), v_zero, len, cap, false);
@@ -2218,9 +2218,13 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssaValue *ptr = ssa_emit_conv(proc, call, ptr_type, true);
ssaValue *slice = ssa_add_local_generated(proc, slice_type);
- ssa_emit_store(proc, ssa_emit_struct_gep(proc, slice, v_zero32, ptr_type), ptr);
- ssa_emit_store(proc, ssa_emit_struct_gep(proc, slice, v_one32, t_int), len);
- ssa_emit_store(proc, ssa_emit_struct_gep(proc, slice, v_two32, t_int), cap);
+
+ ssaValue *gep0 = ssa_emit_struct_gep(proc, slice, v_zero32, ptr_type);
+ ssaValue *gep1 = ssa_emit_struct_gep(proc, slice, v_one32, t_int);
+ ssaValue *gep2 = ssa_emit_struct_gep(proc, slice, v_two32, t_int);
+ ssa_emit_store(proc, gep0, ptr);
+ ssa_emit_store(proc, gep1, len);
+ ssa_emit_store(proc, gep2, cap);
return ssa_emit_load(proc, slice);
} break;
@@ -3678,6 +3682,42 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) {
ssa_emit_unreachable(proc);
case_end;
+
+
+ case_ast_node(pa, PushAllocator, node);
+ ssa_emit_comment(proc, make_string("PushAllocator"));
+
+ ssaValue *context_ptr = *map_get(&proc->module->members, hash_string(make_string("__context")));
+ ssaValue *prev_context = ssa_add_local_generated(proc, t_context);
+ ssa_emit_store(proc, prev_context, ssa_emit_load(proc, context_ptr));
+ defer (ssa_emit_store(proc, context_ptr, ssa_emit_load(proc, prev_context)));
+
+ ssaValue *gep = ssa_emit_struct_gep(proc, context_ptr, 1, t_allocator_ptr);
+ ssa_emit_store(proc, gep, ssa_build_expr(proc, pa->expr));
+
+ proc->scope_index++;
+ ssa_build_stmt(proc, pa->body);
+ proc->scope_index--;
+
+ case_end;
+
+
+ case_ast_node(pa, PushContext, node);
+ ssa_emit_comment(proc, make_string("PushContext"));
+
+ ssaValue *context_ptr = *map_get(&proc->module->members, hash_string(make_string("__context")));
+ ssaValue *prev_context = ssa_add_local_generated(proc, t_context);
+ ssa_emit_store(proc, prev_context, ssa_emit_load(proc, context_ptr));
+ defer (ssa_emit_store(proc, context_ptr, ssa_emit_load(proc, prev_context)));
+
+ ssa_emit_store(proc, context_ptr, ssa_build_expr(proc, pa->expr));
+
+ proc->scope_index++;
+ ssa_build_stmt(proc, pa->body);
+ proc->scope_index--;
+ case_end;
+
+
}
}