aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/codegen.cpp23
-rw-r--r--src/codegen/print_llvm.cpp26
-rw-r--r--src/codegen/ssa.cpp29
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));