diff options
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 330 |
1 files changed, 26 insertions, 304 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 62eee2f9f..2cd3549a9 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -494,7 +494,6 @@ gb_global irValue *v_raw_nil = nullptr; enum irAddrKind { irAddr_Default, irAddr_Map, - irAddr_BitField, irAddr_Context, irAddr_SoaVariable, irAddr_RelativePointer, @@ -562,12 +561,6 @@ irAddr ir_addr_context(irValue *addr, Selection sel = empty_selection) { } -irAddr ir_addr_bit_field(irValue *addr, i32 bit_field_value_index) { - irAddr v = {irAddr_BitField, addr}; - v.bit_field_value_index = bit_field_value_index; - return v; -} - irAddr ir_addr_soa_variable(irValue *addr, irValue *index, Ast *index_expr) { irAddr v = {irAddr_SoaVariable, addr}; v.soa.index = index; @@ -2246,49 +2239,6 @@ irDebugInfo *ir_add_debug_info_type_dynamic_array(irModule *module, Type *type, return di; } -irDebugInfo *ir_add_debug_info_type_bit_field(irModule *module, Type *type, Entity *e, irDebugInfo *scope) { - GB_ASSERT(type->kind == Type_BitField || (type->kind == Type_Named && type->Named.base->kind == Type_BitField)); - - Type *bf_type = base_type(type); - - irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_CompositeType); - di->CompositeType.name = is_type_named(type) ? type->Named.name : str_lit("bit_field"); - di->CompositeType.tag = irDebugBasicEncoding_structure_type; - di->CompositeType.size = ir_debug_size_bits(bf_type); - map_set(&module->debug_info, hash_type(type), di); - - GB_ASSERT(bf_type->BitField.fields.count == bf_type->BitField.offsets.count && - bf_type->BitField.fields.count == bf_type->BitField.sizes.count); - - irDebugInfo *elements_di = ir_add_debug_info_array(module, 0, bf_type->BitField.fields.count); - di->CompositeType.elements = elements_di; - map_set(&module->debug_info, hash_pointer(elements_di), elements_di); - - for_array(field_index, bf_type->BitField.fields) { - Entity *field = bf_type->BitField.fields[field_index]; - u32 offset = bf_type->BitField.offsets[field_index]; - u32 size = bf_type->BitField.sizes[field_index]; - String name = str_lit("field_todo"); - if (field != nullptr && field->token.string.len > 0) { - name = field->token.string; - } - // TODO(lachsinc): t_i64 may not be safe to use for all bitfields? - irDebugInfo *field_di = ir_add_debug_info_field_internal(module, name, t_i64, - 0, - nullptr, - di); - // NOTE(lachsinc): Above calls BitFieldValues type_size_of() which returns size in bits, - // replace with its true bit value here.. - field_di->DerivedType.size = size; - field_di->DerivedType.offset = offset; // Offset stored in bits already, no need to convert - field_di->DerivedType.flags = irDebugInfoFlag_Bitfield; - map_set(&module->debug_info, hash_pointer(field_di), field_di); - array_add(&elements_di->DebugInfoArray.elements, field_di); - } - - return di; -} - irDebugInfo *ir_add_debug_info_type_bit_set(irModule *module, Type *type, Entity *e, irDebugInfo *scope) { GB_ASSERT(type->kind == Type_BitSet || type->kind == Type_Named); @@ -2579,7 +2529,6 @@ irDebugInfo *ir_add_debug_info_type(irModule *module, Type *type, Entity *e, irD if (named_base->kind != Type_Struct && named_base->kind != Type_Union && named_base->kind != Type_Enum && - named_base->kind != Type_BitField && named_base->kind != Type_Tuple) { // distinct / typedef etc. irDebugInfo *di = ir_alloc_debug_info(irDebugInfo_DerivedType); @@ -2845,10 +2794,6 @@ irDebugInfo *ir_add_debug_info_type(irModule *module, Type *type, Entity *e, irD } */ - if (is_type_bit_field(type)) { - return ir_add_debug_info_type_bit_field(module, type, e, scope); - } - if (is_type_bit_set(type)) { return ir_add_debug_info_type_bit_set(module, type, e, scope); } @@ -3146,7 +3091,6 @@ bool ir_type_requires_mem_zero(Type *t) { case Type_DynamicArray: case Type_Map: - case Type_BitField: return true; case Type_Array: return ir_type_requires_mem_zero(t->Array.elem); @@ -3971,96 +3915,6 @@ void ir_addr_store(irProcedure *proc, irAddr addr, irValue *value) { } else if (addr.kind == irAddr_Map) { ir_insert_dynamic_map_key_and_value(proc, addr.addr, addr.map_type, addr.map_key, value, proc->curr_stmt); return; - } else if (addr.kind == irAddr_BitField) { - gbAllocator a = ir_allocator(); - - Type *bft = base_type(type_deref(ir_type(addr.addr))); - GB_ASSERT(is_type_bit_field(bft)); - i32 value_index = addr.bit_field_value_index; - i32 offset = bft->BitField.offsets[value_index]; - i32 size_in_bits = bft->BitField.fields[value_index]->type->BitFieldValue.bits; - - - i32 byte_index = offset / 8; - i32 bit_inset = offset % 8; - - i32 size_in_bytes = next_pow2((size_in_bits+7)/8); - if (size_in_bytes == 0) { - GB_ASSERT(size_in_bits == 0); - return; - } - - Type *int_type = nullptr; - switch (size_in_bytes) { - case 1: int_type = t_u8; break; - case 2: int_type = t_u16; break; - case 4: int_type = t_u32; break; - case 8: int_type = t_u64; break; - } - GB_ASSERT(int_type != nullptr); - - value = ir_emit_conv(proc, value, int_type); - - irValue *bytes = ir_emit_conv(proc, addr.addr, t_u8_ptr); - bytes = ir_emit_ptr_offset(proc, bytes, ir_const_int(byte_index)); - - - if (bit_inset == 0) { - irValue *v = value; - i32 sa = 8*size_in_bytes - size_in_bits; - if (sa > 0) { - irValue *shift_amount = ir_const_int(sa); - v = ir_emit_arith(proc, Token_Shl, v, shift_amount, int_type); - v = ir_emit_arith(proc, Token_Shr, v, shift_amount, int_type); - } - irValue *ptr = ir_emit_conv(proc, bytes, alloc_type_pointer(int_type)); - - - irValue *sv = ir_emit_load(proc, ptr, 1); - // NOTE(bill): Zero out the lower bits that need to be stored to - sv = ir_emit_arith(proc, Token_Shr, sv, ir_const_int(size_in_bits), int_type); - sv = ir_emit_arith(proc, Token_Shl, sv, ir_const_int(size_in_bits), int_type); - - v = ir_emit_arith(proc, Token_Or, sv, v, int_type); - ir_emit_store(proc, ptr, v, true); - return; - } - - GB_ASSERT(0 < bit_inset && bit_inset < 8); - - // First byte - { - irValue *shift_amount = ir_const_int(bit_inset); - - irValue *ptr = ir_emit_conv(proc, bytes, alloc_type_pointer(t_u8)); - - irValue *v = ir_emit_conv(proc, value, t_u8); - v = ir_emit_arith(proc, Token_Shl, v, shift_amount, t_u8); - - irValue *sv = ir_emit_load(proc, bytes, 1); - // NOTE(bill): Zero out the upper bits that need to be stored to - sv = ir_emit_arith(proc, Token_Shl, sv, ir_const_int(8-bit_inset), t_u8); - sv = ir_emit_arith(proc, Token_Shr, sv, ir_const_int(8-bit_inset), t_u8); - - v = ir_emit_arith(proc, Token_Or, sv, v, t_u8); - ir_emit_store(proc, ptr, v, true); - } - - // Remaining bytes - if (bit_inset+size_in_bits > 8) { - irValue *ptr = ir_emit_conv(proc, ir_emit_ptr_offset(proc, bytes, v_one), alloc_type_pointer(int_type)); - irValue *v = ir_emit_conv(proc, value, int_type); - v = ir_emit_arith(proc, Token_Shr, v, ir_const_int(8-bit_inset), int_type); - - irValue *sv = ir_emit_load(proc, ptr, 1); - // NOTE(bill): Zero out the lower bits that need to be stored to - sv = ir_emit_arith(proc, Token_Shr, sv, ir_const_int(size_in_bits-bit_inset), int_type); - sv = ir_emit_arith(proc, Token_Shl, sv, ir_const_int(size_in_bits-bit_inset), int_type); - - v = ir_emit_arith(proc, Token_Or, sv, v, int_type); - ir_emit_store(proc, ptr, v, true); - } - return; } else if (addr.kind == irAddr_Context) { irValue *old = ir_emit_load(proc, ir_find_or_generate_context_ptr(proc)); irValue *next = ir_add_local_generated(proc, t_context, true); @@ -4206,62 +4060,6 @@ irValue *ir_addr_load(irProcedure *proc, irAddr const &addr) { irValue *single = ir_emit_struct_ep(proc, v, 0); return ir_emit_load(proc, single); } - } else if (addr.kind == irAddr_BitField) { - gbAllocator a = ir_allocator(); - - - Type *bft = base_type(type_deref(ir_type(addr.addr))); - GB_ASSERT(is_type_bit_field(bft)); - i32 value_index = addr.bit_field_value_index; - i32 offset = bft->BitField.offsets[value_index]; - i32 size_in_bits = bft->BitField.fields[value_index]->type->BitFieldValue.bits; - - i32 byte_index = offset / 8; - i32 bit_inset = offset % 8; - - i32 size_in_bytes = next_pow2((size_in_bits+7)/8); - if (size_in_bytes == 0) { - GB_ASSERT(size_in_bits == 0); - return v_zero32; - } - - Type *int_type = nullptr; - switch (size_in_bytes) { - case 1: int_type = t_u8; break; - case 2: int_type = t_u16; break; - case 4: int_type = t_u32; break; - case 8: int_type = t_u64; break; - } - GB_ASSERT(int_type != nullptr); - - - irValue *bytes = ir_emit_conv(proc, addr.addr, t_u8_ptr); - bytes = ir_emit_ptr_offset(proc, bytes, ir_const_int(byte_index)); - - Type *int_ptr = alloc_type_pointer(int_type); - - i32 sa = 8*size_in_bytes - size_in_bits; - if (bit_inset == 0) { - irValue *v = ir_emit_load(proc, ir_emit_conv(proc, bytes, int_ptr), 1); - if (sa > 0) { - irValue *shift_amount = ir_const_int(sa); - v = ir_emit_arith(proc, Token_Shl, v, shift_amount, int_type); - v = ir_emit_arith(proc, Token_Shr, v, shift_amount, int_type); - } - return v; - } - - GB_ASSERT(8 > bit_inset); - - irValue *ptr = ir_emit_conv(proc, bytes, int_ptr); - irValue *v = ir_emit_load(proc, ptr, 1); - v = ir_emit_arith(proc, Token_Shr, v, ir_const_int(bit_inset), int_type); - if (sa > 0) { - irValue *shift_amount = ir_const_int(sa); - v = ir_emit_arith(proc, Token_Shl, v, shift_amount, int_type); - v = ir_emit_arith(proc, Token_Shr, v, shift_amount, int_type); - } - return v; } else if (addr.kind == irAddr_Context) { if (addr.ctx.sel.index.count > 0) { irValue *a = addr.addr; @@ -4381,11 +4179,6 @@ irValue *ir_addr_get_ptr(irProcedure *proc, irAddr const &addr, bool allow_refer return final_ptr; } - case irAddr_BitField: { - irValue *v = ir_addr_load(proc, addr); - return ir_address_from_load_or_generate_local(proc, v); - } - case irAddr_Context: GB_PANIC("irAddr_Context should be handled elsewhere"); } @@ -4945,14 +4738,6 @@ irValue *ir_emit_comp_against_nil(irProcedure *proc, TokenKind op_kind, irValue } else if (is_type_typeid(t)) { irValue *invalid_typeid = ir_value_constant(t_typeid, exact_value_i64(0)); return ir_emit_comp(proc, op_kind, x, invalid_typeid); - } else if (is_type_bit_field(t)) { - auto args = array_make<irValue *>(permanent_allocator(), 2); - irValue *lhs = ir_address_from_load_or_generate_local(proc, x); - args[0] = ir_emit_conv(proc, lhs, t_rawptr); - args[1] = ir_const_int(type_size_of(t)); - irValue *val = ir_emit_runtime_call(proc, "memory_compare_zero", args); - irValue *res = ir_emit_comp(proc, op_kind, val, v_zero); - return ir_emit_conv(proc, res, t_bool); } else if (is_type_soa_struct(t)) { Type *bt = base_type(t); if (bt->Struct.soa_kind == StructSoa_Slice) { @@ -5243,33 +5028,31 @@ irValue *ir_emit_comp(irProcedure *proc, TokenKind op_kind, irValue *left, irVal Type *lt = ir_type(left); Type *rt = ir_type(right); - if (is_type_bit_set(lt) && is_type_bit_set(rt)) { - Type *blt = base_type(lt); - Type *brt = base_type(rt); - GB_ASSERT(is_type_bit_field_value(blt)); - GB_ASSERT(is_type_bit_field_value(brt)); - i64 bits = gb_max(blt->BitFieldValue.bits, brt->BitFieldValue.bits); - i64 bytes = bits / 8; - switch (bytes) { - case 1: - left = ir_emit_conv(proc, left, t_u8); - right = ir_emit_conv(proc, right, t_u8); - break; - case 2: - left = ir_emit_conv(proc, left, t_u16); - right = ir_emit_conv(proc, right, t_u16); - break; - case 4: - left = ir_emit_conv(proc, left, t_u32); - right = ir_emit_conv(proc, right, t_u32); - break; - case 8: - left = ir_emit_conv(proc, left, t_u64); - right = ir_emit_conv(proc, right, t_u64); - break; - default: GB_PANIC("Unknown integer size"); break; - } - } + // if (is_type_bit_set(lt) && is_type_bit_set(rt)) { + // Type *blt = base_type(lt); + // Type *brt = base_type(rt); + // i64 bits = gb_max(blt->BitFieldValue.bits, brt->BitFieldValue.bits); + // i64 bytes = bits / 8; + // switch (bytes) { + // case 1: + // left = ir_emit_conv(proc, left, t_u8); + // right = ir_emit_conv(proc, right, t_u8); + // break; + // case 2: + // left = ir_emit_conv(proc, left, t_u16); + // right = ir_emit_conv(proc, right, t_u16); + // break; + // case 4: + // left = ir_emit_conv(proc, left, t_u32); + // right = ir_emit_conv(proc, right, t_u32); + // break; + // case 8: + // left = ir_emit_conv(proc, left, t_u64); + // right = ir_emit_conv(proc, right, t_u64); + // break; + // default: GB_PANIC("Unknown integer size"); break; + // } + // } lt = ir_type(left); rt = ir_type(right); @@ -6493,7 +6276,6 @@ bool ir_is_type_aggregate(Type *t) { case Type_Tuple: case Type_DynamicArray: case Type_Map: - case Type_BitField: case Type_SimdVector: return true; @@ -6790,7 +6572,6 @@ u64 ir_typeid_as_integer(irModule *m, Type *type) { case Type_Union: kind = Typeid_Union; break; case Type_Tuple: kind = Typeid_Tuple; break; case Type_Proc: kind = Typeid_Procedure; break; - case Type_BitField: kind = Typeid_Bit_Field; break; case Type_BitSet: kind = Typeid_Bit_Set; break; case Type_SimdVector: kind = Typeid_Simd_Vector; break; case Type_RelativePointer: kind = Typeid_Relative_Pointer; break; @@ -8826,22 +8607,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { GB_ASSERT(sel.entity != nullptr); - if (sel.entity->type->kind == Type_BitFieldValue) { - irAddr addr = ir_build_addr(proc, se->expr); - Type *bft = type_deref(ir_addr_type(addr)); - if (sel.index.count == 1) { - GB_ASSERT(is_type_bit_field(bft)); - i32 index = sel.index[0]; - return ir_addr_bit_field(ir_addr_get_ptr(proc, addr), index); - } else { - Selection s = sel; - s.index.count--; - i32 index = s.index[s.index.count-1]; - irValue *a = ir_addr_get_ptr(proc, addr); - a = ir_emit_deep_field_gep(proc, a, s); - return ir_addr_bit_field(a, index); - } - } else { + { irAddr addr = ir_build_addr(proc, se->expr); if (addr.kind == irAddr_Context) { GB_ASSERT(sel.index.count > 0); @@ -12726,50 +12492,6 @@ void ir_setup_type_info_data(irProcedure *proc) { // NOTE(bill): Setup type_info break; } - case Type_BitField: { - ir_emit_comment(proc, str_lit("Type_Info_Bit_Field")); - tag = ir_emit_conv(proc, variant_ptr, t_type_info_bit_field_ptr); - // names: []string; - // bits: []u32; - // offsets: []u32; - isize count = t->BitField.fields.count; - if (count > 0) { - auto fields = t->BitField.fields; - irValue *name_array = ir_generate_array(m, t_string, count, str_lit("$bit_field_names"), cast(i64)entry_index); - irValue *bit_array = ir_generate_array(m, t_i32, count, str_lit("$bit_field_bits"), cast(i64)entry_index); - irValue *offset_array = ir_generate_array(m, t_i32, count, str_lit("$bit_field_offsets"), cast(i64)entry_index); - - for (isize i = 0; i < count; i++) { - Entity *f = fields[i]; - GB_ASSERT(f->type != nullptr); - GB_ASSERT(f->type->kind == Type_BitFieldValue); - irValue *name_ep = ir_emit_array_epi(proc, name_array, cast(i32)i); - irValue *bit_ep = ir_emit_array_epi(proc, bit_array, cast(i32)i); - irValue *offset_ep = ir_emit_array_epi(proc, offset_array, cast(i32)i); - - ir_emit_store(proc, name_ep, ir_const_string(proc->module, f->token.string)); - ir_emit_store(proc, bit_ep, ir_const_i32(f->type->BitFieldValue.bits)); - ir_emit_store(proc, offset_ep, ir_const_i32(t->BitField.offsets[i])); - - } - - irValue *v_count = ir_const_int(count); - - irValue *names = ir_emit_struct_ep(proc, tag, 0); - irValue *name_array_elem = ir_array_elem(proc, name_array); - ir_fill_slice(proc, names, name_array_elem, v_count); - - irValue *bits = ir_emit_struct_ep(proc, tag, 1); - irValue *bit_array_elem = ir_array_elem(proc, bit_array); - ir_fill_slice(proc, bits, bit_array_elem, v_count); - - irValue *offsets = ir_emit_struct_ep(proc, tag, 2); - irValue *offset_array_elem = ir_array_elem(proc, offset_array); - ir_fill_slice(proc, offsets, offset_array_elem, v_count); - } - break; - } - case Type_BitSet: ir_emit_comment(proc, str_lit("Type_Info_Bit_Set")); tag = ir_emit_conv(proc, variant_ptr, t_type_info_bit_set_ptr); |