aboutsummaryrefslogtreecommitdiff
path: root/src/tilde_stmt.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-07-17 00:06:03 +0100
committergingerBill <bill@gingerbill.org>2023-07-17 00:06:03 +0100
commit66a20264ab8f0abfddcda6a2c48a447119f22f33 (patch)
tree37bc42fcd5a89a286b37e46f7fe1d0d9dc213176 /src/tilde_stmt.cpp
parentd2d243cca8954e686a82f15a37a149c7938362d2 (diff)
Mock out `cg_emit_arith`
Diffstat (limited to 'src/tilde_stmt.cpp')
-rw-r--r--src/tilde_stmt.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp
index 2f2bdd55f..f70dba115 100644
--- a/src/tilde_stmt.cpp
+++ b/src/tilde_stmt.cpp
@@ -228,6 +228,61 @@ gb_internal void cg_addr_store(cgProcedure *p, cgAddr addr, cgValue value) {
cg_emit_store(p, addr.addr, value);
}
+gb_internal cgValue cg_addr_get_ptr(cgProcedure *p, cgAddr const &addr) {
+ if (cg_addr_is_empty(addr)) {
+ GB_PANIC("Illegal addr -> nullptr");
+ return {};
+ }
+
+ switch (addr.kind) {
+ case cgAddr_Map:
+ GB_PANIC("TODO(bill): cg_addr_get_ptr cgAddr_Map");
+ // return cg_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key);
+ break;
+
+ case cgAddr_RelativePointer: {
+ Type *rel_ptr = base_type(cg_addr_type(addr));
+ GB_ASSERT(rel_ptr->kind == Type_RelativePointer);
+
+ cgValue ptr = cg_emit_conv(p, addr.addr, t_uintptr);
+ cgValue offset = cg_emit_conv(p, ptr, alloc_type_pointer(rel_ptr->RelativePointer.base_integer));
+ offset = cg_emit_load(p, offset);
+
+ if (!is_type_unsigned(rel_ptr->RelativePointer.base_integer)) {
+ offset = cg_emit_conv(p, offset, t_i64);
+ }
+ offset = cg_emit_conv(p, offset, t_uintptr);
+
+ GB_PANIC("TODO(bill): cg_addr_get_ptr cgAddr_RelativePointer");
+ // cgValue absolute_ptr = cg_emit_arith(p, Token_Add, ptr, offset, t_uintptr);
+ // absolute_ptr = cg_emit_conv(p, absolute_ptr, rel_ptr->RelativePointer.pointer_type);
+
+ // cgValue cond = cg_emit_comp(p, Token_CmpEq, offset, cg_const_nil(p->module, rel_ptr->RelativePointer.base_integer));
+
+ // // NOTE(bill): nil check
+ // cgValue nil_ptr = cg_const_nil(p->module, rel_ptr->RelativePointer.pointer_type);
+ // cgValue final_ptr = cg_emit_select(p, cond, nil_ptr, absolute_ptr);
+ // return final_ptr;
+ break;
+ }
+
+ case cgAddr_SoaVariable:
+ // TODO(bill): FIX THIS HACK
+ return cg_address_from_load(p, cg_addr_load(p, addr));
+
+ case cgAddr_Context:
+ GB_PANIC("cgAddr_Context should be handled elsewhere");
+ break;
+
+ case cgAddr_Swizzle:
+ case cgAddr_SwizzleLarge:
+ // TOOD(bill): is this good enough logic?
+ break;
+ }
+
+ return addr.addr;
+}
+