aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-03-01 12:59:17 +0000
committergingerBill <bill@gingerbill.org>2021-03-01 12:59:17 +0000
commit868117cddda5915020b94d2be00b6ab1ff5f171b (patch)
tree440dc38ea18dd0c2f7378ae89d1c98ba4ad741fb /src/llvm_backend.cpp
parent9e0210f7f636f6b75376ad9fe385ab2cb736896b (diff)
Remove hack in `lb_addr_store`
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp47
1 files changed, 34 insertions, 13 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 872ea3281..408d6f659 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -429,13 +429,15 @@ void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) {
GB_ASSERT(value.value != nullptr);
value = lb_emit_conv(p, value, lb_addr_type(addr));
- if (lb_is_const_or_global(value)) {
- // NOTE(bill): Just bypass the actual storage and set the initializer
- if (LLVMGetValueKind(addr.addr.value) == LLVMGlobalVariableValueKind) {
- LLVMSetInitializer(addr.addr.value, value.value);
- return;
- }
- }
+ // if (lb_is_const_or_global(value)) {
+ // // NOTE(bill): Just bypass the actual storage and set the initializer
+ // if (LLVMGetValueKind(addr.addr.value) == LLVMGlobalVariableValueKind) {
+ // LLVMValueRef dst = addr.addr.value;
+ // LLVMValueRef src = value.value;
+ // LLVMSetInitializer(dst, src);
+ // return;
+ // }
+ // }
lb_emit_store(p, addr.addr, value);
}
@@ -1148,11 +1150,19 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
case Type_Pointer:
return LLVMPointerType(lb_type(m, type_deref(type)), 0);
- case Type_Array:
- return LLVMArrayType(lb_type(m, type->Array.elem), cast(unsigned)type->Array.count);
+ 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;
+ return t;
+ }
- case Type_EnumeratedArray:
- return LLVMArrayType(lb_type(m, type->EnumeratedArray.elem), cast(unsigned)type->EnumeratedArray.count);
+ 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;
+ return t;
+ }
case Type_Slice:
{
@@ -1204,7 +1214,7 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
for_array(i, type->Struct.fields) {
Entity *field = type->Struct.fields[i];
- fields[i+offset] = lb_type(m, field->type);
+ fields[i+offset] = lb_type(m, field->type);
}
@@ -8519,7 +8529,18 @@ bool lb_is_const(lbValue value) {
bool lb_is_const_or_global(lbValue value) {
- return (LLVMGetValueKind(value.value) == LLVMGlobalVariableValueKind) || lb_is_const(value);
+ if (lb_is_const(value)) {
+ return true;
+ }
+ if (LLVMGetValueKind(value.value) == LLVMGlobalVariableValueKind) {
+ LLVMTypeRef t = LLVMGetElementType(LLVMTypeOf(value.value));
+ if (!lb_is_type_kind(t, LLVMPointerTypeKind)) {
+ return false;
+ }
+ LLVMTypeRef elem = LLVMGetElementType(t);
+ return lb_is_type_kind(elem, LLVMFunctionTypeKind);
+ }
+ return false;
}