diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/codegen.cpp | 23 | ||||
| -rw-r--r-- | src/codegen/print_llvm.cpp | 26 | ||||
| -rw-r--r-- | src/codegen/ssa.cpp | 29 |
3 files changed, 52 insertions, 26 deletions
diff --git a/src/codegen/codegen.cpp b/src/codegen/codegen.cpp index 9999c7cdb..bb9b999ee 100644 --- a/src/codegen/codegen.cpp +++ b/src/codegen/codegen.cpp @@ -21,8 +21,9 @@ b32 ssa_gen_init(ssaGen *s, Checker *c) { // TODO(bill): generate appropriate output name int pos = cast(int)string_extension_position(c->parser->init_fullpath); gbFileError err = gb_file_create(&s->output_file, gb_bprintf("%.*s.ll", pos, c->parser->init_fullpath.text)); - if (err != gbFileError_None) + if (err != gbFileError_None) { return false; + } return true; } @@ -434,10 +435,10 @@ void ssa_gen_tree(ssaGen *s) { ssaValue *ordered = ssa_make_const_bool(a, t->Record.struct_is_ordered); ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_bool_ptr), packed); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_bool_ptr), ordered); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3, t_bool_ptr), packed); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_bool_ptr), ordered); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Record.field_count, &type_info_member_index); @@ -481,8 +482,8 @@ void ssa_gen_tree(ssaGen *s) { { ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); } break; case TypeRecord_RawUnion: { @@ -490,8 +491,8 @@ void ssa_gen_tree(ssaGen *s) { { ssaValue *size = ssa_make_const_int(a, type_size_of(m->sizes, a, t)); ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 3, t_int_ptr), size); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_int_ptr), align); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 1, t_int_ptr), size); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Record.field_count, &type_info_member_index); @@ -605,8 +606,8 @@ void ssa_gen_tree(ssaGen *s) { tag = ssa_add_local_generated(proc, t_type_info_tuple); { - ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); - ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 4, t_int_ptr), align); + ssaValue *align = ssa_make_const_int(a, type_align_of(m->sizes, a, t)); + ssa_emit_store(proc, ssa_emit_struct_gep(proc, tag, 2, t_int_ptr), align); } ssaValue *memory = type_info_member_offset(proc, type_info_member_data, t->Tuple.variable_count, &type_info_member_index); diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp index c3f57fa75..f565e3570 100644 --- a/src/codegen/print_llvm.cpp +++ b/src/codegen/print_llvm.cpp @@ -157,13 +157,7 @@ void ssa_print_type(ssaFileBuffer *f, ssaModule *m, Type *t) { case Basic_string: ssa_fprintf(f, "%%..string"); break; case Basic_uint: ssa_fprintf(f, "i%lld", word_bits); break; case Basic_int: ssa_fprintf(f, "i%lld", word_bits); break; - case Basic_any: - ssa_fprintf(f, "{"); - ssa_print_type(f, m, t_type_info_ptr); - ssa_fprintf(f, ", "); - ssa_print_type(f, m, t_rawptr); - ssa_fprintf(f, "}"); - break; + case Basic_any: ssa_fprintf(f, "%%..any"); break; } break; case Type_Array: @@ -491,7 +485,8 @@ void ssa_print_exact_value(ssaFileBuffer *f, ssaModule *m, ExactValue value, Typ } break; default: - GB_PANIC("Invalid ExactValue: %d", value.kind); + ssa_fprintf(f, "zeroinitializer"); + // GB_PANIC("Invalid ExactValue: %d", value.kind); break; } } @@ -538,6 +533,10 @@ void ssa_print_value(ssaFileBuffer *f, ssaModule *m, ssaValue *value, Type *type } } break; + case ssaValue_Nil: + ssa_fprintf(f, "zeroinitializer"); + break; + case ssaValue_TypeName: ssa_print_encoded_local(f, value->TypeName.name); break; @@ -1045,9 +1044,16 @@ void ssa_print_llvm_ir(ssaFileBuffer *f, ssaModule *m) { ssa_fprintf(f, " = type {i8*, "); ssa_print_type(f, m, t_int); ssa_fprintf(f, "} ; Basic_string\n"); - ssa_print_encoded_local(f, make_string("..rawptr")); - ssa_fprintf(f, " = type i8* ; Basic_rawptr\n\n"); + ssa_fprintf(f, " = type i8* ; Basic_rawptr\n"); + + ssa_print_encoded_local(f, make_string("..any")); + ssa_fprintf(f, " = type {"); + ssa_print_type(f, m, t_type_info_ptr); + ssa_fprintf(f, ", "); + ssa_print_type(f, m, t_rawptr); + ssa_fprintf(f, "} ; Basic_any\n"); + gb_for_array(member_index, m->members.entries) { auto *entry = &m->members.entries[member_index]; diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index b355f2acc..cb7c8c380 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -298,6 +298,7 @@ enum ssaValueKind { ssaValue_Constant, ssaValue_ConstantSlice, + ssaValue_Nil, ssaValue_TypeName, ssaValue_Global, ssaValue_Param, @@ -324,6 +325,9 @@ struct ssaValue { i64 count; } ConstantSlice; struct { + Type *type; + } Nil; + struct { String name; Type * type; } TypeName; @@ -540,6 +544,8 @@ Type *ssa_type(ssaValue *value) { return value->Constant.type; case ssaValue_ConstantSlice: return value->ConstantSlice.type; + case ssaValue_Nil: + return value->Nil.type; case ssaValue_TypeName: return value->TypeName.type; case ssaValue_Global: @@ -643,6 +649,12 @@ ssaValue *ssa_make_value_param(gbAllocator a, ssaProcedure *parent, Entity *e) { v->Param.type = e->type; return v; } +ssaValue *ssa_make_value_nil(gbAllocator a, Type *type) { + ssaValue *v = ssa_alloc_value(a, ssaValue_Nil); + v->Nil.type = type; + return v; +} + ssaValue *ssa_make_instr_local(ssaProcedure *p, Entity *e, b32 zero_initialized) { @@ -975,11 +987,8 @@ ssaValue *ssa_emit_comment(ssaProcedure *p, String text) { ssaValue *ssa_add_local(ssaProcedure *proc, Entity *e, b32 zero_initialized = true) { ssaBlock *b = proc->decl_block; // all variables must be in the first block ssaValue *instr = ssa_make_instr_local(proc, e, zero_initialized); - ssaValue *zero = ssa_make_instr_zero_init(proc, instr); instr->Instr.parent = b; - zero ->Instr.parent = b; gb_array_append(b->instrs, instr); - gb_array_append(b->instrs, zero); // if (zero_initialized) { ssa_emit_zero_init(proc, instr); @@ -1301,9 +1310,9 @@ ssaValue *ssa_emit_comp(ssaProcedure *proc, Token op, ssaValue *left, ssaValue * if (are_types_identical(a, b)) { // NOTE(bill): No need for a conversion - } else if (left->kind == ssaValue_Constant) { + } else if (left->kind == ssaValue_Constant || left->kind == ssaValue_Nil) { left = ssa_emit_conv(proc, left, ssa_type(right)); - } else if (right->kind == ssaValue_Constant) { + } else if (right->kind == ssaValue_Constant || right->kind == ssaValue_Nil) { right = ssa_emit_conv(proc, right, ssa_type(left)); } @@ -1880,6 +1889,10 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg if (is_type_any(dst)) { ssaValue *result = ssa_add_local_generated(proc, t_any); + if (is_type_untyped_nil(src)) { + return ssa_emit_load(proc, result); + } + ssaValue *data = NULL; if (value->kind == ssaValue_Instr && value->Instr.kind == ssaInstr_Load) { @@ -1905,6 +1918,10 @@ ssaValue *ssa_emit_conv(ssaProcedure *proc, ssaValue *value, Type *t, b32 is_arg return ssa_emit_load(proc, result); } + if (is_type_untyped_nil(src) && type_has_nil(dst)) { + return ssa_make_value_nil(proc->module->allocator, t); + } + gb_printf_err("Not Identical %s != %s\n", type_to_string(src_type), type_to_string(t)); gb_printf_err("Not Identical %s != %s\n", type_to_string(src), type_to_string(dst)); @@ -2035,6 +2052,8 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue "\t at %.*s(%td:%td)", LIT(builtin_procs[e->Builtin.id].name), LIT(token.pos.file), token.pos.line, token.pos.column); return NULL; + } else if (e->kind == Entity_Nil) { + return ssa_make_value_nil(proc->module->allocator, tv->type); } auto *found = map_get(&proc->module->values, hash_pointer(e)); |