aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-25 14:45:34 +0100
committergingerBill <bill@gingerbill.org>2020-04-25 14:45:34 +0100
commitf63b9806d24d347ab4c351f87797bd23e2834b5d (patch)
treeead903f64a0b15bb0fe49a0d539535b1444ce2a3 /src/llvm_backend.cpp
parent9409f53a9bbf4a057ac45ae34b42d78ae4178d63 (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.cpp20
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);