aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/print_llvm.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-03 18:18:45 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-03 18:18:45 +0100
commit7f884ed25187416bb3994e498eae30fe65233940 (patch)
treed7386614920f6d56ea184efd638d9132a34ea682 /src/codegen/print_llvm.cpp
parent11205f968ad2bf4893fa75df3fc3331f960039d1 (diff)
Start implementing Tagged Unions
Diffstat (limited to 'src/codegen/print_llvm.cpp')
-rw-r--r--src/codegen/print_llvm.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/codegen/print_llvm.cpp b/src/codegen/print_llvm.cpp
index 6f63c0108..ecbf48d54 100644
--- a/src/codegen/print_llvm.cpp
+++ b/src/codegen/print_llvm.cpp
@@ -158,6 +158,10 @@ void ssa_print_type(gbFile *f, BaseTypeSizes s, Type *t) {
ssa_fprintf(f, ">");
}
break;
+ case TypeRecord_Union: {
+ i64 size_of_union = type_size_of(s, gb_heap_allocator(), t) - s.word_size;
+ ssa_fprintf(f, "{i%lld, [%lld x i8]}", word_bits, size_of_union);
+ } break;
case TypeRecord_RawUnion:
ssa_fprintf(f, "[%lld x i8]", type_size_of(s, gb_heap_allocator(), t));
break;
@@ -172,7 +176,7 @@ void ssa_print_type(gbFile *f, BaseTypeSizes s, Type *t) {
ssa_fprintf(f, "*");
break;
case Type_Named:
- if (is_type_struct(t)) {
+ if (is_type_struct(t) || is_type_union(t)) {
ssa_print_encoded_local(f, t->Named.name);
} else {
ssa_print_type(f, s, get_base_type(t));
@@ -454,7 +458,6 @@ void ssa_print_instr(gbFile *f, ssaModule *m, ssaValue *value) {
ssa_fprintf(f, "%%%d = ", value->id);
if (gb_is_between(bo->op.kind, Token__ComparisonBegin+1, Token__ComparisonEnd-1)) {
-
if (is_type_string(elem_type)) {
ssa_fprintf(f, "call ");
ssa_print_type(f, m->sizes, t_bool);
@@ -756,8 +759,9 @@ void ssa_print_proc(gbFile *f, ssaModule *m, ssaProcedure *proc) {
void ssa_print_type_name(gbFile *f, ssaModule *m, ssaValue *v) {
GB_ASSERT(v->kind == ssaValue_TypeName);
Type *base_type = get_base_type(ssa_type(v));
- if (!is_type_struct(base_type))
+ if (!is_type_struct(base_type) && !is_type_union(base_type)) {
return;
+ }
ssa_print_encoded_local(f, v->TypeName.name);
ssa_fprintf(f, " = type ");
ssa_print_type(f, m->sizes, get_base_type(v->TypeName.type));