aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/ssa.cpp
diff options
context:
space:
mode:
authorGinger Bill <github@gingerbill.org>2016-09-21 14:46:56 +0100
committerGinger Bill <github@gingerbill.org>2016-09-21 14:46:56 +0100
commit0e2347e582147019f904e25cf26aa70259c66e38 (patch)
tree4f3aff27dd23764d3c46afbfd94a4f65a87bc37c /src/codegen/ssa.cpp
parent31c11a50370ded9865cf8c1da6baabaa97d38a18 (diff)
Filename as default import name; as .; as _; panic()
Diffstat (limited to 'src/codegen/ssa.cpp')
-rw-r--r--src/codegen/ssa.cpp49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp
index 9342e5931..b45bbe5d5 100644
--- a/src/codegen/ssa.cpp
+++ b/src/codegen/ssa.cpp
@@ -2230,38 +2230,49 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssa_emit_if(proc, cond, err, done);
proc->curr_block = err;
+ // TODO(bill): Cleanup allocations here
Token token = ast_node_token(ce->args[0]);
TokenPos pos = token.pos;
gbString expr = expr_to_string(ce->args[0]);
defer (gb_string_free(expr));
+ isize expr_len = gb_string_length(expr);
+ String expr_str = {};
+ expr_str.text = cast(u8 *)gb_alloc_copy_align(proc->module->allocator, expr, expr_len, 1);
+ expr_str.len = expr_len;
+
+ ssaValue **args = gb_alloc_array(proc->module->allocator, ssaValue *, 4);
+ args[0] = ssa_emit_global_string(proc, pos.file);
+ args[1] = ssa_make_const_int(proc->module->allocator, pos.line);
+ args[2] = ssa_make_const_int(proc->module->allocator, pos.column);
+ args[3] = ssa_emit_global_string(proc, expr_str);
+ ssa_emit_global_call(proc, "__assert", args, 4);
- isize err_len = pos.file.len + 1 + 10 + 1 + 10 + 1;
- err_len += 20;
- err_len += gb_string_length(expr);
- err_len += 2;
+ ssa_emit_jump(proc, done);
+ gb_array_append(proc->blocks, done);
+ proc->curr_block = done;
- u8 *err_str = gb_alloc_array(proc->module->allocator, u8, err_len);
- err_len = gb_snprintf(cast(char *)err_str, err_len,
- "%.*s(%td:%td) Runtime assertion: %s\n",
- LIT(pos.file), pos.line, pos.column, expr);
- err_len--;
+ return NULL;
+ } break;
- ssaValue *array = ssa_add_global_string_array(proc->module, make_string(err_str, err_len));
- ssaValue *elem = ssa_array_elem(proc, array);
- ssaValue *len = ssa_make_const_int(proc->module->allocator, err_len);
- ssaValue *string = ssa_emit_string(proc, elem, len);
+ case BuiltinProc_panic: {
+ ssa_emit_comment(proc, make_string("panic"));
+ ssaValue *msg = ssa_build_expr(proc, ce->args[0]);
+ GB_ASSERT(is_type_string(ssa_type(msg)));
- ssaValue **args = gb_alloc_array(proc->module->allocator, ssaValue *, 1);
- args[0] = string;
- ssa_emit_global_call(proc, "__assert", args, 1);
+ Token token = ast_node_token(ce->args[0]);
+ TokenPos pos = token.pos;
- ssa_emit_jump(proc, done);
- gb_array_append(proc->blocks, done);
- proc->curr_block = done;
+ ssaValue **args = gb_alloc_array(proc->module->allocator, ssaValue *, 4);
+ args[0] = ssa_emit_global_string(proc, pos.file);
+ args[1] = ssa_make_const_int(proc->module->allocator, pos.line);
+ args[2] = ssa_make_const_int(proc->module->allocator, pos.column);
+ args[3] = msg;
+ ssa_emit_global_call(proc, "__assert", args, 4);
return NULL;
} break;
+
case BuiltinProc_copy: {
ssa_emit_comment(proc, make_string("copy"));
// copy :: proc(dst, src: []Type) -> int