From 0dd17fe84308bba09c6d2ba15f8b8504bbcf5c89 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Aug 2016 21:22:44 +0100 Subject: Win32 Window Test --- src/codegen/ssa.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'src/codegen/ssa.cpp') diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index 1ccbcf5d6..3df8cbd81 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -46,6 +46,7 @@ struct ssaProcedure { Type * type; AstNode * type_expr; AstNode * body; + u64 tags; gbArray(ssaBlock *) blocks; ssaBlock * curr_block; @@ -318,13 +319,13 @@ Type *ssa_instr_type(ssaInstr *instr) { case ssaInstr_Select: return ssa_value_type(instr->select.true_value); case ssaInstr_Call: { - Type *pt = instr->call.type; - GB_ASSERT(pt->kind == Type_Proc); - auto *tuple = &pt->proc.results->tuple; - if (tuple->variable_count != 1) - return pt->proc.results; - else - return tuple->variables[0]->type; + Type *pt = get_base_type(instr->call.type); + if (pt != NULL) { + if (pt->kind == Type_Tuple && pt->tuple.variable_count == 1) + return pt->tuple.variables[0]->type; + return pt; + } + return NULL; } case ssaInstr_CopyMemory: return t_int; @@ -891,7 +892,7 @@ void ssa_end_procedure_body(ssaProcedure *proc) { case ssaInstr_CopyMemory: continue; case ssaInstr_Call: - if (instr->call.type->proc.results == NULL) { + if (instr->call.type == NULL) { continue; } break; @@ -1194,6 +1195,7 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t) { return value; } + Type *src = get_base_type(src_type); Type *dst = get_base_type(t); if (are_types_identical(t, src_type)) @@ -1208,6 +1210,10 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t) { // } else if (is_type_integer(dst)) { ev = exact_value_to_integer(ev); + } else if (is_type_pointer(dst)) { + // IMPORTANT NOTE(bill): LLVM doesn't support pointer constants expect `null` + ssaValue *i = ssa_make_value_constant(proc->module->allocator, t_uint, ev); + return ssa_emit(proc, ssa_make_instr_conv(proc, ssaConv_inttoptr, i, t_uint, dst)); } return ssa_make_value_constant(proc->module->allocator, t, ev); } @@ -1459,6 +1465,8 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue ssaValue *value = ssa_make_value_procedure(proc->module->allocator, proc->module, type, pl->type, pl->body, name); + value->proc.tags = pl->tags; + gb_array_append(proc->children, &value->proc); ssa_build_proc(value, proc); @@ -1693,8 +1701,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue } } - ssaValue *call = ssa_make_instr_call(proc, value, args, arg_count, tv->type); - ssa_value_set_type(call, proc_type_); + ssaValue *call = ssa_make_instr_call(proc, value, args, arg_count, type->results); return ssa_emit(proc, call); case_end; @@ -1725,6 +1732,7 @@ ssaValue *ssa_build_expr(ssaProcedure *proc, AstNode *expr) { ssaValue *elem = ssa_array_elem(proc, array); return ssa_emit_load(proc, ssa_emit_string(proc, elem, ssa_array_len(proc, array))); } + return ssa_make_value_constant(proc->module->allocator, tv->type, tv->value); } @@ -2043,6 +2051,8 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { if (proc->children == NULL) { gb_array_init(proc->children, gb_heap_allocator()); } + + if (pd->body != NULL) { // NOTE(bill): Generate a new name // parent$name-guid @@ -2059,6 +2069,8 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { ssaValue *value = ssa_make_value_procedure(proc->module->allocator, proc->module, e->type, pd->type, pd->body, name); + value->proc.tags = pd->tags; + ssa_module_add_value(proc->module, e, value); gb_array_append(proc->children, &value->proc); ssa_build_proc(value, proc); @@ -2273,7 +2285,7 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { proc->curr_block = init; ssa_build_stmt(proc, fs->init); } - ssaBlock *body = ssa__make_block(proc, node, make_string("for.body")); + ssaBlock *body = ssa_add_block(proc, node, make_string("for.body")); ssaBlock *done = ssa__make_block(proc, node, make_string("for.done")); // NOTE(bill): Append later ssaBlock *loop = body; @@ -2289,7 +2301,6 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) { proc->curr_block = loop; if (loop != body) { ssa_build_cond(proc, fs->cond, body, done); - gb_array_append(proc->blocks, body); proc->curr_block = body; } -- cgit v1.2.3