aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-07-16 15:00:16 +0100
committerGinger Bill <bill@gingerbill.org>2017-07-16 15:00:16 +0100
commit054948e701c1340e72ac236d58da15ca9e6d617c (patch)
treec6d49378ebcc7f53a387f2819168145c64c152ae /src/ir.cpp
parent1c5ddd65b4f66c4d37bd9da0facb229bbcea22eb (diff)
Basic procedure type parameter specialization
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 3d9ef820a..c3fa9902f 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -3670,7 +3670,18 @@ void ir_pop_target_list(irProcedure *proc) {
void ir_gen_global_type_name(irModule *m, Entity *e, String name) {
if (e->type == nullptr) return;
- if (is_type_polymorphic(base_type(e->type))) {
+
+ Type *bt = base_type(e->type);
+
+ bool is_poly = is_type_polymorphic(bt);
+ if (!is_poly) {
+ if (bt->kind == Type_Record &&
+ bt->Record.is_polymorphic &&
+ !bt->Record.is_poly_specialized) {
+ is_poly = true;
+ }
+ }
+ if (is_poly) {
auto found = map_get(&m->info->gen_types, hash_pointer(e->type));
if (found == nullptr) {
return;
@@ -3696,7 +3707,6 @@ void ir_gen_global_type_name(irModule *m, Entity *e, String name) {
}
#endif
- Type *bt = base_type(e->type);
if (bt->kind == Type_Record) {
Scope *s = bt->Record.scope;
if (s != nullptr) {
@@ -7503,14 +7513,23 @@ void ir_gen_tree(irGen *s) {
continue;
}
- if (map_get(&m->min_dep_map, hash_entity(e)) == nullptr) {
+
+ bool polymorphic_struct = false;
+ if (e->type != nullptr && e->kind == Entity_TypeName) {
+ Type *bt = base_type(e->type);
+ if (bt->kind == Type_Record) {
+ polymorphic_struct = bt->Record.is_polymorphic;
+ }
+ }
+
+ if (!polymorphic_struct && map_get(&m->min_dep_map, hash_entity(e)) == nullptr) {
// NOTE(bill): Nothing depends upon it so doesn't need to be built
continue;
}
String original_name = name;
- if (!scope->is_global || is_type_polymorphic(e->type)) {
+ if (!scope->is_global || polymorphic_struct || is_type_polymorphic(e->type)) {
if (e->kind == Entity_Procedure && (e->Procedure.tags & ProcTag_export) != 0) {
} else if (e->kind == Entity_Procedure && e->Procedure.link_name.len > 0) {
// Handle later