aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-25 22:47:23 +0000
committergingerBill <bill@gingerbill.org>2021-03-25 22:47:23 +0000
commitc5c82e05513c723325b4804ba04e152069ecb5b3 (patch)
tree3180e0bffe63c9d1351bb633d5c1cc9037ef495a /src/llvm_backend.cpp
parent29ed1d5459966cbf30cd8db2c08949eed17d2c7c (diff)
Fix pseudo-constant local slice initialization
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 5b3c313d7..08b3a3980 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -6079,16 +6079,17 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc
return res;
} else {
// TODO(bill): THIS IS HACK BUT IT WORKS FOR WHAT I NEED
+ LLVMValueRef *old_values = values;
LLVMValueRef *new_values = gb_alloc_array(temporary_allocator(), LLVMValueRef, value_count);
for (isize i = 0; i < value_count; i++) {
- LLVMValueRef val = values[i];
- if (LLVMIsConstant(val)) {
- new_values[i] = val;
+ LLVMValueRef old_value = old_values[i];
+ if (LLVMIsConstant(old_value)) {
+ new_values[i] = old_value;
} else {
- values[i] = lb_const_nil(m, get_struct_field_type(type, i-offset)).value;
+ new_values[i] = LLVMConstNull(LLVMTypeOf(old_value));
}
}
- LLVMValueRef constant_value = llvm_const_named_struct(lb_type(m, original_type), values, cast(unsigned)value_count);
+ LLVMValueRef constant_value = llvm_const_named_struct(lb_type(m, original_type), new_values, cast(unsigned)value_count);
GB_ASSERT(is_local);
@@ -6096,10 +6097,10 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc
lbAddr v = lb_add_local_generated(p, res.type, true);
LLVMBuildStore(p->builder, constant_value, v.addr.value);
for (isize i = 0; i < value_count; i++) {
- LLVMValueRef val = values[i];
+ LLVMValueRef val = old_values[i];
if (!LLVMIsConstant(val)) {
LLVMValueRef dst = LLVMBuildStructGEP(p->builder, v.addr.value, cast(unsigned)i, "");
- LLVMBuildStore(p->builder, dst, val);
+ LLVMBuildStore(p->builder, val, dst);
}
}
return lb_addr_load(p, v);