| ... | ... | @@ -2937,24 +2937,24 @@ pub const Type = extern union { |
| 2937 | 2937 | .anyframe_T, |
| 2938 | 2938 | => return AbiAlignmentAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, |
| 2939 | 2939 | |
| 2940 | | .c_short => return AbiAlignmentAdvanced{ .scalar = CType.short.alignment(target) }, |
| 2941 | | .c_ushort => return AbiAlignmentAdvanced{ .scalar = CType.ushort.alignment(target) }, |
| 2942 | | .c_int => return AbiAlignmentAdvanced{ .scalar = CType.int.alignment(target) }, |
| 2943 | | .c_uint => return AbiAlignmentAdvanced{ .scalar = CType.uint.alignment(target) }, |
| 2944 | | .c_long => return AbiAlignmentAdvanced{ .scalar = CType.long.alignment(target) }, |
| 2945 | | .c_ulong => return AbiAlignmentAdvanced{ .scalar = CType.ulong.alignment(target) }, |
| 2946 | | .c_longlong => return AbiAlignmentAdvanced{ .scalar = CType.longlong.alignment(target) }, |
| 2947 | | .c_ulonglong => return AbiAlignmentAdvanced{ .scalar = CType.ulonglong.alignment(target) }, |
| 2948 | | .c_longdouble => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, |
| 2940 | .c_short => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.short) }, |
| 2941 | .c_ushort => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ushort) }, |
| 2942 | .c_int => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.int) }, |
| 2943 | .c_uint => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.uint) }, |
| 2944 | .c_long => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.long) }, |
| 2945 | .c_ulong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ulong) }, |
| 2946 | .c_longlong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longlong) }, |
| 2947 | .c_ulonglong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ulonglong) }, |
| 2948 | .c_longdouble => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2949 | 2949 | |
| 2950 | 2950 | .f16 => return AbiAlignmentAdvanced{ .scalar = 2 }, |
| 2951 | | .f32 => return AbiAlignmentAdvanced{ .scalar = CType.float.alignment(target) }, |
| 2952 | | .f64 => switch (CType.double.sizeInBits(target)) { |
| 2953 | | 64 => return AbiAlignmentAdvanced{ .scalar = CType.double.alignment(target) }, |
| 2951 | .f32 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.float) }, |
| 2952 | .f64 => switch (target.c_type_bit_size(.double)) { |
| 2953 | 64 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.double) }, |
| 2954 | 2954 | else => return AbiAlignmentAdvanced{ .scalar = 8 }, |
| 2955 | 2955 | }, |
| 2956 | | .f80 => switch (CType.longdouble.sizeInBits(target)) { |
| 2957 | | 80 => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, |
| 2956 | .f80 => switch (target.c_type_bit_size(.longdouble)) { |
| 2957 | 80 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2958 | 2958 | else => { |
| 2959 | 2959 | var payload: Payload.Bits = .{ |
| 2960 | 2960 | .base = .{ .tag = .int_unsigned }, |
| ... | ... | @@ -2964,8 +2964,8 @@ pub const Type = extern union { |
| 2964 | 2964 | return AbiAlignmentAdvanced{ .scalar = abiAlignment(u80_ty, target) }; |
| 2965 | 2965 | }, |
| 2966 | 2966 | }, |
| 2967 | | .f128 => switch (CType.longdouble.sizeInBits(target)) { |
| 2968 | | 128 => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, |
| 2967 | .f128 => switch (target.c_type_bit_size(.longdouble)) { |
| 2968 | 128 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2969 | 2969 | else => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2970 | 2970 | }, |
| 2971 | 2971 | |
| ... | ... | @@ -3434,21 +3434,22 @@ pub const Type = extern union { |
| 3434 | 3434 | else => return AbiSizeAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, |
| 3435 | 3435 | }, |
| 3436 | 3436 | |
| 3437 | | .c_short => return AbiSizeAdvanced{ .scalar = @divExact(CType.short.sizeInBits(target), 8) }, |
| 3438 | | .c_ushort => return AbiSizeAdvanced{ .scalar = @divExact(CType.ushort.sizeInBits(target), 8) }, |
| 3439 | | .c_int => return AbiSizeAdvanced{ .scalar = @divExact(CType.int.sizeInBits(target), 8) }, |
| 3440 | | .c_uint => return AbiSizeAdvanced{ .scalar = @divExact(CType.uint.sizeInBits(target), 8) }, |
| 3441 | | .c_long => return AbiSizeAdvanced{ .scalar = @divExact(CType.long.sizeInBits(target), 8) }, |
| 3442 | | .c_ulong => return AbiSizeAdvanced{ .scalar = @divExact(CType.ulong.sizeInBits(target), 8) }, |
| 3443 | | .c_longlong => return AbiSizeAdvanced{ .scalar = @divExact(CType.longlong.sizeInBits(target), 8) }, |
| 3444 | | .c_ulonglong => return AbiSizeAdvanced{ .scalar = @divExact(CType.ulonglong.sizeInBits(target), 8) }, |
| 3437 | .c_short => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.short) }, |
| 3438 | .c_ushort => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.ushort) }, |
| 3439 | .c_int => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.int) }, |
| 3440 | .c_uint => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.uint) }, |
| 3441 | .c_long => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.long) }, |
| 3442 | .c_ulong => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.ulong) }, |
| 3443 | .c_longlong => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.longlong) }, |
| 3444 | .c_ulonglong => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.ulonglong) }, |
| 3445 | .c_longdouble => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.longdouble) }, |
| 3445 | 3446 | |
| 3446 | 3447 | .f16 => return AbiSizeAdvanced{ .scalar = 2 }, |
| 3447 | 3448 | .f32 => return AbiSizeAdvanced{ .scalar = 4 }, |
| 3448 | 3449 | .f64 => return AbiSizeAdvanced{ .scalar = 8 }, |
| 3449 | 3450 | .f128 => return AbiSizeAdvanced{ .scalar = 16 }, |
| 3450 | | .f80 => switch (CType.longdouble.sizeInBits(target)) { |
| 3451 | | 80 => return AbiSizeAdvanced{ .scalar = std.mem.alignForward(10, CType.longdouble.alignment(target)) }, |
| 3451 | .f80 => switch (target.c_type_bit_size(.longdouble)) { |
| 3452 | 80 => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.longdouble) }, |
| 3452 | 3453 | else => { |
| 3453 | 3454 | var payload: Payload.Bits = .{ |
| 3454 | 3455 | .base = .{ .tag = .int_unsigned }, |
| ... | ... | @@ -3458,14 +3459,6 @@ pub const Type = extern union { |
| 3458 | 3459 | return AbiSizeAdvanced{ .scalar = abiSize(u80_ty, target) }; |
| 3459 | 3460 | }, |
| 3460 | 3461 | }, |
| 3461 | | .c_longdouble => switch (CType.longdouble.sizeInBits(target)) { |
| 3462 | | 16 => return AbiSizeAdvanced{ .scalar = abiSize(Type.f16, target) }, |
| 3463 | | 32 => return AbiSizeAdvanced{ .scalar = abiSize(Type.f32, target) }, |
| 3464 | | 64 => return AbiSizeAdvanced{ .scalar = abiSize(Type.f64, target) }, |
| 3465 | | 80 => return AbiSizeAdvanced{ .scalar = abiSize(Type.f80, target) }, |
| 3466 | | 128 => return AbiSizeAdvanced{ .scalar = abiSize(Type.f128, target) }, |
| 3467 | | else => unreachable, |
| 3468 | | }, |
| 3469 | 3462 | |
| 3470 | 3463 | // TODO revisit this when we have the concept of the error tag type |
| 3471 | 3464 | .anyerror_void_error_union, |
| ... | ... | @@ -3748,15 +3741,15 @@ pub const Type = extern union { |
| 3748 | 3741 | .manyptr_const_u8_sentinel_0, |
| 3749 | 3742 | => return target.cpu.arch.ptrBitWidth(), |
| 3750 | 3743 | |
| 3751 | | .c_short => return CType.short.sizeInBits(target), |
| 3752 | | .c_ushort => return CType.ushort.sizeInBits(target), |
| 3753 | | .c_int => return CType.int.sizeInBits(target), |
| 3754 | | .c_uint => return CType.uint.sizeInBits(target), |
| 3755 | | .c_long => return CType.long.sizeInBits(target), |
| 3756 | | .c_ulong => return CType.ulong.sizeInBits(target), |
| 3757 | | .c_longlong => return CType.longlong.sizeInBits(target), |
| 3758 | | .c_ulonglong => return CType.ulonglong.sizeInBits(target), |
| 3759 | | .c_longdouble => return CType.longdouble.sizeInBits(target), |
| 3744 | .c_short => return target.c_type_bit_size(.short), |
| 3745 | .c_ushort => return target.c_type_bit_size(.ushort), |
| 3746 | .c_int => return target.c_type_bit_size(.int), |
| 3747 | .c_uint => return target.c_type_bit_size(.uint), |
| 3748 | .c_long => return target.c_type_bit_size(.long), |
| 3749 | .c_ulong => return target.c_type_bit_size(.ulong), |
| 3750 | .c_longlong => return target.c_type_bit_size(.longlong), |
| 3751 | .c_ulonglong => return target.c_type_bit_size(.ulonglong), |
| 3752 | .c_longdouble => return target.c_type_bit_size(.longdouble), |
| 3760 | 3753 | |
| 3761 | 3754 | .error_set, |
| 3762 | 3755 | .error_set_single, |
| ... | ... | @@ -4631,14 +4624,14 @@ pub const Type = extern union { |
| 4631 | 4624 | .i128 => return .{ .signedness = .signed, .bits = 128 }, |
| 4632 | 4625 | .usize => return .{ .signedness = .unsigned, .bits = target.cpu.arch.ptrBitWidth() }, |
| 4633 | 4626 | .isize => return .{ .signedness = .signed, .bits = target.cpu.arch.ptrBitWidth() }, |
| 4634 | | .c_short => return .{ .signedness = .signed, .bits = CType.short.sizeInBits(target) }, |
| 4635 | | .c_ushort => return .{ .signedness = .unsigned, .bits = CType.ushort.sizeInBits(target) }, |
| 4636 | | .c_int => return .{ .signedness = .signed, .bits = CType.int.sizeInBits(target) }, |
| 4637 | | .c_uint => return .{ .signedness = .unsigned, .bits = CType.uint.sizeInBits(target) }, |
| 4638 | | .c_long => return .{ .signedness = .signed, .bits = CType.long.sizeInBits(target) }, |
| 4639 | | .c_ulong => return .{ .signedness = .unsigned, .bits = CType.ulong.sizeInBits(target) }, |
| 4640 | | .c_longlong => return .{ .signedness = .signed, .bits = CType.longlong.sizeInBits(target) }, |
| 4641 | | .c_ulonglong => return .{ .signedness = .unsigned, .bits = CType.ulonglong.sizeInBits(target) }, |
| 4627 | .c_short => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.short) }, |
| 4628 | .c_ushort => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ushort) }, |
| 4629 | .c_int => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.int) }, |
| 4630 | .c_uint => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.uint) }, |
| 4631 | .c_long => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.long) }, |
| 4632 | .c_ulong => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ulong) }, |
| 4633 | .c_longlong => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.longlong) }, |
| 4634 | .c_ulonglong => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ulonglong) }, |
| 4642 | 4635 | |
| 4643 | 4636 | .enum_full, .enum_nonexhaustive => ty = ty.cast(Payload.EnumFull).?.data.tag_ty, |
| 4644 | 4637 | .enum_numbered => ty = ty.castTag(.enum_numbered).?.data.tag_ty, |
| ... | ... | @@ -4724,7 +4717,7 @@ pub const Type = extern union { |
| 4724 | 4717 | .f64 => 64, |
| 4725 | 4718 | .f80 => 80, |
| 4726 | 4719 | .f128, .comptime_float => 128, |
| 4727 | | .c_longdouble => CType.longdouble.sizeInBits(target), |
| 4720 | .c_longdouble => target.c_type_bit_size(.longdouble), |
| 4728 | 4721 | |
| 4729 | 4722 | else => unreachable, |
| 4730 | 4723 | }; |
| ... | ... | @@ -6689,536 +6682,3 @@ pub const Type = extern union { |
| 6689 | 6682 | /// to packed struct layout to find out all the places in the codebase you need to edit! |
| 6690 | 6683 | pub const packed_struct_layout_version = 2; |
| 6691 | 6684 | }; |
| 6692 | | |
| 6693 | | pub const CType = enum { |
| 6694 | | short, |
| 6695 | | ushort, |
| 6696 | | int, |
| 6697 | | uint, |
| 6698 | | long, |
| 6699 | | ulong, |
| 6700 | | longlong, |
| 6701 | | ulonglong, |
| 6702 | | longdouble, |
| 6703 | | |
| 6704 | | // We don't have a `c_float`/`c_double` type in Zig, but these |
| 6705 | | // are useful for querying target-correct alignment and checking |
| 6706 | | // whether C's double is f64 or f32 |
| 6707 | | float, |
| 6708 | | double, |
| 6709 | | |
| 6710 | | pub fn sizeInBits(self: CType, target: Target) u16 { |
| 6711 | | switch (target.os.tag) { |
| 6712 | | .freestanding, .other => switch (target.cpu.arch) { |
| 6713 | | .msp430 => switch (self) { |
| 6714 | | .short, .ushort, .int, .uint => return 16, |
| 6715 | | .float, .long, .ulong => return 32, |
| 6716 | | .longlong, .ulonglong, .double, .longdouble => return 64, |
| 6717 | | }, |
| 6718 | | .avr => switch (self) { |
| 6719 | | .short, .ushort, .int, .uint => return 16, |
| 6720 | | .long, .ulong, .float, .double, .longdouble => return 32, |
| 6721 | | .longlong, .ulonglong => return 64, |
| 6722 | | }, |
| 6723 | | .tce, .tcele => switch (self) { |
| 6724 | | .short, .ushort => return 16, |
| 6725 | | .int, .uint, .long, .ulong, .longlong, .ulonglong => return 32, |
| 6726 | | .float, .double, .longdouble => return 32, |
| 6727 | | }, |
| 6728 | | .mips64, .mips64el => switch (self) { |
| 6729 | | .short, .ushort => return 16, |
| 6730 | | .int, .uint, .float => return 32, |
| 6731 | | .long, .ulong => return if (target.abi != .gnuabin32) 64 else 32, |
| 6732 | | .longlong, .ulonglong, .double => return 64, |
| 6733 | | .longdouble => return 128, |
| 6734 | | }, |
| 6735 | | .x86_64 => switch (self) { |
| 6736 | | .short, .ushort => return 16, |
| 6737 | | .int, .uint, .float => return 32, |
| 6738 | | .long, .ulong => switch (target.abi) { |
| 6739 | | .gnux32, .muslx32 => return 32, |
| 6740 | | else => return 64, |
| 6741 | | }, |
| 6742 | | .longlong, .ulonglong, .double => return 64, |
| 6743 | | .longdouble => return 80, |
| 6744 | | }, |
| 6745 | | else => switch (self) { |
| 6746 | | .short, .ushort => return 16, |
| 6747 | | .int, .uint, .float => return 32, |
| 6748 | | .long, .ulong => return target.cpu.arch.ptrBitWidth(), |
| 6749 | | .longlong, .ulonglong, .double => return 64, |
| 6750 | | .longdouble => switch (target.cpu.arch) { |
| 6751 | | .x86 => switch (target.abi) { |
| 6752 | | .android => return 64, |
| 6753 | | else => return 80, |
| 6754 | | }, |
| 6755 | | |
| 6756 | | .powerpc, |
| 6757 | | .powerpcle, |
| 6758 | | .powerpc64, |
| 6759 | | .powerpc64le, |
| 6760 | | => switch (target.abi) { |
| 6761 | | .musl, |
| 6762 | | .musleabi, |
| 6763 | | .musleabihf, |
| 6764 | | .muslx32, |
| 6765 | | => return 64, |
| 6766 | | else => return 128, |
| 6767 | | }, |
| 6768 | | |
| 6769 | | .riscv32, |
| 6770 | | .riscv64, |
| 6771 | | .aarch64, |
| 6772 | | .aarch64_be, |
| 6773 | | .aarch64_32, |
| 6774 | | .s390x, |
| 6775 | | .sparc, |
| 6776 | | .sparc64, |
| 6777 | | .sparcel, |
| 6778 | | .wasm32, |
| 6779 | | .wasm64, |
| 6780 | | => return 128, |
| 6781 | | |
| 6782 | | else => return 64, |
| 6783 | | }, |
| 6784 | | }, |
| 6785 | | }, |
| 6786 | | |
| 6787 | | .linux, |
| 6788 | | .freebsd, |
| 6789 | | .netbsd, |
| 6790 | | .dragonfly, |
| 6791 | | .openbsd, |
| 6792 | | .wasi, |
| 6793 | | .emscripten, |
| 6794 | | .plan9, |
| 6795 | | .solaris, |
| 6796 | | .haiku, |
| 6797 | | .ananas, |
| 6798 | | .fuchsia, |
| 6799 | | .minix, |
| 6800 | | => switch (target.cpu.arch) { |
| 6801 | | .msp430 => switch (self) { |
| 6802 | | .short, .ushort, .int, .uint => return 16, |
| 6803 | | .long, .ulong, .float => return 32, |
| 6804 | | .longlong, .ulonglong, .double, .longdouble => return 64, |
| 6805 | | }, |
| 6806 | | .avr => switch (self) { |
| 6807 | | .short, .ushort, .int, .uint => return 16, |
| 6808 | | .long, .ulong, .float, .double, .longdouble => return 32, |
| 6809 | | .longlong, .ulonglong => return 64, |
| 6810 | | }, |
| 6811 | | .tce, .tcele => switch (self) { |
| 6812 | | .short, .ushort => return 16, |
| 6813 | | .int, .uint, .long, .ulong, .longlong, .ulonglong => return 32, |
| 6814 | | .float, .double, .longdouble => return 32, |
| 6815 | | }, |
| 6816 | | .mips64, .mips64el => switch (self) { |
| 6817 | | .short, .ushort => return 16, |
| 6818 | | .int, .uint, .float => return 32, |
| 6819 | | .long, .ulong => return if (target.abi != .gnuabin32) 64 else 32, |
| 6820 | | .longlong, .ulonglong, .double => return 64, |
| 6821 | | .longdouble => if (target.os.tag == .freebsd) return 64 else return 128, |
| 6822 | | }, |
| 6823 | | .x86_64 => switch (self) { |
| 6824 | | .short, .ushort => return 16, |
| 6825 | | .int, .uint, .float => return 32, |
| 6826 | | .long, .ulong => switch (target.abi) { |
| 6827 | | .gnux32, .muslx32 => return 32, |
| 6828 | | else => return 64, |
| 6829 | | }, |
| 6830 | | .longlong, .ulonglong, .double => return 64, |
| 6831 | | .longdouble => return 80, |
| 6832 | | }, |
| 6833 | | else => switch (self) { |
| 6834 | | .short, .ushort => return 16, |
| 6835 | | .int, .uint, .float => return 32, |
| 6836 | | .long, .ulong => return target.cpu.arch.ptrBitWidth(), |
| 6837 | | .longlong, .ulonglong, .double => return 64, |
| 6838 | | .longdouble => switch (target.cpu.arch) { |
| 6839 | | .x86 => switch (target.abi) { |
| 6840 | | .android => return 64, |
| 6841 | | else => return 80, |
| 6842 | | }, |
| 6843 | | |
| 6844 | | .powerpc, |
| 6845 | | .powerpcle, |
| 6846 | | => switch (target.abi) { |
| 6847 | | .musl, |
| 6848 | | .musleabi, |
| 6849 | | .musleabihf, |
| 6850 | | .muslx32, |
| 6851 | | => return 64, |
| 6852 | | else => switch (target.os.tag) { |
| 6853 | | .freebsd, .netbsd, .openbsd => return 64, |
| 6854 | | else => return 128, |
| 6855 | | }, |
| 6856 | | }, |
| 6857 | | |
| 6858 | | .powerpc64, |
| 6859 | | .powerpc64le, |
| 6860 | | => switch (target.abi) { |
| 6861 | | .musl, |
| 6862 | | .musleabi, |
| 6863 | | .musleabihf, |
| 6864 | | .muslx32, |
| 6865 | | => return 64, |
| 6866 | | else => switch (target.os.tag) { |
| 6867 | | .freebsd, .openbsd => return 64, |
| 6868 | | else => return 128, |
| 6869 | | }, |
| 6870 | | }, |
| 6871 | | |
| 6872 | | .riscv32, |
| 6873 | | .riscv64, |
| 6874 | | .aarch64, |
| 6875 | | .aarch64_be, |
| 6876 | | .aarch64_32, |
| 6877 | | .s390x, |
| 6878 | | .mips64, |
| 6879 | | .mips64el, |
| 6880 | | .sparc, |
| 6881 | | .sparc64, |
| 6882 | | .sparcel, |
| 6883 | | .wasm32, |
| 6884 | | .wasm64, |
| 6885 | | => return 128, |
| 6886 | | |
| 6887 | | else => return 64, |
| 6888 | | }, |
| 6889 | | }, |
| 6890 | | }, |
| 6891 | | |
| 6892 | | .windows, .uefi => switch (target.cpu.arch) { |
| 6893 | | .x86 => switch (self) { |
| 6894 | | .short, .ushort => return 16, |
| 6895 | | .int, .uint, .float => return 32, |
| 6896 | | .long, .ulong => return 32, |
| 6897 | | .longlong, .ulonglong, .double => return 64, |
| 6898 | | .longdouble => switch (target.abi) { |
| 6899 | | .gnu, .gnuilp32, .cygnus => return 80, |
| 6900 | | else => return 64, |
| 6901 | | }, |
| 6902 | | }, |
| 6903 | | .x86_64 => switch (self) { |
| 6904 | | .short, .ushort => return 16, |
| 6905 | | .int, .uint, .float => return 32, |
| 6906 | | .long, .ulong => switch (target.abi) { |
| 6907 | | .cygnus => return 64, |
| 6908 | | else => return 32, |
| 6909 | | }, |
| 6910 | | .longlong, .ulonglong, .double => return 64, |
| 6911 | | .longdouble => switch (target.abi) { |
| 6912 | | .gnu, .gnuilp32, .cygnus => return 80, |
| 6913 | | else => return 64, |
| 6914 | | }, |
| 6915 | | }, |
| 6916 | | else => switch (self) { |
| 6917 | | .short, .ushort => return 16, |
| 6918 | | .int, .uint, .float => return 32, |
| 6919 | | .long, .ulong => return 32, |
| 6920 | | .longlong, .ulonglong, .double => return 64, |
| 6921 | | .longdouble => return 64, |
| 6922 | | }, |
| 6923 | | }, |
| 6924 | | |
| 6925 | | .macos, .ios, .tvos, .watchos => switch (self) { |
| 6926 | | .short, .ushort => return 16, |
| 6927 | | .int, .uint, .float => return 32, |
| 6928 | | .long, .ulong => switch (target.cpu.arch) { |
| 6929 | | .x86, .arm, .aarch64_32 => return 32, |
| 6930 | | .x86_64 => switch (target.abi) { |
| 6931 | | .gnux32, .muslx32 => return 32, |
| 6932 | | else => return 64, |
| 6933 | | }, |
| 6934 | | else => return 64, |
| 6935 | | }, |
| 6936 | | .longlong, .ulonglong, .double => return 64, |
| 6937 | | .longdouble => switch (target.cpu.arch) { |
| 6938 | | .x86 => switch (target.abi) { |
| 6939 | | .android => return 64, |
| 6940 | | else => return 80, |
| 6941 | | }, |
| 6942 | | .x86_64 => return 80, |
| 6943 | | else => return 64, |
| 6944 | | }, |
| 6945 | | }, |
| 6946 | | |
| 6947 | | .nvcl, .cuda => switch (self) { |
| 6948 | | .short, .ushort => return 16, |
| 6949 | | .int, .uint, .float => return 32, |
| 6950 | | .long, .ulong => switch (target.cpu.arch) { |
| 6951 | | .nvptx => return 32, |
| 6952 | | .nvptx64 => return 64, |
| 6953 | | else => return 64, |
| 6954 | | }, |
| 6955 | | .longlong, .ulonglong, .double => return 64, |
| 6956 | | .longdouble => return 64, |
| 6957 | | }, |
| 6958 | | |
| 6959 | | .amdhsa, .amdpal => switch (self) { |
| 6960 | | .short, .ushort => return 16, |
| 6961 | | .int, .uint, .float => return 32, |
| 6962 | | .long, .ulong, .longlong, .ulonglong, .double => return 64, |
| 6963 | | .longdouble => return 128, |
| 6964 | | }, |
| 6965 | | |
| 6966 | | .cloudabi, |
| 6967 | | .kfreebsd, |
| 6968 | | .lv2, |
| 6969 | | .zos, |
| 6970 | | .rtems, |
| 6971 | | .nacl, |
| 6972 | | .aix, |
| 6973 | | .ps4, |
| 6974 | | .ps5, |
| 6975 | | .elfiamcu, |
| 6976 | | .mesa3d, |
| 6977 | | .contiki, |
| 6978 | | .hermit, |
| 6979 | | .hurd, |
| 6980 | | .opencl, |
| 6981 | | .glsl450, |
| 6982 | | .vulkan, |
| 6983 | | .driverkit, |
| 6984 | | .shadermodel, |
| 6985 | | => @panic("TODO specify the C integer and float type sizes for this OS"), |
| 6986 | | } |
| 6987 | | } |
| 6988 | | |
| 6989 | | pub fn alignment(self: CType, target: Target) u16 { |
| 6990 | | |
| 6991 | | // Overrides for unusual alignments |
| 6992 | | switch (target.cpu.arch) { |
| 6993 | | .avr => switch (self) { |
| 6994 | | .short, .ushort => return 2, |
| 6995 | | else => return 1, |
| 6996 | | }, |
| 6997 | | .x86 => switch (target.os.tag) { |
| 6998 | | .windows, .uefi => switch (self) { |
| 6999 | | .longlong, .ulonglong, .double => return 8, |
| 7000 | | .longdouble => switch (target.abi) { |
| 7001 | | .gnu, .gnuilp32, .cygnus => return 4, |
| 7002 | | else => return 8, |
| 7003 | | }, |
| 7004 | | else => {}, |
| 7005 | | }, |
| 7006 | | else => {}, |
| 7007 | | }, |
| 7008 | | else => {}, |
| 7009 | | } |
| 7010 | | |
| 7011 | | // Next-power-of-two-aligned, up to a maximum. |
| 7012 | | return @min( |
| 7013 | | std.math.ceilPowerOfTwoAssert(u16, (self.sizeInBits(target) + 7) / 8), |
| 7014 | | switch (target.cpu.arch) { |
| 7015 | | .arm, .armeb, .thumb, .thumbeb => switch (target.os.tag) { |
| 7016 | | .netbsd => switch (target.abi) { |
| 7017 | | .gnueabi, |
| 7018 | | .gnueabihf, |
| 7019 | | .eabi, |
| 7020 | | .eabihf, |
| 7021 | | .android, |
| 7022 | | .musleabi, |
| 7023 | | .musleabihf, |
| 7024 | | => 8, |
| 7025 | | |
| 7026 | | else => @as(u16, 4), |
| 7027 | | }, |
| 7028 | | .ios, .tvos, .watchos => 4, |
| 7029 | | else => 8, |
| 7030 | | }, |
| 7031 | | |
| 7032 | | .msp430, |
| 7033 | | .avr, |
| 7034 | | => 2, |
| 7035 | | |
| 7036 | | .arc, |
| 7037 | | .csky, |
| 7038 | | .x86, |
| 7039 | | .xcore, |
| 7040 | | .dxil, |
| 7041 | | .loongarch32, |
| 7042 | | .tce, |
| 7043 | | .tcele, |
| 7044 | | .le32, |
| 7045 | | .amdil, |
| 7046 | | .hsail, |
| 7047 | | .spir, |
| 7048 | | .spirv32, |
| 7049 | | .kalimba, |
| 7050 | | .shave, |
| 7051 | | .renderscript32, |
| 7052 | | .ve, |
| 7053 | | .spu_2, |
| 7054 | | => 4, |
| 7055 | | |
| 7056 | | .aarch64_32, |
| 7057 | | .amdgcn, |
| 7058 | | .amdil64, |
| 7059 | | .bpfel, |
| 7060 | | .bpfeb, |
| 7061 | | .hexagon, |
| 7062 | | .hsail64, |
| 7063 | | .loongarch64, |
| 7064 | | .m68k, |
| 7065 | | .mips, |
| 7066 | | .mipsel, |
| 7067 | | .sparc, |
| 7068 | | .sparcel, |
| 7069 | | .sparc64, |
| 7070 | | .lanai, |
| 7071 | | .le64, |
| 7072 | | .nvptx, |
| 7073 | | .nvptx64, |
| 7074 | | .r600, |
| 7075 | | .s390x, |
| 7076 | | .spir64, |
| 7077 | | .spirv64, |
| 7078 | | .renderscript64, |
| 7079 | | => 8, |
| 7080 | | |
| 7081 | | .aarch64, |
| 7082 | | .aarch64_be, |
| 7083 | | .mips64, |
| 7084 | | .mips64el, |
| 7085 | | .powerpc, |
| 7086 | | .powerpcle, |
| 7087 | | .powerpc64, |
| 7088 | | .powerpc64le, |
| 7089 | | .riscv32, |
| 7090 | | .riscv64, |
| 7091 | | .x86_64, |
| 7092 | | .wasm32, |
| 7093 | | .wasm64, |
| 7094 | | => 16, |
| 7095 | | }, |
| 7096 | | ); |
| 7097 | | } |
| 7098 | | |
| 7099 | | pub fn preferredAlignment(self: CType, target: Target) u16 { |
| 7100 | | |
| 7101 | | // Overrides for unusual alignments |
| 7102 | | switch (target.cpu.arch) { |
| 7103 | | .arm, .armeb, .thumb, .thumbeb => switch (target.os.tag) { |
| 7104 | | .netbsd => switch (target.abi) { |
| 7105 | | .gnueabi, |
| 7106 | | .gnueabihf, |
| 7107 | | .eabi, |
| 7108 | | .eabihf, |
| 7109 | | .android, |
| 7110 | | .musleabi, |
| 7111 | | .musleabihf, |
| 7112 | | => {}, |
| 7113 | | |
| 7114 | | else => switch (self) { |
| 7115 | | .longdouble => return 4, |
| 7116 | | else => {}, |
| 7117 | | }, |
| 7118 | | }, |
| 7119 | | .ios, .tvos, .watchos => switch (self) { |
| 7120 | | .longdouble => return 4, |
| 7121 | | else => {}, |
| 7122 | | }, |
| 7123 | | else => {}, |
| 7124 | | }, |
| 7125 | | .arc => switch (self) { |
| 7126 | | .longdouble => return 4, |
| 7127 | | else => {}, |
| 7128 | | }, |
| 7129 | | .avr => switch (self) { |
| 7130 | | .int, .uint, .long, .ulong, .float, .longdouble => return 1, |
| 7131 | | .short, .ushort => return 2, |
| 7132 | | .double => return 4, |
| 7133 | | .longlong, .ulonglong => return 8, |
| 7134 | | }, |
| 7135 | | .x86 => switch (target.os.tag) { |
| 7136 | | .windows, .uefi => switch (self) { |
| 7137 | | .longdouble => switch (target.abi) { |
| 7138 | | .gnu, .gnuilp32, .cygnus => return 4, |
| 7139 | | else => return 8, |
| 7140 | | }, |
| 7141 | | else => {}, |
| 7142 | | }, |
| 7143 | | else => switch (self) { |
| 7144 | | .longdouble => return 4, |
| 7145 | | else => {}, |
| 7146 | | }, |
| 7147 | | }, |
| 7148 | | else => {}, |
| 7149 | | } |
| 7150 | | |
| 7151 | | // Next-power-of-two-aligned, up to a maximum. |
| 7152 | | return @min( |
| 7153 | | std.math.ceilPowerOfTwoAssert(u16, (self.sizeInBits(target) + 7) / 8), |
| 7154 | | switch (target.cpu.arch) { |
| 7155 | | .msp430 => @as(u16, 2), |
| 7156 | | |
| 7157 | | .csky, |
| 7158 | | .xcore, |
| 7159 | | .dxil, |
| 7160 | | .loongarch32, |
| 7161 | | .tce, |
| 7162 | | .tcele, |
| 7163 | | .le32, |
| 7164 | | .amdil, |
| 7165 | | .hsail, |
| 7166 | | .spir, |
| 7167 | | .spirv32, |
| 7168 | | .kalimba, |
| 7169 | | .shave, |
| 7170 | | .renderscript32, |
| 7171 | | .ve, |
| 7172 | | .spu_2, |
| 7173 | | => 4, |
| 7174 | | |
| 7175 | | .arc, |
| 7176 | | .arm, |
| 7177 | | .armeb, |
| 7178 | | .avr, |
| 7179 | | .thumb, |
| 7180 | | .thumbeb, |
| 7181 | | .aarch64_32, |
| 7182 | | .amdgcn, |
| 7183 | | .amdil64, |
| 7184 | | .bpfel, |
| 7185 | | .bpfeb, |
| 7186 | | .hexagon, |
| 7187 | | .hsail64, |
| 7188 | | .x86, |
| 7189 | | .loongarch64, |
| 7190 | | .m68k, |
| 7191 | | .mips, |
| 7192 | | .mipsel, |
| 7193 | | .sparc, |
| 7194 | | .sparcel, |
| 7195 | | .sparc64, |
| 7196 | | .lanai, |
| 7197 | | .le64, |
| 7198 | | .nvptx, |
| 7199 | | .nvptx64, |
| 7200 | | .r600, |
| 7201 | | .s390x, |
| 7202 | | .spir64, |
| 7203 | | .spirv64, |
| 7204 | | .renderscript64, |
| 7205 | | => 8, |
| 7206 | | |
| 7207 | | .aarch64, |
| 7208 | | .aarch64_be, |
| 7209 | | .mips64, |
| 7210 | | .mips64el, |
| 7211 | | .powerpc, |
| 7212 | | .powerpcle, |
| 7213 | | .powerpc64, |
| 7214 | | .powerpc64le, |
| 7215 | | .riscv32, |
| 7216 | | .riscv64, |
| 7217 | | .x86_64, |
| 7218 | | .wasm32, |
| 7219 | | .wasm64, |
| 7220 | | => 16, |
| 7221 | | }, |
| 7222 | | ); |
| 7223 | | } |
| 7224 | | }; |