|
@@ -409,14 +409,6 @@ gb_internal lbModule *lb_module_of_entity(lbGenerator *gen, Entity *e) {
|
|
|
|
|
|
gb_internal lbAddr lb_addr(lbValue addr) {
|
|
|
lbAddr v = {lbAddr_Default, addr};
|
|
|
- if (addr.type != nullptr && is_type_relative_pointer(type_deref(addr.type))) {
|
|
|
- GB_ASSERT(is_type_pointer(addr.type));
|
|
|
- v.kind = lbAddr_RelativePointer;
|
|
|
- } else if (addr.type != nullptr && is_type_relative_multi_pointer(type_deref(addr.type))) {
|
|
|
- GB_ASSERT(is_type_pointer(addr.type) ||
|
|
|
- is_type_multi_pointer(addr.type));
|
|
|
- v.kind = lbAddr_RelativePointer;
|
|
|
- }
|
|
|
return v;
|
|
|
}
|
|
|
|
|
@@ -501,42 +493,6 @@ gb_internal Type *lb_addr_type(lbAddr const &addr) {
|
|
|
return type_deref(addr.addr.type);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-gb_internal lbValue lb_relative_pointer_to_pointer(lbProcedure *p, lbAddr const &addr) {
|
|
|
- GB_ASSERT(addr.kind == lbAddr_RelativePointer);
|
|
|
-
|
|
|
- Type *t = base_type(lb_addr_type(addr));
|
|
|
- GB_ASSERT(is_type_relative_pointer(t) || is_type_relative_multi_pointer(t));
|
|
|
-
|
|
|
- Type *pointer_type = nullptr;
|
|
|
- Type *base_integer = nullptr;
|
|
|
- if (t->kind == Type_RelativePointer) {
|
|
|
- pointer_type = t->RelativePointer.pointer_type;
|
|
|
- base_integer = t->RelativePointer.base_integer;
|
|
|
- } else if (t->kind == Type_RelativeMultiPointer) {
|
|
|
- pointer_type = t->RelativeMultiPointer.pointer_type;
|
|
|
- base_integer = t->RelativeMultiPointer.base_integer;
|
|
|
- }
|
|
|
-
|
|
|
- lbValue ptr = lb_emit_conv(p, addr.addr, t_uintptr);
|
|
|
- lbValue offset = lb_emit_conv(p, ptr, alloc_type_pointer(base_integer));
|
|
|
- offset = lb_emit_load(p, offset);
|
|
|
-
|
|
|
- if (!is_type_unsigned(base_integer)) {
|
|
|
- offset = lb_emit_conv(p, offset, t_i64);
|
|
|
- }
|
|
|
- offset = lb_emit_conv(p, offset, t_uintptr);
|
|
|
- lbValue absolute_ptr = lb_emit_arith(p, Token_Add, ptr, offset, t_uintptr);
|
|
|
- absolute_ptr = lb_emit_conv(p, absolute_ptr, pointer_type);
|
|
|
-
|
|
|
- lbValue cond = lb_emit_comp(p, Token_CmpEq, offset, lb_const_nil(p->module, base_integer));
|
|
|
-
|
|
|
- // NOTE(bill): nil check
|
|
|
- lbValue nil_ptr = lb_const_nil(p->module, pointer_type);
|
|
|
- lbValue final_ptr = lb_emit_select(p, cond, nil_ptr, absolute_ptr);
|
|
|
- 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);
|
|
@@ -557,9 +513,6 @@ gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
|
|
|
case lbAddr_Map:
|
|
|
return lb_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key);
|
|
|
|
|
|
- case lbAddr_RelativePointer:
|
|
|
- return lb_relative_pointer_to_pointer(p, addr);
|
|
|
-
|
|
|
case lbAddr_SoaVariable:
|
|
|
{
|
|
|
Type *soa_ptr_type = alloc_type_soa_pointer(lb_addr_type(addr));
|
|
@@ -584,9 +537,6 @@ gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
|
|
|
|
|
|
gb_internal lbValue lb_build_addr_ptr(lbProcedure *p, Ast *expr) {
|
|
|
lbAddr addr = lb_build_addr(p, expr);
|
|
|
- if (addr.kind == lbAddr_RelativePointer) {
|
|
|
- return addr.addr;
|
|
|
- }
|
|
|
return lb_addr_get_ptr(p, addr);
|
|
|
}
|
|
|
|
|
@@ -819,10 +769,6 @@ gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) {
|
|
|
value.value = LLVMConstNull(lb_type(p->module, t));
|
|
|
}
|
|
|
|
|
|
- if (addr.kind == lbAddr_RelativePointer && addr.relative.deref) {
|
|
|
- addr = lb_addr(lb_address_from_load(p, lb_addr_load(p, addr)));
|
|
|
- }
|
|
|
-
|
|
|
if (addr.kind == lbAddr_BitField) {
|
|
|
lbValue dst = addr.addr;
|
|
|
if (is_type_endian_big(addr.bitfield.type)) {
|
|
@@ -860,44 +806,6 @@ gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) {
|
|
|
lb_emit_runtime_call(p, "__write_bits", args);
|
|
|
}
|
|
|
return;
|
|
|
- } else if (addr.kind == lbAddr_RelativePointer) {
|
|
|
- Type *rel_ptr = base_type(lb_addr_type(addr));
|
|
|
- GB_ASSERT(rel_ptr->kind == Type_RelativePointer ||
|
|
|
- rel_ptr->kind == Type_RelativeMultiPointer);
|
|
|
- Type *pointer_type = nullptr;
|
|
|
- Type *base_integer = nullptr;
|
|
|
-
|
|
|
- if (rel_ptr->kind == Type_RelativePointer) {
|
|
|
- pointer_type = rel_ptr->RelativePointer.pointer_type;
|
|
|
- base_integer = rel_ptr->RelativePointer.base_integer;
|
|
|
- } else if (rel_ptr->kind == Type_RelativeMultiPointer) {
|
|
|
- pointer_type = rel_ptr->RelativeMultiPointer.pointer_type;
|
|
|
- base_integer = rel_ptr->RelativeMultiPointer.base_integer;
|
|
|
- }
|
|
|
-
|
|
|
- value = lb_emit_conv(p, value, pointer_type);
|
|
|
-
|
|
|
- GB_ASSERT(is_type_pointer(addr.addr.type));
|
|
|
- lbValue ptr = lb_emit_conv(p, addr.addr, t_uintptr);
|
|
|
- lbValue val_ptr = lb_emit_conv(p, value, t_uintptr);
|
|
|
- lbValue offset = {};
|
|
|
- offset.value = LLVMBuildSub(p->builder, val_ptr.value, ptr.value, "");
|
|
|
- offset.type = t_uintptr;
|
|
|
-
|
|
|
- if (!is_type_unsigned(base_integer)) {
|
|
|
- offset = lb_emit_conv(p, offset, t_i64);
|
|
|
- }
|
|
|
- offset = lb_emit_conv(p, offset, base_integer);
|
|
|
-
|
|
|
- lbValue offset_ptr = lb_emit_conv(p, addr.addr, alloc_type_pointer(base_integer));
|
|
|
- offset = lb_emit_select(p,
|
|
|
- lb_emit_comp(p, Token_CmpEq, val_ptr, lb_const_nil(p->module, t_uintptr)),
|
|
|
- lb_const_nil(p->module, base_integer),
|
|
|
- offset
|
|
|
- );
|
|
|
- LLVMBuildStore(p->builder, offset.value, offset_ptr.value);
|
|
|
- return;
|
|
|
-
|
|
|
} else if (addr.kind == lbAddr_Map) {
|
|
|
lb_internal_dynamic_map_set(p, addr.addr, addr.map.type, addr.map.key, value, p->curr_stmt);
|
|
|
return;
|
|
@@ -1246,46 +1154,6 @@ gb_internal lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) {
|
|
|
}
|
|
|
|
|
|
return r;
|
|
|
- } else if (addr.kind == lbAddr_RelativePointer) {
|
|
|
- Type *rel_ptr = base_type(lb_addr_type(addr));
|
|
|
- Type *base_integer = nullptr;
|
|
|
- Type *pointer_type = nullptr;
|
|
|
- GB_ASSERT(rel_ptr->kind == Type_RelativePointer ||
|
|
|
- rel_ptr->kind == Type_RelativeMultiPointer);
|
|
|
-
|
|
|
- if (rel_ptr->kind == Type_RelativePointer) {
|
|
|
- base_integer = rel_ptr->RelativePointer.base_integer;
|
|
|
- pointer_type = rel_ptr->RelativePointer.pointer_type;
|
|
|
- } else if (rel_ptr->kind == Type_RelativeMultiPointer) {
|
|
|
- base_integer = rel_ptr->RelativeMultiPointer.base_integer;
|
|
|
- pointer_type = rel_ptr->RelativeMultiPointer.pointer_type;
|
|
|
- }
|
|
|
-
|
|
|
- lbValue ptr = lb_emit_conv(p, addr.addr, t_uintptr);
|
|
|
- lbValue offset = lb_emit_conv(p, ptr, alloc_type_pointer(base_integer));
|
|
|
- offset = lb_emit_load(p, offset);
|
|
|
-
|
|
|
-
|
|
|
- if (!is_type_unsigned(base_integer)) {
|
|
|
- offset = lb_emit_conv(p, offset, t_i64);
|
|
|
- }
|
|
|
- offset = lb_emit_conv(p, offset, t_uintptr);
|
|
|
- lbValue absolute_ptr = lb_emit_arith(p, Token_Add, ptr, offset, t_uintptr);
|
|
|
- absolute_ptr = lb_emit_conv(p, absolute_ptr, pointer_type);
|
|
|
-
|
|
|
- lbValue cond = lb_emit_comp(p, Token_CmpEq, offset, lb_const_nil(p->module, base_integer));
|
|
|
-
|
|
|
- // NOTE(bill): nil check
|
|
|
- lbValue nil_ptr = lb_const_nil(p->module, pointer_type);
|
|
|
- lbValue final_ptr = {};
|
|
|
- final_ptr.type = absolute_ptr.type;
|
|
|
- final_ptr.value = LLVMBuildSelect(p->builder, cond.value, nil_ptr.value, absolute_ptr.value, "");
|
|
|
-
|
|
|
- if (rel_ptr->kind == Type_RelativeMultiPointer) {
|
|
|
- return final_ptr;
|
|
|
- }
|
|
|
- return lb_emit_load(p, final_ptr);
|
|
|
-
|
|
|
} else if (addr.kind == lbAddr_Map) {
|
|
|
Type *map_type = base_type(type_deref(addr.addr.type));
|
|
|
GB_ASSERT(map_type->kind == Type_Map);
|
|
@@ -2378,13 +2246,6 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|
|
|
|
|
case Type_SimdVector:
|
|
|
return LLVMVectorType(lb_type(m, type->SimdVector.elem), cast(unsigned)type->SimdVector.count);
|
|
|
-
|
|
|
- case Type_RelativePointer:
|
|
|
- return lb_type_internal(m, type->RelativePointer.base_integer);
|
|
|
- case Type_RelativeMultiPointer:
|
|
|
- return lb_type_internal(m, type->RelativeMultiPointer.base_integer);
|
|
|
-
|
|
|
-
|
|
|
|
|
|
case Type_Matrix:
|
|
|
{
|