| ... | @@ -2937,24 +2937,24 @@ pub const Type = extern union { | ... | @@ -2937,24 +2937,24 @@ pub const Type = extern union { |
| 2937 | .anyframe_T, | 2937 | .anyframe_T, |
| 2938 | => return AbiAlignmentAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, | 2938 | => return AbiAlignmentAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, |
| 2939 | | 2939 | |
| 2940 | .c_short => return AbiAlignmentAdvanced{ .scalar = CType.short.alignment(target) }, | 2940 | .c_short => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.short) }, |
| 2941 | .c_ushort => return AbiAlignmentAdvanced{ .scalar = CType.ushort.alignment(target) }, | 2941 | .c_ushort => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ushort) }, |
| 2942 | .c_int => return AbiAlignmentAdvanced{ .scalar = CType.int.alignment(target) }, | 2942 | .c_int => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.int) }, |
| 2943 | .c_uint => return AbiAlignmentAdvanced{ .scalar = CType.uint.alignment(target) }, | 2943 | .c_uint => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.uint) }, |
| 2944 | .c_long => return AbiAlignmentAdvanced{ .scalar = CType.long.alignment(target) }, | 2944 | .c_long => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.long) }, |
| 2945 | .c_ulong => return AbiAlignmentAdvanced{ .scalar = CType.ulong.alignment(target) }, | 2945 | .c_ulong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ulong) }, |
| 2946 | .c_longlong => return AbiAlignmentAdvanced{ .scalar = CType.longlong.alignment(target) }, | 2946 | .c_longlong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longlong) }, |
| 2947 | .c_ulonglong => return AbiAlignmentAdvanced{ .scalar = CType.ulonglong.alignment(target) }, | 2947 | .c_ulonglong => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.ulonglong) }, |
| 2948 | .c_longdouble => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, | 2948 | .c_longdouble => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2949 | | 2949 | |
| 2950 | .f16 => return AbiAlignmentAdvanced{ .scalar = 2 }, | 2950 | .f16 => return AbiAlignmentAdvanced{ .scalar = 2 }, |
| 2951 | .f32 => return AbiAlignmentAdvanced{ .scalar = CType.float.alignment(target) }, | 2951 | .f32 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.float) }, |
| 2952 | .f64 => switch (CType.double.sizeInBits(target)) { | 2952 | .f64 => switch (target.c_type_bit_size(.double)) { |
| 2953 | 64 => return AbiAlignmentAdvanced{ .scalar = CType.double.alignment(target) }, | 2953 | 64 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.double) }, |
| 2954 | else => return AbiAlignmentAdvanced{ .scalar = 8 }, | 2954 | else => return AbiAlignmentAdvanced{ .scalar = 8 }, |
| 2955 | }, | 2955 | }, |
| 2956 | .f80 => switch (CType.longdouble.sizeInBits(target)) { | 2956 | .f80 => switch (target.c_type_bit_size(.longdouble)) { |
| 2957 | 80 => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, | 2957 | 80 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2958 | else => { | 2958 | else => { |
| 2959 | var payload: Payload.Bits = .{ | 2959 | var payload: Payload.Bits = .{ |
| 2960 | .base = .{ .tag = .int_unsigned }, | 2960 | .base = .{ .tag = .int_unsigned }, |
| ... | @@ -2964,8 +2964,8 @@ pub const Type = extern union { | ... | @@ -2964,8 +2964,8 @@ pub const Type = extern union { |
| 2964 | return AbiAlignmentAdvanced{ .scalar = abiAlignment(u80_ty, target) }; | 2964 | return AbiAlignmentAdvanced{ .scalar = abiAlignment(u80_ty, target) }; |
| 2965 | }, | 2965 | }, |
| 2966 | }, | 2966 | }, |
| 2967 | .f128 => switch (CType.longdouble.sizeInBits(target)) { | 2967 | .f128 => switch (target.c_type_bit_size(.longdouble)) { |
| 2968 | 128 => return AbiAlignmentAdvanced{ .scalar = CType.longdouble.alignment(target) }, | 2968 | 128 => return AbiAlignmentAdvanced{ .scalar = target.c_type_alignment(.longdouble) }, |
| 2969 | else => return AbiAlignmentAdvanced{ .scalar = 16 }, | 2969 | else => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2970 | }, | 2970 | }, |
| 2971 | | 2971 | |
| ... | @@ -3434,21 +3434,22 @@ pub const Type = extern union { | ... | @@ -3434,21 +3434,22 @@ pub const Type = extern union { |
| 3434 | else => return AbiSizeAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, | 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) }, | 3437 | .c_short => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.short) }, |
| 3438 | .c_ushort => return AbiSizeAdvanced{ .scalar = @divExact(CType.ushort.sizeInBits(target), 8) }, | 3438 | .c_ushort => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.ushort) }, |
| 3439 | .c_int => return AbiSizeAdvanced{ .scalar = @divExact(CType.int.sizeInBits(target), 8) }, | 3439 | .c_int => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.int) }, |
| 3440 | .c_uint => return AbiSizeAdvanced{ .scalar = @divExact(CType.uint.sizeInBits(target), 8) }, | 3440 | .c_uint => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.uint) }, |
| 3441 | .c_long => return AbiSizeAdvanced{ .scalar = @divExact(CType.long.sizeInBits(target), 8) }, | 3441 | .c_long => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.long) }, |
| 3442 | .c_ulong => return AbiSizeAdvanced{ .scalar = @divExact(CType.ulong.sizeInBits(target), 8) }, | 3442 | .c_ulong => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.ulong) }, |
| 3443 | .c_longlong => return AbiSizeAdvanced{ .scalar = @divExact(CType.longlong.sizeInBits(target), 8) }, | 3443 | .c_longlong => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.longlong) }, |
| 3444 | .c_ulonglong => return AbiSizeAdvanced{ .scalar = @divExact(CType.ulonglong.sizeInBits(target), 8) }, | 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 | .f16 => return AbiSizeAdvanced{ .scalar = 2 }, | 3447 | .f16 => return AbiSizeAdvanced{ .scalar = 2 }, |
| 3447 | .f32 => return AbiSizeAdvanced{ .scalar = 4 }, | 3448 | .f32 => return AbiSizeAdvanced{ .scalar = 4 }, |
| 3448 | .f64 => return AbiSizeAdvanced{ .scalar = 8 }, | 3449 | .f64 => return AbiSizeAdvanced{ .scalar = 8 }, |
| 3449 | .f128 => return AbiSizeAdvanced{ .scalar = 16 }, | 3450 | .f128 => return AbiSizeAdvanced{ .scalar = 16 }, |
| 3450 | .f80 => switch (CType.longdouble.sizeInBits(target)) { | 3451 | .f80 => switch (target.c_type_bit_size(.longdouble)) { |
| 3451 | 80 => return AbiSizeAdvanced{ .scalar = std.mem.alignForward(10, CType.longdouble.alignment(target)) }, | 3452 | 80 => return AbiSizeAdvanced{ .scalar = target.c_type_byte_size(.longdouble) }, |
| 3452 | else => { | 3453 | else => { |
| 3453 | var payload: Payload.Bits = .{ | 3454 | var payload: Payload.Bits = .{ |
| 3454 | .base = .{ .tag = .int_unsigned }, | 3455 | .base = .{ .tag = .int_unsigned }, |
| ... | @@ -3458,14 +3459,6 @@ pub const Type = extern union { | ... | @@ -3458,14 +3459,6 @@ pub const Type = extern union { |
| 3458 | return AbiSizeAdvanced{ .scalar = abiSize(u80_ty, target) }; | 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 | // TODO revisit this when we have the concept of the error tag type | 3463 | // TODO revisit this when we have the concept of the error tag type |
| 3471 | .anyerror_void_error_union, | 3464 | .anyerror_void_error_union, |
| ... | @@ -3748,15 +3741,15 @@ pub const Type = extern union { | ... | @@ -3748,15 +3741,15 @@ pub const Type = extern union { |
| 3748 | .manyptr_const_u8_sentinel_0, | 3741 | .manyptr_const_u8_sentinel_0, |
| 3749 | => return target.cpu.arch.ptrBitWidth(), | 3742 | => return target.cpu.arch.ptrBitWidth(), |
| 3750 | | 3743 | |
| 3751 | .c_short => return CType.short.sizeInBits(target), | 3744 | .c_short => return target.c_type_bit_size(.short), |
| 3752 | .c_ushort => return CType.ushort.sizeInBits(target), | 3745 | .c_ushort => return target.c_type_bit_size(.ushort), |
| 3753 | .c_int => return CType.int.sizeInBits(target), | 3746 | .c_int => return target.c_type_bit_size(.int), |
| 3754 | .c_uint => return CType.uint.sizeInBits(target), | 3747 | .c_uint => return target.c_type_bit_size(.uint), |
| 3755 | .c_long => return CType.long.sizeInBits(target), | 3748 | .c_long => return target.c_type_bit_size(.long), |
| 3756 | .c_ulong => return CType.ulong.sizeInBits(target), | 3749 | .c_ulong => return target.c_type_bit_size(.ulong), |
| 3757 | .c_longlong => return CType.longlong.sizeInBits(target), | 3750 | .c_longlong => return target.c_type_bit_size(.longlong), |
| 3758 | .c_ulonglong => return CType.ulonglong.sizeInBits(target), | 3751 | .c_ulonglong => return target.c_type_bit_size(.ulonglong), |
| 3759 | .c_longdouble => return CType.longdouble.sizeInBits(target), | 3752 | .c_longdouble => return target.c_type_bit_size(.longdouble), |
| 3760 | | 3753 | |
| 3761 | .error_set, | 3754 | .error_set, |
| 3762 | .error_set_single, | 3755 | .error_set_single, |
| ... | @@ -4631,14 +4624,14 @@ pub const Type = extern union { | ... | @@ -4631,14 +4624,14 @@ pub const Type = extern union { |
| 4631 | .i128 => return .{ .signedness = .signed, .bits = 128 }, | 4624 | .i128 => return .{ .signedness = .signed, .bits = 128 }, |
| 4632 | .usize => return .{ .signedness = .unsigned, .bits = target.cpu.arch.ptrBitWidth() }, | 4625 | .usize => return .{ .signedness = .unsigned, .bits = target.cpu.arch.ptrBitWidth() }, |
| 4633 | .isize => return .{ .signedness = .signed, .bits = target.cpu.arch.ptrBitWidth() }, | 4626 | .isize => return .{ .signedness = .signed, .bits = target.cpu.arch.ptrBitWidth() }, |
| 4634 | .c_short => return .{ .signedness = .signed, .bits = CType.short.sizeInBits(target) }, | 4627 | .c_short => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.short) }, |
| 4635 | .c_ushort => return .{ .signedness = .unsigned, .bits = CType.ushort.sizeInBits(target) }, | 4628 | .c_ushort => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ushort) }, |
| 4636 | .c_int => return .{ .signedness = .signed, .bits = CType.int.sizeInBits(target) }, | 4629 | .c_int => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.int) }, |
| 4637 | .c_uint => return .{ .signedness = .unsigned, .bits = CType.uint.sizeInBits(target) }, | 4630 | .c_uint => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.uint) }, |
| 4638 | .c_long => return .{ .signedness = .signed, .bits = CType.long.sizeInBits(target) }, | 4631 | .c_long => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.long) }, |
| 4639 | .c_ulong => return .{ .signedness = .unsigned, .bits = CType.ulong.sizeInBits(target) }, | 4632 | .c_ulong => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ulong) }, |
| 4640 | .c_longlong => return .{ .signedness = .signed, .bits = CType.longlong.sizeInBits(target) }, | 4633 | .c_longlong => return .{ .signedness = .signed, .bits = target.c_type_bit_size(.longlong) }, |
| 4641 | .c_ulonglong => return .{ .signedness = .unsigned, .bits = CType.ulonglong.sizeInBits(target) }, | 4634 | .c_ulonglong => return .{ .signedness = .unsigned, .bits = target.c_type_bit_size(.ulonglong) }, |
| 4642 | | 4635 | |
| 4643 | .enum_full, .enum_nonexhaustive => ty = ty.cast(Payload.EnumFull).?.data.tag_ty, | 4636 | .enum_full, .enum_nonexhaustive => ty = ty.cast(Payload.EnumFull).?.data.tag_ty, |
| 4644 | .enum_numbered => ty = ty.castTag(.enum_numbered).?.data.tag_ty, | 4637 | .enum_numbered => ty = ty.castTag(.enum_numbered).?.data.tag_ty, |
| ... | @@ -4724,7 +4717,7 @@ pub const Type = extern union { | ... | @@ -4724,7 +4717,7 @@ pub const Type = extern union { |
| 4724 | .f64 => 64, | 4717 | .f64 => 64, |
| 4725 | .f80 => 80, | 4718 | .f80 => 80, |
| 4726 | .f128, .comptime_float => 128, | 4719 | .f128, .comptime_float => 128, |
| 4727 | .c_longdouble => CType.longdouble.sizeInBits(target), | 4720 | .c_longdouble => target.c_type_bit_size(.longdouble), |
| 4728 | | 4721 | |
| 4729 | else => unreachable, | 4722 | else => unreachable, |
| 4730 | }; | 4723 | }; |
| ... | @@ -6689,536 +6682,3 @@ pub const Type = extern union { | ... | @@ -6689,536 +6682,3 @@ pub const Type = extern union { |
| 6689 | /// to packed struct layout to find out all the places in the codebase you need to edit! | 6682 | /// to packed struct layout to find out all the places in the codebase you need to edit! |
| 6690 | pub const packed_struct_layout_version = 2; | 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 | }; | | |