diff options
| author | gingerBill <bill@gingerbill.org> | 2020-04-25 14:45:34 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-04-25 14:45:34 +0100 |
| commit | f63b9806d24d347ab4c351f87797bd23e2834b5d (patch) | |
| tree | ead903f64a0b15bb0fe49a0d539535b1444ce2a3 /src/llvm_backend.cpp | |
| parent | 9409f53a9bbf4a057ac45ae34b42d78ae4178d63 (diff) | |
LLVM API: Fix compound literals with constant parameters to `union` fields
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index cc6eccff6..06b29dcb0 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -4525,7 +4525,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { ast_node(cl, CompoundLit, value.value_compound); Type *elem_type = type->Array.elem; isize elem_count = cl->elems.count; - if (elem_count == 0) { + if (elem_count == 0 || !elem_type_can_be_constant(elem_type)) { return lb_const_nil(m, original_type); } if (cl->elems[0]->kind == Ast_FieldValue) { @@ -4614,7 +4614,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { ast_node(cl, CompoundLit, value.value_compound); Type *elem_type = type->EnumeratedArray.elem; isize elem_count = cl->elems.count; - if (elem_count == 0) { + if (elem_count == 0 || !elem_type_can_be_constant(elem_type)) { return lb_const_nil(m, original_type); } if (cl->elems[0]->kind == Ast_FieldValue) { @@ -4711,6 +4711,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { if (elem_count == 0) { return lb_const_nil(m, original_type); } + GB_ASSERT(elem_type_can_be_constant(elem_type)); isize total_elem_count = type->SimdVector.count; LLVMValueRef *values = gb_alloc_array(heap_allocator(), LLVMValueRef, total_elem_count); @@ -4759,9 +4760,10 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { Selection sel = lookup_field(type, name, false); Entity *f = type->Struct.fields[sel.index[0]]; - - values[offset+f->Variable.field_index] = lb_const_value(m, f->type, tav.value).value; - visited[offset+f->Variable.field_index] = true; + if (elem_type_can_be_constant(f->type)) { + values[offset+f->Variable.field_index] = lb_const_value(m, f->type, tav.value).value; + visited[offset+f->Variable.field_index] = true; + } } } else { for_array(i, cl->elems) { @@ -4771,8 +4773,10 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { if (tav.mode != Addressing_Invalid) { val = tav.value; } - values[offset+f->Variable.field_index] = lb_const_value(m, f->type, val).value; - visited[offset+f->Variable.field_index] = true; + if (elem_type_can_be_constant(f->type)) { + values[offset+f->Variable.field_index] = lb_const_value(m, f->type, val).value; + visited[offset+f->Variable.field_index] = true; + } } } } @@ -11694,7 +11698,7 @@ void lb_generate_code(lbGenerator *gen) { if (build_context.keep_temp_files) { TIME_SECTION("LLVM Print Module to File"); LLVMPrintModuleToFile(mod, cast(char const *)filepath_ll.text, &llvm_error); - exit(1); + // exit(1); } LLVMDIBuilderFinalize(m->debug_builder); LLVMVerifyModule(mod, LLVMAbortProcessAction, &llvm_error); |