diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-13 12:21:14 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-13 12:21:14 +0100 |
| commit | ad402726f19d9d3573a5a1be09aaa100c22de46f (patch) | |
| tree | 7be548ec54c7ecabcb13a3e15b4ab16bbce664ba /src | |
| parent | 8ff9f2e44f6a92ae5429bac257b4fb94829e9fd3 (diff) | |
Fix #1026
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend_general.cpp | 27 |
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: { |