aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-09-29 21:11:16 +0100
committerGinger Bill <bill@gingerbill.org>2017-09-29 21:11:16 +0100
commit11614c2649aa28a642e4d699cf447d6938057190 (patch)
tree4a9748c2a27801dcc4f585f4eb622e1ea539813b /src/ir.cpp
parent793bc8c58580dfb64d7c31ca992c34b38e9847e7 (diff)
Fix old_demos; Fix `when` bug; Fix enum `.names`
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 97b8f787d..2fbcee70a 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -853,10 +853,19 @@ String ir_get_global_name(irModule *m, irValue *v) {
String *found = map_get(&m->entity_names, hash_entity(e));
if (found != nullptr) {
name = *found;
+ } else {
+ GB_ASSERT(name.len > 0);
}
return name;
}
+void ir_add_entity_name(irModule *m, Entity *e, String name) {
+ GB_ASSERT(name.len > 0);
+ map_set(&m->entity_names, hash_entity(e), name);
+}
+
+
+
irValue *ir_instr_local(irProcedure *p, Entity *e, bool zero_initialized) {
@@ -1153,14 +1162,21 @@ irValue *ir_generate_array(irModule *m, Type *elem_type, i64 count, String prefi
gbAllocator a = m->allocator;
Token token = {Token_Ident};
isize name_len = prefix.len + 10;
- token.string.text = gb_alloc_array(a, u8, name_len);
- token.string.len = gb_snprintf(cast(char *)token.string.text, name_len,
- "%.*s-%llx", LIT(prefix), cast(unsigned long long)id)-1;
- Entity *e = make_entity_variable(a, nullptr, token, make_type_array(a, elem_type, count), false);
+
+ char *text = gb_alloc_array(a, char, name_len);
+ gb_snprintf(text, name_len,
+ "%.*s-%llx", LIT(prefix), cast(unsigned long long)id);
+
+ String s = make_string_c(text);
+
+ Entity *e = make_entity_variable(a, nullptr,
+ make_token_ident(s),
+ make_type_array(a, elem_type, count),
+ false);
irValue *value = ir_value_global(a, e, nullptr);
value->Global.is_private = true;
ir_module_add_value(m, e, value);
- map_set(&m->members, hash_string(token.string), value);
+ map_set(&m->members, hash_string(s), value);
return value;
}
@@ -3436,6 +3452,7 @@ irValue *ir_type_info(irProcedure *proc, Type *type) {
type = default_type(type);
i32 entry_index = cast(i32)type_info_index(info, type);
+ GB_ASSERT(entry_index >= 0);
// gb_printf_err("%d %s\n", entry_index, type_to_string(type));
@@ -3639,7 +3656,8 @@ void ir_mangle_add_sub_type_name(irModule *m, Entity *field, String parent) {
"%.*s.%.*s", LIT(parent), LIT(cn));
String child = {text, new_name_len-1};
- map_set(&m->entity_names, hash_entity(field), child);
+ GB_ASSERT(child.len > 0);
+ ir_add_entity_name(m, field, child);
ir_gen_global_type_name(m, field, child);
}
@@ -5148,15 +5166,16 @@ irAddr ir_build_addr(irProcedure *proc, AstNode *expr) {
String name = e->token.string;
if (name == "names") {
irValue *ti_ptr = ir_type_info(proc, type);
+ irValue *variant = ir_emit_struct_ep(proc, ti_ptr, 2);
irValue *names_ptr = nullptr;
if (is_type_enum(type)) {
- irValue *enum_info = ir_emit_conv(proc, ti_ptr, t_type_info_enum_ptr);
- names_ptr = ir_emit_struct_ep(proc, enum_info, 3);
+ irValue *enum_info = ir_emit_conv(proc, variant, t_type_info_enum_ptr);
+ names_ptr = ir_emit_struct_ep(proc, enum_info, 1);
} else if (type->kind == Type_Struct) {
- irValue *struct_info = ir_emit_conv(proc, ti_ptr, t_type_info_struct_ptr);
- names_ptr = ir_emit_struct_ep(proc, struct_info, 3);
+ irValue *struct_info = ir_emit_conv(proc, variant, t_type_info_struct_ptr);
+ names_ptr = ir_emit_struct_ep(proc, struct_info, 1);
}
return ir_addr(names_ptr);
} else {
@@ -7641,7 +7660,7 @@ void ir_gen_tree(irGen *s) {
if (!e->scope->is_global) {
name = ir_mangle_name(s, e->token.pos.file, e);
}
- map_set(&m->entity_names, hash_entity(e), name);
+ ir_add_entity_name(m, e, name);
irValue *g = ir_value_global(a, e, nullptr);
g->Global.name = name;
@@ -7716,7 +7735,7 @@ void ir_gen_tree(irGen *s) {
} else if (check_is_entity_overloaded(e)) {
name = ir_mangle_name(s, e->token.pos.file, e);
}
- map_set(&m->entity_names, hash_entity(e), name);
+ ir_add_entity_name(m, e, name);
switch (e->kind) {
case Entity_TypeName: