| ... | ... | @@ -50,7 +50,6 @@ ErrorMsg *add_error_note(CodeGen *g, ErrorMsg *parent_msg, AstNode *node, Buf *m |
| 50 | 50 | |
| 51 | 51 | TypeTableEntry *new_type_table_entry(TypeTableEntryId id) { |
| 52 | 52 | TypeTableEntry *entry = allocate<TypeTableEntry>(1); |
| 53 | | entry->arrays_by_size.init(2); |
| 54 | 53 | entry->id = id; |
| 55 | 54 | return entry; |
| 56 | 55 | } |
| ... | ... | @@ -489,34 +488,38 @@ TypeTableEntry *get_error_type(CodeGen *g, TypeTableEntry *child_type) { |
| 489 | 488 | } |
| 490 | 489 | |
| 491 | 490 | TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, uint64_t array_size) { |
| 492 | | auto existing_entry = child_type->arrays_by_size.maybe_get(array_size); |
| 491 | TypeId type_id; |
| 492 | type_id.id = TypeTableEntryIdArray; |
| 493 | type_id.data.array.child_type = child_type; |
| 494 | type_id.data.array.size = array_size; |
| 495 | auto existing_entry = g->type_table.maybe_get(type_id); |
| 493 | 496 | if (existing_entry) { |
| 494 | 497 | TypeTableEntry *entry = existing_entry->value; |
| 495 | 498 | return entry; |
| 496 | | } else { |
| 497 | | ensure_complete_type(g, child_type); |
| 499 | } |
| 498 | 500 | |
| 499 | | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdArray); |
| 500 | | entry->zero_bits = (array_size == 0) || child_type->zero_bits; |
| 501 | ensure_complete_type(g, child_type); |
| 501 | 502 | |
| 502 | | buf_resize(&entry->name, 0); |
| 503 | | buf_appendf(&entry->name, "[%" PRIu64 "]%s", array_size, buf_ptr(&child_type->name)); |
| 503 | TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdArray); |
| 504 | entry->zero_bits = (array_size == 0) || child_type->zero_bits; |
| 504 | 505 | |
| 505 | | if (!entry->zero_bits) { |
| 506 | | entry->type_ref = child_type->type_ref ? LLVMArrayType(child_type->type_ref, array_size) : nullptr; |
| 506 | buf_resize(&entry->name, 0); |
| 507 | buf_appendf(&entry->name, "[%" PRIu64 "]%s", array_size, buf_ptr(&child_type->name)); |
| 507 | 508 | |
| 508 | | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); |
| 509 | | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); |
| 509 | if (!entry->zero_bits) { |
| 510 | entry->type_ref = child_type->type_ref ? LLVMArrayType(child_type->type_ref, array_size) : nullptr; |
| 510 | 511 | |
| 511 | | entry->di_type = ZigLLVMCreateDebugArrayType(g->dbuilder, debug_size_in_bits, |
| 512 | | debug_align_in_bits, child_type->di_type, array_size); |
| 513 | | } |
| 514 | | entry->data.array.child_type = child_type; |
| 515 | | entry->data.array.len = array_size; |
| 512 | uint64_t debug_size_in_bits = 8*LLVMStoreSizeOfType(g->target_data_ref, entry->type_ref); |
| 513 | uint64_t debug_align_in_bits = 8*LLVMABISizeOfType(g->target_data_ref, entry->type_ref); |
| 516 | 514 | |
| 517 | | child_type->arrays_by_size.put(array_size, entry); |
| 518 | | return entry; |
| 515 | entry->di_type = ZigLLVMCreateDebugArrayType(g->dbuilder, debug_size_in_bits, |
| 516 | debug_align_in_bits, child_type->di_type, array_size); |
| 519 | 517 | } |
| 518 | entry->data.array.child_type = child_type; |
| 519 | entry->data.array.len = array_size; |
| 520 | |
| 521 | g->type_table.put(type_id, entry); |
| 522 | return entry; |
| 520 | 523 | } |
| 521 | 524 | |
| 522 | 525 | static void slice_type_common_init(CodeGen *g, TypeTableEntry *child_type, |
| ... | ... | @@ -2822,14 +2825,19 @@ TypeTableEntry *get_int_type(CodeGen *g, bool is_signed, uint8_t size_in_bits) { |
| 2822 | 2825 | if (common_entry) |
| 2823 | 2826 | return *common_entry; |
| 2824 | 2827 | |
| 2828 | TypeId type_id; |
| 2829 | type_id.id = TypeTableEntryIdInt; |
| 2830 | type_id.data.integer.is_signed = is_signed; |
| 2831 | type_id.data.integer.bit_count = size_in_bits; |
| 2832 | |
| 2825 | 2833 | { |
| 2826 | | auto entry = g->int_type_table.maybe_get({is_signed, size_in_bits}); |
| 2834 | auto entry = g->type_table.maybe_get(type_id); |
| 2827 | 2835 | if (entry) |
| 2828 | 2836 | return entry->value; |
| 2829 | 2837 | } |
| 2830 | 2838 | |
| 2831 | 2839 | TypeTableEntry *new_entry = make_int_type(g, is_signed, size_in_bits); |
| 2832 | | g->int_type_table.put({is_signed, size_in_bits}, new_entry); |
| 2840 | g->type_table.put(type_id, new_entry); |
| 2833 | 2841 | return new_entry; |
| 2834 | 2842 | } |
| 2835 | 2843 | |
| ... | ... | @@ -3877,12 +3885,88 @@ TypeTableEntry *make_int_type(CodeGen *g, bool is_signed, size_t size_in_bits) { |
| 3877 | 3885 | return entry; |
| 3878 | 3886 | } |
| 3879 | 3887 | |
| 3880 | | uint32_t int_type_id_hash(IntTypeId x) { |
| 3881 | | uint32_t hash = x.is_signed ? 2652528194 : 163929201; |
| 3882 | | hash += ((uint32_t)x.bit_count) * 2998081557; |
| 3883 | | return hash; |
| 3888 | uint32_t type_id_hash(TypeId x) { |
| 3889 | switch (x.id) { |
| 3890 | case TypeTableEntryIdInvalid: |
| 3891 | case TypeTableEntryIdVar: |
| 3892 | case TypeTableEntryIdMetaType: |
| 3893 | case TypeTableEntryIdVoid: |
| 3894 | case TypeTableEntryIdBool: |
| 3895 | case TypeTableEntryIdUnreachable: |
| 3896 | case TypeTableEntryIdFloat: |
| 3897 | case TypeTableEntryIdStruct: |
| 3898 | case TypeTableEntryIdNumLitFloat: |
| 3899 | case TypeTableEntryIdNumLitInt: |
| 3900 | case TypeTableEntryIdUndefLit: |
| 3901 | case TypeTableEntryIdNullLit: |
| 3902 | case TypeTableEntryIdMaybe: |
| 3903 | case TypeTableEntryIdErrorUnion: |
| 3904 | case TypeTableEntryIdPureError: |
| 3905 | case TypeTableEntryIdEnum: |
| 3906 | case TypeTableEntryIdEnumTag: |
| 3907 | case TypeTableEntryIdUnion: |
| 3908 | case TypeTableEntryIdFn: |
| 3909 | case TypeTableEntryIdTypeDecl: |
| 3910 | case TypeTableEntryIdNamespace: |
| 3911 | case TypeTableEntryIdBlock: |
| 3912 | case TypeTableEntryIdBoundFn: |
| 3913 | case TypeTableEntryIdArgTuple: |
| 3914 | zig_unreachable(); |
| 3915 | case TypeTableEntryIdPointer: |
| 3916 | return hash_ptr(x.data.pointer.child_type) + |
| 3917 | (x.data.pointer.is_const ? 2749109194 : 4047371087) + |
| 3918 | (x.data.pointer.is_volatile ? 536730450 : 1685612214) + |
| 3919 | (((uint32_t)x.data.pointer.bit_offset) * 2639019452); |
| 3920 | case TypeTableEntryIdArray: |
| 3921 | return hash_ptr(x.data.array.child_type) + |
| 3922 | (x.data.array.size * 2122979968); |
| 3923 | case TypeTableEntryIdInt: |
| 3924 | return (x.data.integer.is_signed ? 2652528194 : 163929201) + |
| 3925 | (((uint32_t)x.data.integer.bit_count) * 2998081557); |
| 3926 | } |
| 3927 | zig_unreachable(); |
| 3884 | 3928 | } |
| 3885 | 3929 | |
| 3886 | | bool int_type_id_eql(IntTypeId a, IntTypeId b) { |
| 3887 | | return (a.is_signed == b.is_signed && a.bit_count == b.bit_count); |
| 3930 | bool type_id_eql(TypeId a, TypeId b) { |
| 3931 | if (a.id != b.id) |
| 3932 | return false; |
| 3933 | switch (a.id) { |
| 3934 | case TypeTableEntryIdInvalid: |
| 3935 | case TypeTableEntryIdVar: |
| 3936 | case TypeTableEntryIdMetaType: |
| 3937 | case TypeTableEntryIdVoid: |
| 3938 | case TypeTableEntryIdBool: |
| 3939 | case TypeTableEntryIdUnreachable: |
| 3940 | case TypeTableEntryIdFloat: |
| 3941 | case TypeTableEntryIdStruct: |
| 3942 | case TypeTableEntryIdNumLitFloat: |
| 3943 | case TypeTableEntryIdNumLitInt: |
| 3944 | case TypeTableEntryIdUndefLit: |
| 3945 | case TypeTableEntryIdNullLit: |
| 3946 | case TypeTableEntryIdMaybe: |
| 3947 | case TypeTableEntryIdErrorUnion: |
| 3948 | case TypeTableEntryIdPureError: |
| 3949 | case TypeTableEntryIdEnum: |
| 3950 | case TypeTableEntryIdEnumTag: |
| 3951 | case TypeTableEntryIdUnion: |
| 3952 | case TypeTableEntryIdFn: |
| 3953 | case TypeTableEntryIdTypeDecl: |
| 3954 | case TypeTableEntryIdNamespace: |
| 3955 | case TypeTableEntryIdBlock: |
| 3956 | case TypeTableEntryIdBoundFn: |
| 3957 | case TypeTableEntryIdArgTuple: |
| 3958 | zig_unreachable(); |
| 3959 | case TypeTableEntryIdPointer: |
| 3960 | return a.data.pointer.child_type == b.data.pointer.child_type && |
| 3961 | a.data.pointer.is_const == b.data.pointer.is_const && |
| 3962 | a.data.pointer.is_volatile == b.data.pointer.is_volatile && |
| 3963 | a.data.pointer.bit_offset == b.data.pointer.bit_offset; |
| 3964 | case TypeTableEntryIdArray: |
| 3965 | return a.data.array.child_type == b.data.array.child_type && |
| 3966 | a.data.array.size == b.data.array.size; |
| 3967 | case TypeTableEntryIdInt: |
| 3968 | return a.data.integer.is_signed == b.data.integer.is_signed && |
| 3969 | a.data.integer.bit_count == b.data.integer.bit_count; |
| 3970 | } |
| 3971 | zig_unreachable(); |
| 3888 | 3972 | } |