aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp42
1 files changed, 36 insertions, 6 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 18e7eed6a..f4f795e6d 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -3586,13 +3586,41 @@ gb_global i32 ir_global_type_info_member_names_index = 0;
gb_global i32 ir_global_type_info_member_offsets_index = 0;
gb_global i32 ir_global_type_info_member_usings_index = 0;
+#if 1
+isize ir_type_info_count(CheckerInfo *info) {
+ return info->minimum_dependency_type_info_set.entries.count+1;
+}
+
+isize ir_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=true) {
+ isize index = type_info_index(info, type);
+ auto *set = &info->minimum_dependency_type_info_set;
+ for_array(i, set->entries) {
+ if (set->entries[i].ptr == index) {
+ return i+1;
+ }
+ }
+ if (err_on_not_found) {
+ GB_PANIC("NOT FOUND ir_type_info_index %s", type_to_string(type));
+ }
+ return -1;
+}
+#else
+isize ir_type_info_count(CheckerInfo *info) {
+ return info->type_info_types.count;
+}
+
+isize ir_type_info_index(CheckerInfo *info, Type *type) {
+ isize index = type_info_index(info, type);
+ return index;
+}
+#endif
irValue *ir_type_info(irProcedure *proc, Type *type) {
CheckerInfo *info = proc->module->info;
type = default_type(type);
- i32 entry_index = cast(i32)type_info_index(info, type);
+ i32 entry_index = cast(i32)ir_type_info_index(info, type);
GB_ASSERT(entry_index >= 0);
// gb_printf_err("%d %s\n", entry_index, type_to_string(type));
@@ -4173,7 +4201,6 @@ irValue *ir_build_builtin_proc(irProcedure *proc, AstNode *expr, TypeAndValue tv
case BuiltinProc_type_info_of: {
Type *t = default_type(type_of_expr(proc->module->info, ce->args[0]));
return ir_type_info(proc, t);
- break;
}
case BuiltinProc_len: {
@@ -4806,7 +4833,7 @@ irValue *ir_build_expr_internal(irProcedure *proc, AstNode *expr) {
if (tv.mode == Addressing_Type) {
// // TODO(bill): Handle this correctly
#if 0
- i32 entry_index = type_info_index(proc->module->info, tv.type, false);
+ i32 entry_index = ir_type_info_index(proc->module->info, tv.type, false);
if (entry_index >= 0) {
return ir_get_type_info_ptr(proc, tv.type);
// i32 id = entry_index+1;
@@ -7615,7 +7642,7 @@ void ir_init_module(irModule *m, Checker *c) {
{
// Add type info data
{
- isize max_type_info_count = m->info->type_info_types.count;
+ isize max_type_info_count = ir_type_info_count(m->info);
String name = str_lit(IR_TYPE_INFO_DATA_NAME);
Entity *e = alloc_entity_variable(nullptr, make_token_ident(name), alloc_type_array(t_type_info, max_type_info_count), false);
@@ -7774,7 +7801,7 @@ void ir_gen_destroy(irGen *s) {
// Type Info stuff
//
irValue *ir_get_type_info_ptr(irProcedure *proc, Type *type) {
- i32 index = cast(i32)type_info_index(proc->module->info, type);
+ i32 index = cast(i32)ir_type_info_index(proc->module->info, type);
// gb_printf_err("%d %s\n", index, type_to_string(type));
irValue *ptr = ir_emit_array_epi(proc, ir_global_type_info_data, index);
return ir_emit_bitcast(proc, ptr, t_type_info_ptr);
@@ -7837,7 +7864,10 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info
continue;
}
- isize entry_index = type_info_index(info, t);
+ isize entry_index = ir_type_info_index(info, t, false);
+ if (entry_index <= 0) {
+ continue;
+ }
irValue *tag = nullptr;
irValue *ti_ptr = ir_emit_array_epi(proc, ir_global_type_info_data, cast(i32)entry_index);