aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-05-12 21:22:39 +0100
committergingerBill <bill@gingerbill.org>2018-05-12 21:22:39 +0100
commit3b48fa8e7d87c9a6270cf1e59c67c66c3f3f9410 (patch)
treeaa2a2ed5d1a25dfd69797c8489b5889bf2b751ff /src/ir.cpp
parent324b7d65e7aa3c4dd5b817daf320974cfe5d0c15 (diff)
Fix default initialized values for globals (#217)
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp100
1 files changed, 59 insertions, 41 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 7197534ae..3511d8482 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -334,6 +334,7 @@ enum irValueKind {
irValue_TypeName,
irValue_Global,
irValue_Param,
+ irValue_SourceCodeLocation,
irValue_Proc,
irValue_Block,
@@ -397,6 +398,13 @@ struct irValueParam {
Array<irValue *> referrers;
};
+struct irValueSourceCodeLocation {
+ irValue *file;
+ irValue *line;
+ irValue *column;
+ irValue *procedure;
+};
+
struct irValue {
irValueKind kind;
@@ -414,6 +422,7 @@ struct irValue {
irProcedure Proc;
irBlock Block;
irInstr Instr;
+ irValueSourceCodeLocation SourceCodeLocation;
};
};
@@ -663,6 +672,8 @@ Type *ir_type(irValue *value) {
return value->Global.type;
case irValue_Param:
return value->Param.type;
+ case irValue_SourceCodeLocation:
+ return t_source_code_location;
case irValue_Proc:
return value->Proc.type;
case irValue_Instr:
@@ -4121,12 +4132,12 @@ bool is_double_pointer(Type *t) {
irValue *ir_emit_source_code_location(irProcedure *proc, String procedure, TokenPos pos) {
gbAllocator a = proc->module->allocator;
- auto args = array_make<irValue *>(proc->module->allocator, 4);
- args[0] = ir_find_or_add_entity_string(proc->module, pos.file);
- args[1] = ir_const_int(a, pos.line);
- args[2] = ir_const_int(a, pos.column);
- args[3] = ir_find_or_add_entity_string(proc->module, procedure);
- return ir_emit_global_call(proc, "make_source_code_location", args);
+ irValue *v = ir_alloc_value(a, irValue_SourceCodeLocation);
+ v->SourceCodeLocation.file = ir_find_or_add_entity_string(proc->module, pos.file);
+ v->SourceCodeLocation.line = ir_const_int(a, pos.line);
+ v->SourceCodeLocation.column = ir_const_int(a, pos.column);
+ v->SourceCodeLocation.procedure = ir_find_or_add_entity_string(proc->module, procedure);
+ return v;
}
@@ -7695,6 +7706,11 @@ void ir_init_module(irModule *m, Checker *c) {
for_array(entry_index, m->info->type_info_types) {
Type *t = m->info->type_info_types[entry_index];
+ isize index = ir_type_info_index(m->info, t, false);
+ if (index < 0) {
+ continue;
+ }
+
switch (t->kind) {
case Type_Union:
count += t->Union.variants.count;
@@ -7708,42 +7724,44 @@ void ir_init_module(irModule *m, Checker *c) {
}
}
- {
- String name = str_lit(IR_TYPE_INFO_TYPES_NAME);
- Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
- alloc_type_array(t_type_info_ptr, count), false);
- irValue *g = ir_value_global(m->allocator, e, nullptr);
- ir_module_add_value(m, e, g);
- map_set(&m->members, hash_string(name), g);
- ir_global_type_info_member_types = g;
- }
- {
- String name = str_lit(IR_TYPE_INFO_NAMES_NAME);
- Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
- alloc_type_array(t_string, count), false);
- irValue *g = ir_value_global(m->allocator, e, nullptr);
- ir_module_add_value(m, e, g);
- map_set(&m->members, hash_string(name), g);
- ir_global_type_info_member_names = g;
- }
- {
- String name = str_lit(IR_TYPE_INFO_OFFSETS_NAME);
- Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
- alloc_type_array(t_uintptr, count), false);
- irValue *g = ir_value_global(m->allocator, e, nullptr);
- ir_module_add_value(m, e, g);
- map_set(&m->members, hash_string(name), g);
- ir_global_type_info_member_offsets = g;
- }
+ if (count > 0) {
+ {
+ String name = str_lit(IR_TYPE_INFO_TYPES_NAME);
+ Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
+ alloc_type_array(t_type_info_ptr, count), false);
+ irValue *g = ir_value_global(m->allocator, e, nullptr);
+ ir_module_add_value(m, e, g);
+ map_set(&m->members, hash_string(name), g);
+ ir_global_type_info_member_types = g;
+ }
+ {
+ String name = str_lit(IR_TYPE_INFO_NAMES_NAME);
+ Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
+ alloc_type_array(t_string, count), false);
+ irValue *g = ir_value_global(m->allocator, e, nullptr);
+ ir_module_add_value(m, e, g);
+ map_set(&m->members, hash_string(name), g);
+ ir_global_type_info_member_names = g;
+ }
+ {
+ String name = str_lit(IR_TYPE_INFO_OFFSETS_NAME);
+ Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
+ alloc_type_array(t_uintptr, count), false);
+ irValue *g = ir_value_global(m->allocator, e, nullptr);
+ ir_module_add_value(m, e, g);
+ map_set(&m->members, hash_string(name), g);
+ ir_global_type_info_member_offsets = g;
+ }
- {
- String name = str_lit(IR_TYPE_INFO_USINGS_NAME);
- Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
- alloc_type_array(t_bool, count), false);
- irValue *g = ir_value_global(m->allocator, e, nullptr);
- ir_module_add_value(m, e, g);
- map_set(&m->members, hash_string(name), g);
- ir_global_type_info_member_usings = g;
+ {
+ String name = str_lit(IR_TYPE_INFO_USINGS_NAME);
+ Entity *e = alloc_entity_variable(nullptr, make_token_ident(name),
+ alloc_type_array(t_bool, count), false);
+ irValue *g = ir_value_global(m->allocator, e, nullptr);
+ ir_module_add_value(m, e, g);
+ map_set(&m->members, hash_string(name), g);
+ ir_global_type_info_member_usings = g;
+ }
}
}
}