diff options
| author | gingerBill <bill@gingerbill.org> | 2022-09-07 11:09:22 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-09-07 11:09:22 +0100 |
| commit | 0c9aaed9f741c3b96c63e0cbc9e4e11f4510248a (patch) | |
| tree | 06026d0826ea3913d1a5267ffa4bce44049e549b /src | |
| parent | 826a3b3012b781c972d3550b3999f6a9b4a09508 (diff) | |
Fix #2029 Eumerated array of procs literal crashes the compiler with an llvm error
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend_const.cpp | 4 | ||||
| -rw-r--r-- | src/llvm_backend_general.cpp | 29 |
2 files changed, 11 insertions, 22 deletions
diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 2d14070e2..5826dbaec 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -297,12 +297,16 @@ LLVMValueRef lb_build_constant_array_values(lbModule *m, Type *type, Type *elem_ } if (!is_const) { + LLVMTypeRef llvm_elem_type = lb_type(m, elem_type); lbProcedure *p = m->curr_procedure; GB_ASSERT(p != nullptr); lbAddr v = lb_add_local_generated(p, type, false); lbValue ptr = lb_addr_get_ptr(p, v); for (isize i = 0; i < count; i++) { lbValue elem = lb_emit_array_epi(p, ptr, i); + if (is_type_proc(elem_type)) { + values[i] = LLVMConstPointerCast(values[i], llvm_elem_type); + } LLVMBuildStore(p->builder, values[i], elem.value); } return lb_addr_load(p, v).value; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 6f98458fa..1f8fccdcb 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -877,18 +877,6 @@ bool lb_is_type_proc_recursive(Type *t) { case Type_Pointer: t = t->Pointer.elem; break; - case Type_Array: - t = t->Array.elem; - break; - case Type_EnumeratedArray: - t = t->EnumeratedArray.elem; - break; - case Type_Slice: - t = t->Slice.elem; - break; - case Type_DynamicArray: - t = t->DynamicArray.elem; - break; case Type_Proc: return true; default: @@ -1890,16 +1878,16 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { return LLVMPointerType(lb_type(m, type->Pointer.elem), 0); case Type_Array: { - m->internal_type_level -= 1; - LLVMTypeRef t = LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count); m->internal_type_level += 1; + LLVMTypeRef t = LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count); + m->internal_type_level -= 1; return t; } case Type_EnumeratedArray: { - m->internal_type_level -= 1; - LLVMTypeRef t = LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count); m->internal_type_level += 1; + LLVMTypeRef t = LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count); + m->internal_type_level -= 1; return t; } @@ -2101,14 +2089,11 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { } case Type_Proc: - // if (m->internal_type_level > 256) { // TODO HACK(bill): is this really enough? - if (m->internal_type_level > 1) { // TODO HACK(bill): is this really enough? - return LLVMPointerType(LLVMIntTypeInContext(m->ctx, 8), 0); - } else { + { LLVMTypeRef proc_raw_type = lb_type_internal_for_procedures_raw(m, type); - return LLVMPointerType(proc_raw_type, 0); + gb_unused(proc_raw_type); + return LLVMPointerType(LLVMIntTypeInContext(m->ctx, 8), 0); } - break; case Type_BitSet: { |