aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-07-10 22:59:23 +0100
committerGinger Bill <bill@gingerbill.org>2017-07-10 22:59:23 +0100
commitba5050ac7c2eb116b8989b7d387e67eb79eec62a (patch)
treed36d5cc1c9c6e31c88b27109792f21ca21e8a23f /src/ir.cpp
parentd936ca1ea003f82e0fda330cbad1f5bcf4387df2 (diff)
Compiler Internal Changes: TypeRecord_Union -> Type_Union
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp118
1 files changed, 42 insertions, 76 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index bdb9c7c1c..4ff15ca32 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -2949,8 +2949,8 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) {
}
if (is_type_union(dst)) {
- for (isize i = 1; i < dst->Record.variant_count; i++) {
- Type *vt = dst->Record.variants[i];
+ for (isize i = 1; i < dst->Union.variant_count; i++) {
+ Type *vt = dst->Union.variants[i];
if (are_types_identical(vt, src_type)) {
ir_emit_comment(proc, str_lit("union - child to parent"));
gbAllocator a = proc->module->allocator;
@@ -3290,8 +3290,8 @@ irValue *ir_emit_union_cast(irProcedure *proc, irValue *value, Type *type, Token
irValue *tag = ir_emit_load(proc, ir_emit_union_tag_ptr(proc, value_));
irValue *dst_tag = nullptr;
- for (isize i = 1; i < src->Record.variant_count; i++) {
- Type *vt = src->Record.variants[i];
+ for (isize i = 1; i < src->Union.variant_count; i++) {
+ Type *vt = src->Union.variants[i];
if (are_types_identical(vt, dst)) {
dst_tag = ir_const_int(a, i);
break;
@@ -6825,9 +6825,9 @@ void ir_build_stmt_internal(irProcedure *proc, AstNode *node) {
Type *bt = type_deref(case_type);
irValue *index = nullptr;
Type *ut = base_type(type_deref(parent_type));
- GB_ASSERT(ut->Record.kind == TypeRecord_Union);
- for (isize variant_index = 1; variant_index < ut->Record.variant_count; variant_index++) {
- Type *vt = ut->Record.variants[variant_index];
+ GB_ASSERT(ut->kind == Type_Union);
+ for (isize variant_index = 1; variant_index < ut->Union.variant_count; variant_index++) {
+ Type *vt = ut->Union.variants[variant_index];
if (are_types_identical(vt, bt)) {
index = ir_const_int(allocator, variant_index);
break;
@@ -7232,16 +7232,15 @@ void ir_init_module(irModule *m, Checker *c) {
Type *t = cast(Type *)entry->key.ptr;
switch (t->kind) {
+ case Type_Union:
+ count += t->Union.variant_count;
+ break;
case Type_Record:
switch (t->Record.kind) {
case TypeRecord_Struct:
case TypeRecord_RawUnion:
count += t->Record.field_count;
break;
- case TypeRecord_Union:
- count += t->Record.field_count;
- count += t->Record.variant_count;
- break;
}
break;
case Type_Tuple:
@@ -8044,6 +8043,36 @@ void ir_gen_tree(irGen *s) {
}
}
break;
+
+ case Type_Union: {
+ ir_emit_comment(proc, str_lit("TypeInfoUnion"));
+ tag = ir_emit_conv(proc, variant_ptr, t_type_info_union_ptr);
+
+ {
+ irValue *variant_names = ir_emit_struct_ep(proc, tag, 1);
+ irValue *variant_types = ir_emit_struct_ep(proc, tag, 2);
+
+ isize variant_count = gb_max(0, t->Union.variant_count-1);
+ irValue *memory_names = ir_type_info_member_names_offset(proc, variant_count);
+ irValue *memory_types = ir_type_info_member_types_offset(proc, variant_count);
+
+ // NOTE(bill): Zeroth is nil so ignore it
+ for (isize variant_index = 0; variant_index < variant_count; variant_index++) {
+ Type *vt = t->Union.variants[variant_index+1]; // Skip zeroth
+ irValue *tip = ir_get_type_info_ptr(proc, vt);
+
+ irValue *index = ir_const_int(a, variant_index);
+ irValue *type_info = ir_emit_ptr_offset(proc, memory_types, index);
+ ir_emit_store(proc, type_info, ir_type_info(proc, vt));
+ }
+
+ irValue *count = ir_const_int(a, variant_count);
+ ir_fill_slice(proc, variant_names, memory_names, count, count);
+ ir_fill_slice(proc, variant_types, memory_types, count, count);
+ }
+
+ } break;
+
case Type_Record: {
switch (t->Record.kind) {
case TypeRecord_Struct: {
@@ -8092,69 +8121,6 @@ void ir_gen_tree(irGen *s) {
ir_fill_slice(proc, ir_emit_struct_ep(proc, tag, 2), memory_offsets, count, count);
ir_fill_slice(proc, ir_emit_struct_ep(proc, tag, 3), memory_usings, count, count);
} break;
- case TypeRecord_Union: {
- ir_emit_comment(proc, str_lit("TypeInfoUnion"));
- tag = ir_emit_conv(proc, variant_ptr, t_type_info_union_ptr);
-
- {
- irValue *common_fields = ir_emit_struct_ep(proc, tag, 0);
-
- isize field_count = t->Record.field_count;
- irValue *memory_types = ir_type_info_member_types_offset(proc, field_count);
- irValue *memory_names = ir_type_info_member_names_offset(proc, field_count);
- irValue *memory_offsets = ir_type_info_member_offsets_offset(proc, field_count);
-
- type_set_offsets(a, t); // NOTE(bill): Just incase the offsets have not been set yet
- for (isize field_index = 0; field_index < field_count; field_index++) {
- // TODO(bill): Order fields in source order not layout order
- Entity *f = t->Record.fields[field_index];
- irValue *tip = ir_get_type_info_ptr(proc, f->type);
- i64 foffset = t->Record.offsets[f->Variable.field_index];
- GB_ASSERT(f->kind == Entity_Variable && f->flags & EntityFlag_Field);
-
- irValue *index = ir_const_int(a, field_index);
- irValue *type_info = ir_emit_ptr_offset(proc, memory_types, index);
- irValue *offset = ir_emit_ptr_offset(proc, memory_offsets, index);
-
- ir_emit_store(proc, type_info, ir_type_info(proc, f->type));
- if (f->token.string.len > 0) {
- irValue *name = ir_emit_ptr_offset(proc, memory_names, index);
- ir_emit_store(proc, name, ir_const_string(a, f->token.string));
- }
- ir_emit_store(proc, offset, ir_const_int(a, foffset));
- }
-
-
- irValue *count = ir_const_int(a, field_count);
- ir_fill_slice(proc, ir_emit_struct_ep(proc, common_fields, 0), memory_types, count, count);
- ir_fill_slice(proc, ir_emit_struct_ep(proc, common_fields, 1), memory_names, count, count);
- ir_fill_slice(proc, ir_emit_struct_ep(proc, common_fields, 2), memory_offsets, count, count);
- }
-
- {
- irValue *variant_names = ir_emit_struct_ep(proc, tag, 1);
- irValue *variant_types = ir_emit_struct_ep(proc, tag, 2);
-
- isize variant_count = gb_max(0, t->Record.variant_count-1);
- irValue *memory_names = ir_type_info_member_names_offset(proc, variant_count);
- irValue *memory_types = ir_type_info_member_types_offset(proc, variant_count);
-
- // NOTE(bill): Zeroth is nil so ignore it
- for (isize variant_index = 0; variant_index < variant_count; variant_index++) {
- Type *vt = t->Record.variants[variant_index+1]; // Skip zeroth
- irValue *tip = ir_get_type_info_ptr(proc, vt);
-
- irValue *index = ir_const_int(a, variant_index);
- irValue *type_info = ir_emit_ptr_offset(proc, memory_types, index);
- ir_emit_store(proc, type_info, ir_type_info(proc, vt));
- }
-
- irValue *count = ir_const_int(a, variant_count);
- ir_fill_slice(proc, variant_names, memory_names, count, count);
- ir_fill_slice(proc, variant_types, memory_types, count, count);
- }
-
- } break;
case TypeRecord_RawUnion: {
ir_emit_comment(proc, str_lit("TypeInfoRawUnion"));
tag = ir_emit_conv(proc, variant_ptr, t_type_info_raw_union_ptr);
@@ -8250,8 +8216,8 @@ void ir_gen_tree(irGen *s) {
Type *tiv = base_type(ti->Record.fields_in_src_order[2]->type);
GB_ASSERT(is_type_union(tiv));
bool found = false;
- for (isize i = 1; i < tiv->Record.variant_count; i++) {
- Type *vt = tiv->Record.variants[i];
+ for (isize i = 1; i < tiv->Union.variant_count; i++) {
+ Type *vt = tiv->Union.variants[i];
if (are_types_identical(vt, tag_type)) {
found = true;
irValue *tag_val = ir_const_int(a, i);