aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-08-13 12:21:14 +0100
committergingerBill <bill@gingerbill.org>2021-08-13 12:21:14 +0100
commitad402726f19d9d3573a5a1be09aaa100c22de46f (patch)
tree7be548ec54c7ecabcb13a3e15b4ab16bbce664ba /src
parent8ff9f2e44f6a92ae5429bac257b4fb94829e9fd3 (diff)
Fix #1026
Diffstat (limited to 'src')
-rw-r--r--src/llvm_backend_general.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 74aaafe94..073596b6e 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -1572,7 +1572,7 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
}
case Type_Pointer:
- return LLVMPointerType(lb_type(m, type_deref(type)), 0);
+ return LLVMPointerType(lb_type(m, type->Pointer.elem), 0);
case Type_Array: {
m->internal_type_level -= 1;
@@ -1611,7 +1611,30 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
break;
case Type_Map:
- return lb_type(m, type->Map.internal_type);
+ init_map_internal_types(type);
+ {
+ Type *internal_type = type->Map.internal_type;
+ GB_ASSERT(internal_type->kind == Type_Struct);
+
+ m->internal_type_level -= 1;
+ defer (m->internal_type_level += 1);
+
+ unsigned field_count = cast(unsigned)(internal_type->Struct.fields.count);
+ GB_ASSERT(field_count == 2);
+ LLVMTypeRef *fields = gb_alloc_array(temporary_allocator(), LLVMTypeRef, field_count);
+
+ LLVMTypeRef entries_fields[4] = {
+ lb_type(m, t_rawptr),
+ lb_type(m, t_int), // len
+ lb_type(m, t_int), // cap
+ lb_type(m, t_allocator), // allocator
+ };
+
+ fields[0] = lb_type(m, internal_type->Struct.fields[0]->type);
+ fields[1] = LLVMStructTypeInContext(ctx, entries_fields, gb_count_of(entries_fields), false);
+
+ return LLVMStructTypeInContext(ctx, fields, field_count, false);
+ }
case Type_Struct:
{