aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-18 12:37:15 +0100
committergingerBill <bill@gingerbill.org>2024-08-18 12:37:15 +0100
commitf49ebae9562257effe014e3c175496915041d5f2 (patch)
treea6107c86625491f5758ce1e25ef6773b121e3c94 /src/llvm_backend_general.cpp
parent0e82a46047b619a6d70ec7e7a3e23a66794584b1 (diff)
Correct `lbAddr_SoaVariable` logic
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index a91c1d1fe..5e9234cec 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -534,6 +534,15 @@ gb_internal lbValue lb_relative_pointer_to_pointer(lbProcedure *p, lbAddr const
return final_ptr;
}
+gb_internal lbValue lb_make_soa_pointer(lbProcedure *p, Type *type, lbValue const &addr, lbValue const &index) {
+ lbAddr v = lb_add_local_generated(p, type, false);
+ lbValue ptr = lb_emit_struct_ep(p, v.addr, 0);
+ lbValue idx = lb_emit_struct_ep(p, v.addr, 1);
+ lb_emit_store(p, ptr, addr);
+ lb_emit_store(p, idx, lb_emit_conv(p, index, t_int));
+
+ return lb_addr_load(p, v);
+}
gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
if (addr.addr.value == nullptr) {
@@ -549,8 +558,12 @@ gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
return lb_relative_pointer_to_pointer(p, addr);
case lbAddr_SoaVariable:
- // TODO(bill): FIX THIS HACK
- return lb_address_from_load(p, lb_addr_load(p, addr));
+ {
+ Type *soa_ptr_type = alloc_type_soa_pointer(lb_addr_type(addr));
+ return lb_address_from_load_or_generate_local(p, lb_make_soa_pointer(p, soa_ptr_type, addr.addr, addr.soa.index));
+ // TODO(bill): FIX THIS HACK
+ // return lb_address_from_load(p, lb_addr_load(p, addr));
+ }
case lbAddr_Context:
GB_PANIC("lbAddr_Context should be handled elsewhere");