| ... | @@ -5507,34 +5507,48 @@ bool handle_is_ptr(CodeGen *g, ZigType *type_entry) { | ... | @@ -5507,34 +5507,48 @@ bool handle_is_ptr(CodeGen *g, ZigType *type_entry) { |
| 5507 | zig_unreachable(); | 5507 | zig_unreachable(); |
| 5508 | } | 5508 | } |
| 5509 | | 5509 | |
| 5510 | static uint32_t hash_ptr(void *ptr) { | 5510 | static const uint32_t HASH_INIT = 0x811c9dc5U; |
| 5511 | return (uint32_t)(((uintptr_t)ptr) % UINT32_MAX); | 5511 | |
| | 5512 | template<typename T> |
| | 5513 | static uint32_t hash_combine(uint32_t hash, const T *value, size_t count = 1) { |
| | 5514 | // Simple FNV32 hash |
| | 5515 | size_t len = sizeof(T) * count; |
| | 5516 | const unsigned char *char_bytes = (const unsigned char*)value; |
| | 5517 | for (size_t c = 0; c < len; ++c) { |
| | 5518 | hash ^= char_bytes[c]; |
| | 5519 | hash *= 0x01000193U; |
| | 5520 | } |
| | 5521 | return hash; |
| | 5522 | } |
| | 5523 | |
| | 5524 | static uint32_t hash_combine_bigint(uint32_t hash, const BigInt *value) { |
| | 5525 | return hash_combine(hash, bigint_ptr(value), value->digit_count); |
| 5512 | } | 5526 | } |
| 5513 | | 5527 | |
| 5514 | static uint32_t hash_size(size_t x) { | 5528 | static uint32_t hash_combine_buf(uint32_t hash, const Buf *buf) { |
| 5515 | return (uint32_t)(x % UINT32_MAX); | 5529 | return hash_combine(hash, buf_ptr(buf), buf_len(buf)); |
| 5516 | } | 5530 | } |
| 5517 | | 5531 | |
| 5518 | uint32_t fn_table_entry_hash(ZigFn* value) { | 5532 | uint32_t fn_table_entry_hash(ZigFn* value) { |
| 5519 | return ptr_hash(value); | 5533 | return hash_combine(HASH_INIT, &value); |
| 5520 | } | 5534 | } |
| 5521 | | 5535 | |
| 5522 | bool fn_table_entry_eql(ZigFn *a, ZigFn *b) { | 5536 | bool fn_table_entry_eql(ZigFn *a, ZigFn *b) { |
| 5523 | return ptr_eq(a, b); | 5537 | return a == b; |
| 5524 | } | 5538 | } |
| 5525 | | 5539 | |
| 5526 | uint32_t fn_type_id_hash(FnTypeId *id) { | 5540 | uint32_t fn_type_id_hash(FnTypeId *id) { |
| 5527 | uint32_t result = 0; | 5541 | uint32_t hash = HASH_INIT; |
| 5528 | result += ((uint32_t)(id->cc)) * (uint32_t)3349388391; | 5542 | hash = hash_combine(hash, &id->cc); |
| 5529 | result += id->is_var_args ? (uint32_t)1931444534 : 0; | 5543 | hash = hash_combine(hash, &id->is_var_args); |
| 5530 | result += hash_ptr(id->return_type); | 5544 | hash = hash_combine(hash, &id->return_type); |
| 5531 | result += id->alignment * 0xd3b3f3e2; | 5545 | hash = hash_combine(hash, &id->alignment); |
| 5532 | for (size_t i = 0; i < id->param_count; i += 1) { | 5546 | for (size_t i = 0; i < id->param_count; i += 1) { |
| 5533 | FnTypeParamInfo *info = &id->param_info[i]; | 5547 | FnTypeParamInfo *info = &id->param_info[i]; |
| 5534 | result += info->is_noalias ? (uint32_t)892356923 : 0; | 5548 | hash = hash_combine(hash, &info->is_noalias); |
| 5535 | result += hash_ptr(info->type); | 5549 | hash = hash_combine(hash, &info->type); |
| 5536 | } | 5550 | } |
| 5537 | return result; | 5551 | return hash; |
| 5538 | } | 5552 | } |
| 5539 | | 5553 | |
| 5540 | bool fn_type_id_eql(FnTypeId *a, FnTypeId *b) { | 5554 | bool fn_type_id_eql(FnTypeId *a, FnTypeId *b) { |
| ... | @@ -5559,194 +5573,202 @@ bool fn_type_id_eql(FnTypeId *a, FnTypeId *b) { | ... | @@ -5559,194 +5573,202 @@ bool fn_type_id_eql(FnTypeId *a, FnTypeId *b) { |
| 5559 | return true; | 5573 | return true; |
| 5560 | } | 5574 | } |
| 5561 | | 5575 | |
| 5562 | static uint32_t hash_const_val_error_set(ZigValue *const_val) { | 5576 | static uint32_t hash_combine_const_val_error_set(uint32_t hash_val, ZigValue *const_val) { |
| 5563 | assert(const_val->data.x_err_set != nullptr); | 5577 | assert(const_val->data.x_err_set != nullptr); |
| 5564 | return const_val->data.x_err_set->value ^ 2630160122; | 5578 | return hash_combine(hash_val, &const_val->data.x_err_set->value); |
| 5565 | } | 5579 | } |
| 5566 | | 5580 | |
| 5567 | static uint32_t hash_const_val_ptr(ZigValue *const_val) { | 5581 | static uint32_t hash_combine_const_val_ptr(uint32_t hash_val, ZigValue *const_val) { |
| 5568 | uint32_t hash_val = 0; | 5582 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.special); |
| 5569 | switch (const_val->data.x_ptr.mut) { | | |
| 5570 | case ConstPtrMutRuntimeVar: | | |
| 5571 | hash_val += (uint32_t)3500721036; | | |
| 5572 | break; | | |
| 5573 | case ConstPtrMutComptimeConst: | | |
| 5574 | hash_val += (uint32_t)4214318515; | | |
| 5575 | break; | | |
| 5576 | case ConstPtrMutInfer: | | |
| 5577 | case ConstPtrMutComptimeVar: | | |
| 5578 | hash_val += (uint32_t)1103195694; | | |
| 5579 | break; | | |
| 5580 | } | | |
| 5581 | switch (const_val->data.x_ptr.special) { | 5583 | switch (const_val->data.x_ptr.special) { |
| 5582 | case ConstPtrSpecialInvalid: | 5584 | case ConstPtrSpecialInvalid: |
| 5583 | zig_unreachable(); | 5585 | zig_unreachable(); |
| 5584 | case ConstPtrSpecialRef: | 5586 | case ConstPtrSpecialRef: |
| 5585 | hash_val += (uint32_t)2478261866; | 5587 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.ref.pointee); |
| 5586 | hash_val += hash_ptr(const_val->data.x_ptr.data.ref.pointee); | | |
| 5587 | return hash_val; | 5588 | return hash_val; |
| 5588 | case ConstPtrSpecialBaseArray: | 5589 | case ConstPtrSpecialBaseArray: |
| 5589 | hash_val += (uint32_t)1764906839; | 5590 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_array.array_val); |
| 5590 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_array.array_val); | 5591 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_array.elem_index); |
| 5591 | hash_val += hash_size(const_val->data.x_ptr.data.base_array.elem_index); | | |
| 5592 | return hash_val; | 5592 | return hash_val; |
| 5593 | case ConstPtrSpecialSubArray: | 5593 | case ConstPtrSpecialSubArray: |
| 5594 | hash_val += (uint32_t)2643358777; | 5594 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_array.array_val); |
| 5595 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_array.array_val); | 5595 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_array.elem_index); |
| 5596 | hash_val += hash_size(const_val->data.x_ptr.data.base_array.elem_index); | | |
| 5597 | return hash_val; | 5596 | return hash_val; |
| 5598 | case ConstPtrSpecialBaseStruct: | 5597 | case ConstPtrSpecialBaseStruct: |
| 5599 | hash_val += (uint32_t)3518317043; | 5598 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_struct.struct_val); |
| 5600 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_struct.struct_val); | 5599 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_struct.field_index); |
| 5601 | hash_val += hash_size(const_val->data.x_ptr.data.base_struct.field_index); | | |
| 5602 | return hash_val; | 5600 | return hash_val; |
| 5603 | case ConstPtrSpecialBaseErrorUnionCode: | 5601 | case ConstPtrSpecialBaseErrorUnionCode: |
| 5604 | hash_val += (uint32_t)2994743799; | 5602 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_err_union_code.err_union_val); |
| 5605 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_err_union_code.err_union_val); | | |
| 5606 | return hash_val; | 5603 | return hash_val; |
| 5607 | case ConstPtrSpecialBaseErrorUnionPayload: | 5604 | case ConstPtrSpecialBaseErrorUnionPayload: |
| 5608 | hash_val += (uint32_t)3456080131; | 5605 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_err_union_payload.err_union_val); |
| 5609 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_err_union_payload.err_union_val); | | |
| 5610 | return hash_val; | 5606 | return hash_val; |
| 5611 | case ConstPtrSpecialBaseOptionalPayload: | 5607 | case ConstPtrSpecialBaseOptionalPayload: |
| 5612 | hash_val += (uint32_t)3163140517; | 5608 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.base_optional_payload.optional_val); |
| 5613 | hash_val += hash_ptr(const_val->data.x_ptr.data.base_optional_payload.optional_val); | | |
| 5614 | return hash_val; | 5609 | return hash_val; |
| 5615 | case ConstPtrSpecialHardCodedAddr: | 5610 | case ConstPtrSpecialHardCodedAddr: |
| 5616 | hash_val += (uint32_t)4048518294; | 5611 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.hard_coded_addr.addr); |
| 5617 | hash_val += hash_size(const_val->data.x_ptr.data.hard_coded_addr.addr); | | |
| 5618 | return hash_val; | | |
| 5619 | case ConstPtrSpecialDiscard: | | |
| 5620 | hash_val += 2010123162; | | |
| 5621 | return hash_val; | 5612 | return hash_val; |
| 5622 | case ConstPtrSpecialFunction: | 5613 | case ConstPtrSpecialFunction: |
| 5623 | hash_val += (uint32_t)2590901619; | 5614 | hash_val = hash_combine(hash_val, &const_val->data.x_ptr.data.fn.fn_entry); |
| 5624 | hash_val += hash_ptr(const_val->data.x_ptr.data.fn.fn_entry); | | |
| 5625 | return hash_val; | 5615 | return hash_val; |
| | 5616 | case ConstPtrSpecialDiscard: |
| 5626 | case ConstPtrSpecialNull: | 5617 | case ConstPtrSpecialNull: |
| 5627 | hash_val += (uint32_t)1486246455; | 5618 | // No fields to hash |
| 5628 | return hash_val; | 5619 | return hash_val; |
| 5629 | } | 5620 | } |
| 5630 | zig_unreachable(); | 5621 | zig_unreachable(); |
| 5631 | } | 5622 | } |
| 5632 | | 5623 | |
| 5633 | static uint32_t hash_const_val(ZigValue *const_val) { | 5624 | static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val); |
| | 5625 | static uint32_t hash_combine_const_val_array(uint32_t hash_val, ZigValue *array, size_t len) { |
| | 5626 | if (array->data.x_array.special == ConstArraySpecialUndef) { |
| | 5627 | char undef_tag = 56; |
| | 5628 | return hash_combine(hash_val, &undef_tag); |
| | 5629 | } else if (array->data.x_array.special == ConstArraySpecialBuf) { |
| | 5630 | // Hash in a way that is compatible with standard byte arrays |
| | 5631 | // If any of these asserts fails, the if after this needs to be modified |
| | 5632 | // to handle the new type in SpecialBuf. |
| | 5633 | assert(array->type->data.array.child_type->id == ZigTypeIdInt); |
| | 5634 | assert(array->type->data.array.child_type->data.integral.bit_count == 8); |
| | 5635 | assert(array->type->data.array.child_type->data.integral.is_signed == false); |
| | 5636 | const char *buf_pos = buf_ptr(array->data.x_array.data.s_buf); |
| | 5637 | const char *buf_end = buf_pos + buf_len(array->data.x_array.data.s_buf); |
| | 5638 | while (buf_pos < buf_end) { |
| | 5639 | hash_val = hash_combine(hash_val, buf_pos); |
| | 5640 | buf_pos++; |
| | 5641 | } |
| | 5642 | return hash_val; |
| | 5643 | } else if (array->type->data.array.child_type->id == ZigTypeIdInt && |
| | 5644 | array->type->data.array.child_type->data.integral.bit_count == 8 && |
| | 5645 | array->type->data.array.child_type->data.integral.is_signed == false) { |
| | 5646 | // If the type is u8, we hash it as if it's a ConstArraySpecialBuf, |
| | 5647 | // to maintain compatibility. |
| | 5648 | ZigValue *elems = array->data.x_array.data.s_none.elements; |
| | 5649 | for (size_t i = 0; i < len; i += 1) { |
| | 5650 | ZigValue *value = &elems[i]; |
| | 5651 | assert(value->type == array->type->data.array.child_type); |
| | 5652 | // N.B. Using char here instead of uint8_t to match the const char* |
| | 5653 | // returned by buf_ptr. |
| | 5654 | const char byte_value = (char) bigint_as_u8(&value->data.x_bigint); |
| | 5655 | hash_val = hash_combine(hash_val, &byte_value); |
| | 5656 | } |
| | 5657 | return hash_val; |
| | 5658 | } else { |
| | 5659 | ZigValue *elems = array->data.x_array.data.s_none.elements; |
| | 5660 | for (size_t i = 0; i < len; i += 1) { |
| | 5661 | hash_val = hash_combine_const_val(hash_val, &elems[i]); |
| | 5662 | } |
| | 5663 | return hash_val; |
| | 5664 | } |
| | 5665 | } |
| | 5666 | static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) { |
| | 5667 | hash_val = hash_combine(hash_val, &const_val->special); |
| | 5668 | if (const_val->special == ConstValSpecialUndef) { |
| | 5669 | return hash_val; |
| | 5670 | } |
| | 5671 | // if (const_val->special == ConstValSpecialLazy || |
| | 5672 | // const_val->special == ConstValSpecialRuntime) { |
| | 5673 | // // NO_COMMIT verify this is correct |
| | 5674 | // return hash_combine(hash_val, &const_val); |
| | 5675 | // } |
| | 5676 | if (const_val->special != ConstValSpecialStatic) { |
| | 5677 | printf("\nInvalid special: %d\n", const_val->special); |
| | 5678 | } |
| 5634 | assert(const_val->special == ConstValSpecialStatic); | 5679 | assert(const_val->special == ConstValSpecialStatic); |
| | 5680 | hash_val = hash_combine(hash_val, &const_val->type->id); |
| 5635 | switch (const_val->type->id) { | 5681 | switch (const_val->type->id) { |
| 5636 | case ZigTypeIdOpaque: | 5682 | case ZigTypeIdOpaque: |
| 5637 | zig_unreachable(); | 5683 | zig_unreachable(); |
| 5638 | case ZigTypeIdBool: | 5684 | case ZigTypeIdBool: |
| 5639 | return const_val->data.x_bool ? (uint32_t)127863866 : (uint32_t)215080464; | 5685 | return hash_combine(hash_val, &const_val->data.x_bool); |
| 5640 | case ZigTypeIdMetaType: | 5686 | case ZigTypeIdMetaType: |
| 5641 | return hash_ptr(const_val->data.x_type); | 5687 | return hash_combine(hash_val, &const_val->data.x_type); |
| 5642 | case ZigTypeIdVoid: | | |
| 5643 | return (uint32_t)4149439618; | | |
| 5644 | case ZigTypeIdInt: | 5688 | case ZigTypeIdInt: |
| 5645 | case ZigTypeIdComptimeInt: | 5689 | case ZigTypeIdComptimeInt: |
| 5646 | { | 5690 | return hash_combine_bigint(hash_val, &const_val->data.x_bigint); |
| 5647 | uint32_t result = 1331471175; | | |
| 5648 | for (size_t i = 0; i < const_val->data.x_bigint.digit_count; i += 1) { | | |
| 5649 | uint64_t digit = bigint_ptr(&const_val->data.x_bigint)[i]; | | |
| 5650 | result ^= ((uint32_t)(digit >> 32)) ^ (uint32_t)(result); | | |
| 5651 | } | | |
| 5652 | return result; | | |
| 5653 | } | | |
| 5654 | case ZigTypeIdEnumLiteral: | 5691 | case ZigTypeIdEnumLiteral: |
| 5655 | return buf_hash(const_val->data.x_enum_literal) * (uint32_t)2691276464; | 5692 | return hash_combine_buf(hash_val, const_val->data.x_enum_literal); |
| 5656 | case ZigTypeIdEnum: | 5693 | case ZigTypeIdEnum: |
| 5657 | { | 5694 | return hash_combine_bigint(hash_val, &const_val->data.x_enum_tag); |
| 5658 | uint32_t result = 31643936; | | |
| 5659 | for (size_t i = 0; i < const_val->data.x_enum_tag.digit_count; i += 1) { | | |
| 5660 | uint64_t digit = bigint_ptr(&const_val->data.x_enum_tag)[i]; | | |
| 5661 | result ^= ((uint32_t)(digit >> 32)) ^ (uint32_t)(result); | | |
| 5662 | } | | |
| 5663 | return result; | | |
| 5664 | } | | |
| 5665 | case ZigTypeIdFloat: | 5695 | case ZigTypeIdFloat: |
| | 5696 | hash_val = hash_combine(hash_val, &const_val->type->data.floating.bit_count); |
| 5666 | switch (const_val->type->data.floating.bit_count) { | 5697 | switch (const_val->type->data.floating.bit_count) { |
| 5667 | case 16: | 5698 | case 16: return hash_combine(hash_val, &const_val->data.x_f16); |
| 5668 | { | 5699 | case 32: return hash_combine(hash_val, &const_val->data.x_f32); |
| 5669 | uint16_t result; | 5700 | case 64: return hash_combine(hash_val, &const_val->data.x_f64); |
| 5670 | static_assert(sizeof(result) == sizeof(const_val->data.x_f16), ""); | 5701 | case 128: return hash_combine(hash_val, &const_val->data.x_f128); |
| 5671 | memcpy(&result, &const_val->data.x_f16, sizeof(result)); | 5702 | default: zig_unreachable(); |
| 5672 | return result * 65537u; | | |
| 5673 | } | | |
| 5674 | case 32: | | |
| 5675 | { | | |
| 5676 | uint32_t result; | | |
| 5677 | memcpy(&result, &const_val->data.x_f32, 4); | | |
| 5678 | return result ^ 4084870010; | | |
| 5679 | } | | |
| 5680 | case 64: | | |
| 5681 | { | | |
| 5682 | uint32_t ints[2]; | | |
| 5683 | memcpy(&ints[0], &const_val->data.x_f64, 8); | | |
| 5684 | return ints[0] ^ ints[1] ^ 0x22ed43c6; | | |
| 5685 | } | | |
| 5686 | case 128: | | |
| 5687 | { | | |
| 5688 | uint32_t ints[4]; | | |
| 5689 | memcpy(&ints[0], &const_val->data.x_f128, 16); | | |
| 5690 | return ints[0] ^ ints[1] ^ ints[2] ^ ints[3] ^ 0xb5ffef27; | | |
| 5691 | } | | |
| 5692 | default: | | |
| 5693 | zig_unreachable(); | | |
| 5694 | } | 5703 | } |
| 5695 | case ZigTypeIdComptimeFloat: | 5704 | case ZigTypeIdComptimeFloat: |
| 5696 | { | 5705 | return hash_combine(hash_val, &const_val->data.x_bigfloat.value); |
| 5697 | float128_t f128 = bigfloat_to_f128(&const_val->data.x_bigfloat); | | |
| 5698 | uint32_t ints[4]; | | |
| 5699 | memcpy(&ints[0], &f128, 16); | | |
| 5700 | return ints[0] ^ ints[1] ^ ints[2] ^ ints[3] ^ 0xed8b3dfb; | | |
| 5701 | } | | |
| 5702 | case ZigTypeIdFn: | 5706 | case ZigTypeIdFn: |
| 5703 | assert(const_val->data.x_ptr.mut == ConstPtrMutComptimeConst); | 5707 | assert(const_val->data.x_ptr.mut == ConstPtrMutComptimeConst); |
| 5704 | assert(const_val->data.x_ptr.special == ConstPtrSpecialFunction); | 5708 | assert(const_val->data.x_ptr.special == ConstPtrSpecialFunction); |
| 5705 | return 3677364617 ^ hash_ptr(const_val->data.x_ptr.data.fn.fn_entry); | 5709 | return hash_combine(hash_val, &const_val->data.x_ptr.data.fn.fn_entry); |
| 5706 | case ZigTypeIdPointer: | 5710 | case ZigTypeIdPointer: |
| 5707 | return hash_const_val_ptr(const_val); | 5711 | return hash_combine_const_val_ptr(hash_val, const_val); |
| | 5712 | case ZigTypeIdVoid: |
| 5708 | case ZigTypeIdUndefined: | 5713 | case ZigTypeIdUndefined: |
| 5709 | return 162837799; | | |
| 5710 | case ZigTypeIdNull: | 5714 | case ZigTypeIdNull: |
| 5711 | return 844854567; | 5715 | return hash_val; |
| 5712 | case ZigTypeIdArray: | 5716 | case ZigTypeIdArray: |
| 5713 | // TODO better hashing algorithm | 5717 | return hash_combine_const_val_array(hash_val, const_val, const_val->type->data.array.len); |
| 5714 | return 1166190605; | 5718 | case ZigTypeIdStruct: { |
| 5715 | case ZigTypeIdStruct: | 5719 | size_t field_count = const_val->type->data.structure.src_field_count; |
| 5716 | // TODO better hashing algorithm | 5720 | for (size_t i = 0; i < field_count; i += 1) { |
| 5717 | return 1532530855; | 5721 | ZigValue *field = const_val->data.x_struct.fields[i]; |
| 5718 | case ZigTypeIdUnion: | 5722 | hash_val = hash_combine_const_val(hash_val, field); |
| 5719 | // TODO better hashing algorithm | 5723 | } |
| 5720 | return 2709806591; | 5724 | return hash_val; |
| | 5725 | } |
| | 5726 | case ZigTypeIdUnion: { |
| | 5727 | ConstUnionValue *union_value = &const_val->data.x_union; |
| | 5728 | hash_val = hash_combine_bigint(hash_val, &union_value->tag); |
| | 5729 | return hash_combine_const_val(hash_val, union_value->payload); |
| | 5730 | } |
| 5721 | case ZigTypeIdOptional: | 5731 | case ZigTypeIdOptional: |
| 5722 | if (get_src_ptr_type(const_val->type) != nullptr) { | 5732 | if (get_src_ptr_type(const_val->type) != nullptr) { |
| 5723 | return hash_const_val_ptr(const_val) * (uint32_t)1992916303; | 5733 | char tag = 1; |
| | 5734 | hash_val = hash_combine(hash_val, &tag); |
| | 5735 | return hash_combine_const_val_ptr(hash_val, const_val); |
| 5724 | } else if (const_val->type->data.maybe.child_type->id == ZigTypeIdErrorSet) { | 5736 | } else if (const_val->type->data.maybe.child_type->id == ZigTypeIdErrorSet) { |
| 5725 | return hash_const_val_error_set(const_val) * (uint32_t)3147031929; | 5737 | char tag = 2; |
| | 5738 | hash_val = hash_combine(hash_val, &tag); |
| | 5739 | return hash_combine_const_val_error_set(hash_val, const_val); |
| | 5740 | } else if (const_val->data.x_optional) { |
| | 5741 | char tag = 3; |
| | 5742 | hash_val = hash_combine(hash_val, &tag); |
| | 5743 | return hash_combine_const_val(hash_val, const_val->data.x_optional); |
| 5726 | } else { | 5744 | } else { |
| 5727 | if (const_val->data.x_optional) { | 5745 | char tag = 4; |
| 5728 | return hash_const_val(const_val->data.x_optional) * (uint32_t)1992916303; | 5746 | hash_val = hash_combine(hash_val, &tag); |
| 5729 | } else { | 5747 | return hash_val; |
| 5730 | return 4016830364; | | |
| 5731 | } | | |
| 5732 | } | 5748 | } |
| 5733 | case ZigTypeIdErrorUnion: | 5749 | case ZigTypeIdErrorUnion: { |
| 5734 | // TODO better hashing algorithm | 5750 | bool is_err = const_val->data.x_err_union.error_set->data.x_err_set != nullptr; |
| 5735 | return 3415065496; | 5751 | hash_val = hash_combine(hash_val, &is_err); |
| | 5752 | if (is_err) { |
| | 5753 | hash_val = hash_combine_const_val(hash_val, const_val->data.x_err_union.error_set); |
| | 5754 | } else { |
| | 5755 | hash_val = hash_combine_const_val(hash_val, const_val->data.x_err_union.payload); |
| | 5756 | } |
| | 5757 | return hash_val; |
| | 5758 | } |
| 5736 | case ZigTypeIdErrorSet: | 5759 | case ZigTypeIdErrorSet: |
| 5737 | return hash_const_val_error_set(const_val); | 5760 | return hash_combine_const_val_error_set(hash_val, const_val); |
| 5738 | case ZigTypeIdVector: | 5761 | case ZigTypeIdVector: |
| 5739 | // TODO better hashing algorithm | 5762 | return hash_combine_const_val_array(hash_val, const_val, const_val->type->data.vector.len); |
| 5740 | return 3647867726; | | |
| 5741 | case ZigTypeIdFnFrame: | 5763 | case ZigTypeIdFnFrame: |
| 5742 | // TODO better hashing algorithm | 5764 | // TODO better hashing algorithm |
| 5743 | return 675741936; | 5765 | return hash_val; |
| 5744 | case ZigTypeIdAnyFrame: | 5766 | case ZigTypeIdAnyFrame: |
| 5745 | // TODO better hashing algorithm | 5767 | // TODO better hashing algorithm |
| 5746 | return 3747294894; | 5768 | return hash_val; |
| 5747 | case ZigTypeIdBoundFn: { | 5769 | case ZigTypeIdBoundFn: { |
| 5748 | assert(const_val->data.x_bound_fn.fn != nullptr); | 5770 | assert(const_val->data.x_bound_fn.fn != nullptr); |
| 5749 | return 3677364617 ^ hash_ptr(const_val->data.x_bound_fn.fn); | 5771 | return hash_combine(hash_val, &const_val->data.x_bound_fn.fn); |
| 5750 | } | 5772 | } |
| 5751 | case ZigTypeIdInvalid: | 5773 | case ZigTypeIdInvalid: |
| 5752 | case ZigTypeIdUnreachable: | 5774 | case ZigTypeIdUnreachable: |
| ... | @@ -5754,15 +5776,18 @@ static uint32_t hash_const_val(ZigValue *const_val) { | ... | @@ -5754,15 +5776,18 @@ static uint32_t hash_const_val(ZigValue *const_val) { |
| 5754 | } | 5776 | } |
| 5755 | zig_unreachable(); | 5777 | zig_unreachable(); |
| 5756 | } | 5778 | } |
| | 5779 | static uint32_t hash_const_val(ZigValue *const_val) { |
| | 5780 | return hash_combine_const_val(HASH_INIT, const_val); |
| | 5781 | } |
| 5757 | | 5782 | |
| 5758 | uint32_t generic_fn_type_id_hash(GenericFnTypeId *id) { | 5783 | uint32_t generic_fn_type_id_hash(GenericFnTypeId *id) { |
| 5759 | uint32_t result = 0; | 5784 | uint32_t result = HASH_INIT; |
| 5760 | result += hash_ptr(id->fn_entry); | 5785 | result = hash_combine(result, &id->fn_entry); |
| 5761 | for (size_t i = 0; i < id->param_count; i += 1) { | 5786 | for (size_t i = 0; i < id->param_count; i += 1) { |
| 5762 | ZigValue *generic_param = &id->params[i]; | 5787 | ZigValue *generic_param = &id->params[i]; |
| 5763 | if (generic_param->special != ConstValSpecialRuntime) { | 5788 | if (generic_param->special != ConstValSpecialRuntime) { |
| 5764 | result += hash_const_val(generic_param); | 5789 | result = hash_combine_const_val(result, generic_param); |
| 5765 | result += hash_ptr(generic_param->type); | 5790 | result = hash_combine(result, &generic_param->type); |
| 5766 | } | 5791 | } |
| 5767 | } | 5792 | } |
| 5768 | return result; | 5793 | return result; |
| ... | @@ -5957,15 +5982,15 @@ bool fn_eval_cacheable(Scope *scope, ZigType *return_type) { | ... | @@ -5957,15 +5982,15 @@ bool fn_eval_cacheable(Scope *scope, ZigType *return_type) { |
| 5957 | } | 5982 | } |
| 5958 | | 5983 | |
| 5959 | uint32_t fn_eval_hash(Scope* scope) { | 5984 | uint32_t fn_eval_hash(Scope* scope) { |
| 5960 | uint32_t result = 0; | 5985 | uint32_t hash = HASH_INIT; |
| 5961 | while (scope) { | 5986 | while (scope) { |
| 5962 | if (scope->id == ScopeIdVarDecl) { | 5987 | if (scope->id == ScopeIdVarDecl) { |
| 5963 | ScopeVarDecl *var_scope = (ScopeVarDecl *)scope; | 5988 | ScopeVarDecl *var_scope = (ScopeVarDecl *)scope; |
| 5964 | result += hash_const_val(var_scope->var->const_value); | 5989 | hash = hash_combine_const_val(hash, var_scope->var->const_value); |
| 5965 | } else if (scope->id == ScopeIdFnDef) { | 5990 | } else if (scope->id == ScopeIdFnDef) { |
| 5966 | ScopeFnDef *fn_scope = (ScopeFnDef *)scope; | 5991 | ScopeFnDef *fn_scope = (ScopeFnDef *)scope; |
| 5967 | result += hash_ptr(fn_scope->fn_entry); | 5992 | hash = hash_combine(hash, &fn_scope->fn_entry); |
| 5968 | return result; | 5993 | return hash; |
| 5969 | } else { | 5994 | } else { |
| 5970 | zig_unreachable(); | 5995 | zig_unreachable(); |
| 5971 | } | 5996 | } |
| ... | @@ -7260,6 +7285,8 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { | ... | @@ -7260,6 +7285,8 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { |
| 7260 | case ZigTypeIdMetaType: | 7285 | case ZigTypeIdMetaType: |
| 7261 | return a->data.x_type == b->data.x_type; | 7286 | return a->data.x_type == b->data.x_type; |
| 7262 | case ZigTypeIdVoid: | 7287 | case ZigTypeIdVoid: |
| | 7288 | case ZigTypeIdUndefined: |
| | 7289 | case ZigTypeIdNull: |
| 7263 | return true; | 7290 | return true; |
| 7264 | case ZigTypeIdErrorSet: | 7291 | case ZigTypeIdErrorSet: |
| 7265 | return a->data.x_err_set->value == b->data.x_err_set->value; | 7292 | return a->data.x_err_set->value == b->data.x_err_set->value; |
| ... | @@ -7292,10 +7319,9 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { | ... | @@ -7292,10 +7319,9 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { |
| 7292 | case ZigTypeIdVector: | 7319 | case ZigTypeIdVector: |
| 7293 | assert(a->type->data.vector.len == b->type->data.vector.len); | 7320 | assert(a->type->data.vector.len == b->type->data.vector.len); |
| 7294 | return const_values_equal_array(g, a, b, a->type->data.vector.len); | 7321 | return const_values_equal_array(g, a, b, a->type->data.vector.len); |
| 7295 | case ZigTypeIdArray: { | 7322 | case ZigTypeIdArray: |
| 7296 | assert(a->type->data.array.len == b->type->data.array.len); | 7323 | assert(a->type->data.array.len == b->type->data.array.len); |
| 7297 | return const_values_equal_array(g, a, b, a->type->data.array.len); | 7324 | return const_values_equal_array(g, a, b, a->type->data.array.len); |
| 7298 | } | | |
| 7299 | case ZigTypeIdStruct: | 7325 | case ZigTypeIdStruct: |
| 7300 | for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) { | 7326 | for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) { |
| 7301 | ZigValue *field_a = a->data.x_struct.fields[i]; | 7327 | ZigValue *field_a = a->data.x_struct.fields[i]; |
| ... | @@ -7308,10 +7334,6 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { | ... | @@ -7308,10 +7334,6 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) { |
| 7308 | zig_panic("TODO: const_values_equal ZigTypeIdFnFrame"); | 7334 | zig_panic("TODO: const_values_equal ZigTypeIdFnFrame"); |
| 7309 | case ZigTypeIdAnyFrame: | 7335 | case ZigTypeIdAnyFrame: |
| 7310 | zig_panic("TODO: const_values_equal ZigTypeIdAnyFrame"); | 7336 | zig_panic("TODO: const_values_equal ZigTypeIdAnyFrame"); |
| 7311 | case ZigTypeIdUndefined: | | |
| 7312 | zig_panic("TODO: const_values_equal ZigTypeIdUndefined"); | | |
| 7313 | case ZigTypeIdNull: | | |
| 7314 | zig_panic("TODO: const_values_equal ZigTypeIdNull"); | | |
| 7315 | case ZigTypeIdOptional: | 7337 | case ZigTypeIdOptional: |
| 7316 | if (get_src_ptr_type(a->type) != nullptr) | 7338 | if (get_src_ptr_type(a->type) != nullptr) |
| 7317 | return const_values_equal_ptr(a, b); | 7339 | return const_values_equal_ptr(a, b); |
| ... | @@ -7719,6 +7741,7 @@ ZigType *make_int_type(CodeGen *g, bool is_signed, uint32_t size_in_bits) { | ... | @@ -7719,6 +7741,7 @@ ZigType *make_int_type(CodeGen *g, bool is_signed, uint32_t size_in_bits) { |
| 7719 | } | 7741 | } |
| 7720 | | 7742 | |
| 7721 | uint32_t type_id_hash(TypeId x) { | 7743 | uint32_t type_id_hash(TypeId x) { |
| | 7744 | uint32_t hash = hash_combine(HASH_INIT, &x.id); |
| 7722 | switch (x.id) { | 7745 | switch (x.id) { |
| 7723 | case ZigTypeIdInvalid: | 7746 | case ZigTypeIdInvalid: |
| 7724 | case ZigTypeIdOpaque: | 7747 | case ZigTypeIdOpaque: |
| ... | @@ -7743,27 +7766,38 @@ uint32_t type_id_hash(TypeId x) { | ... | @@ -7743,27 +7766,38 @@ uint32_t type_id_hash(TypeId x) { |
| 7743 | case ZigTypeIdAnyFrame: | 7766 | case ZigTypeIdAnyFrame: |
| 7744 | zig_unreachable(); | 7767 | zig_unreachable(); |
| 7745 | case ZigTypeIdErrorUnion: | 7768 | case ZigTypeIdErrorUnion: |
| 7746 | return hash_ptr(x.data.error_union.err_set_type) ^ hash_ptr(x.data.error_union.payload_type); | 7769 | hash = hash_combine(hash, &x.data.error_union.err_set_type); |
| | 7770 | hash = hash_combine(hash, &x.data.error_union.payload_type); |
| | 7771 | return hash; |
| 7747 | case ZigTypeIdPointer: | 7772 | case ZigTypeIdPointer: |
| 7748 | return hash_ptr(x.data.pointer.child_type) + | 7773 | hash = hash_combine(hash, &x.data.pointer.child_type); |
| 7749 | (uint32_t)x.data.pointer.ptr_len * 1120226602u + | 7774 | hash = hash_combine(hash, &x.data.pointer.ptr_len); |
| 7750 | (x.data.pointer.is_const ? (uint32_t)2749109194 : (uint32_t)4047371087) + | 7775 | hash = hash_combine(hash, &x.data.pointer.is_const); |
| 7751 | (x.data.pointer.is_volatile ? (uint32_t)536730450 : (uint32_t)1685612214) + | 7776 | hash = hash_combine(hash, &x.data.pointer.is_volatile); |
| 7752 | (x.data.pointer.allow_zero ? (uint32_t)3324284834 : (uint32_t)3584904923) + | 7777 | hash = hash_combine(hash, &x.data.pointer.allow_zero); |
| 7753 | (((uint32_t)x.data.pointer.alignment) ^ (uint32_t)0x777fbe0e) + | 7778 | hash = hash_combine(hash, &x.data.pointer.alignment); |
| 7754 | (((uint32_t)x.data.pointer.bit_offset_in_host) ^ (uint32_t)2639019452) + | 7779 | hash = hash_combine(hash, &x.data.pointer.bit_offset_in_host); |
| 7755 | (((uint32_t)x.data.pointer.vector_index) ^ (uint32_t)0x19199716) + | 7780 | hash = hash_combine(hash, &x.data.pointer.vector_index); |
| 7756 | (((uint32_t)x.data.pointer.host_int_bytes) ^ (uint32_t)529908881) * | 7781 | hash = hash_combine(hash, &x.data.pointer.host_int_bytes); |
| 7757 | (x.data.pointer.sentinel ? hash_const_val(x.data.pointer.sentinel) : (uint32_t)2955491856); | 7782 | if (x.data.pointer.sentinel != nullptr) { |
| | 7783 | hash = hash_combine_const_val(hash, x.data.pointer.sentinel); |
| | 7784 | } |
| | 7785 | return hash; |
| 7758 | case ZigTypeIdArray: | 7786 | case ZigTypeIdArray: |
| 7759 | return hash_ptr(x.data.array.child_type) * | 7787 | hash = hash_combine(hash, &x.data.array.child_type); |
| 7760 | ((uint32_t)x.data.array.size ^ (uint32_t)2122979968) * | 7788 | hash = hash_combine(hash, &x.data.array.size); |
| 7761 | (x.data.array.sentinel ? hash_const_val(x.data.array.sentinel) : (uint32_t)1927201585); | 7789 | if (x.data.array.sentinel != nullptr) { |
| | 7790 | hash = hash_combine_const_val(hash, x.data.array.sentinel); |
| | 7791 | } |
| | 7792 | return hash; |
| 7762 | case ZigTypeIdInt: | 7793 | case ZigTypeIdInt: |
| 7763 | return (x.data.integer.is_signed ? (uint32_t)2652528194 : (uint32_t)163929201) + | 7794 | hash = hash_combine(hash, &x.data.integer.is_signed); |
| 7764 | (((uint32_t)x.data.integer.bit_count) ^ (uint32_t)2998081557); | 7795 | hash = hash_combine(hash, &x.data.integer.bit_count); |
| | 7796 | return hash; |
| 7765 | case ZigTypeIdVector: | 7797 | case ZigTypeIdVector: |
| 7766 | return hash_ptr(x.data.vector.elem_type) * (x.data.vector.len * 526582681); | 7798 | hash = hash_combine(hash, &x.data.vector.elem_type); |
| | 7799 | hash = hash_combine(hash, &x.data.vector.len); |
| | 7800 | return hash; |
| 7767 | } | 7801 | } |
| 7768 | zig_unreachable(); | 7802 | zig_unreachable(); |
| 7769 | } | 7803 | } |
| ... | @@ -8155,7 +8189,7 @@ ZigType *get_align_amt_type(CodeGen *g) { | ... | @@ -8155,7 +8189,7 @@ ZigType *get_align_amt_type(CodeGen *g) { |
| 8155 | } | 8189 | } |
| 8156 | | 8190 | |
| 8157 | uint32_t type_ptr_hash(const ZigType *ptr) { | 8191 | uint32_t type_ptr_hash(const ZigType *ptr) { |
| 8158 | return hash_ptr((void*)ptr); | 8192 | return hash_combine(HASH_INIT, &ptr); |
| 8159 | } | 8193 | } |
| 8160 | | 8194 | |
| 8161 | bool type_ptr_eql(const ZigType *a, const ZigType *b) { | 8195 | bool type_ptr_eql(const ZigType *a, const ZigType *b) { |
| ... | @@ -8163,7 +8197,7 @@ bool type_ptr_eql(const ZigType *a, const ZigType *b) { | ... | @@ -8163,7 +8197,7 @@ bool type_ptr_eql(const ZigType *a, const ZigType *b) { |
| 8163 | } | 8197 | } |
| 8164 | | 8198 | |
| 8165 | uint32_t pkg_ptr_hash(const ZigPackage *ptr) { | 8199 | uint32_t pkg_ptr_hash(const ZigPackage *ptr) { |
| 8166 | return hash_ptr((void*)ptr); | 8200 | return hash_combine(HASH_INIT, &ptr); |
| 8167 | } | 8201 | } |
| 8168 | | 8202 | |
| 8169 | bool pkg_ptr_eql(const ZigPackage *a, const ZigPackage *b) { | 8203 | bool pkg_ptr_eql(const ZigPackage *a, const ZigPackage *b) { |
| ... | @@ -8171,7 +8205,7 @@ bool pkg_ptr_eql(const ZigPackage *a, const ZigPackage *b) { | ... | @@ -8171,7 +8205,7 @@ bool pkg_ptr_eql(const ZigPackage *a, const ZigPackage *b) { |
| 8171 | } | 8205 | } |
| 8172 | | 8206 | |
| 8173 | uint32_t tld_ptr_hash(const Tld *ptr) { | 8207 | uint32_t tld_ptr_hash(const Tld *ptr) { |
| 8174 | return hash_ptr((void*)ptr); | 8208 | return hash_combine(HASH_INIT, &ptr); |
| 8175 | } | 8209 | } |
| 8176 | | 8210 | |
| 8177 | bool tld_ptr_eql(const Tld *a, const Tld *b) { | 8211 | bool tld_ptr_eql(const Tld *a, const Tld *b) { |
| ... | @@ -8179,7 +8213,7 @@ bool tld_ptr_eql(const Tld *a, const Tld *b) { | ... | @@ -8179,7 +8213,7 @@ bool tld_ptr_eql(const Tld *a, const Tld *b) { |
| 8179 | } | 8213 | } |
| 8180 | | 8214 | |
| 8181 | uint32_t node_ptr_hash(const AstNode *ptr) { | 8215 | uint32_t node_ptr_hash(const AstNode *ptr) { |
| 8182 | return hash_ptr((void*)ptr); | 8216 | return hash_combine(HASH_INIT, &ptr); |
| 8183 | } | 8217 | } |
| 8184 | | 8218 | |
| 8185 | bool node_ptr_eql(const AstNode *a, const AstNode *b) { | 8219 | bool node_ptr_eql(const AstNode *a, const AstNode *b) { |
| ... | @@ -8187,7 +8221,7 @@ bool node_ptr_eql(const AstNode *a, const AstNode *b) { | ... | @@ -8187,7 +8221,7 @@ bool node_ptr_eql(const AstNode *a, const AstNode *b) { |
| 8187 | } | 8221 | } |
| 8188 | | 8222 | |
| 8189 | uint32_t fn_ptr_hash(const ZigFn *ptr) { | 8223 | uint32_t fn_ptr_hash(const ZigFn *ptr) { |
| 8190 | return hash_ptr((void*)ptr); | 8224 | return hash_combine(HASH_INIT, &ptr); |
| 8191 | } | 8225 | } |
| 8192 | | 8226 | |
| 8193 | bool fn_ptr_eql(const ZigFn *a, const ZigFn *b) { | 8227 | bool fn_ptr_eql(const ZigFn *a, const ZigFn *b) { |
| ... | @@ -8195,7 +8229,7 @@ bool fn_ptr_eql(const ZigFn *a, const ZigFn *b) { | ... | @@ -8195,7 +8229,7 @@ bool fn_ptr_eql(const ZigFn *a, const ZigFn *b) { |
| 8195 | } | 8229 | } |
| 8196 | | 8230 | |
| 8197 | uint32_t err_ptr_hash(const ErrorTableEntry *ptr) { | 8231 | uint32_t err_ptr_hash(const ErrorTableEntry *ptr) { |
| 8198 | return hash_ptr((void*)ptr); | 8232 | return hash_combine(HASH_INIT, &ptr); |
| 8199 | } | 8233 | } |
| 8200 | | 8234 | |
| 8201 | bool err_ptr_eql(const ErrorTableEntry *a, const ErrorTableEntry *b) { | 8235 | bool err_ptr_eql(const ErrorTableEntry *a, const ErrorTableEntry *b) { |