| ... | @@ -968,7 +968,7 @@ pub fn abiAlignmentInner( | ... | @@ -968,7 +968,7 @@ pub fn abiAlignmentInner( |
| 968 | else => switch (ip.indexToKey(ty.toIntern())) { | 968 | else => switch (ip.indexToKey(ty.toIntern())) { |
| 969 | .int_type => |int_type| { | 969 | .int_type => |int_type| { |
| 970 | if (int_type.bits == 0) return .{ .scalar = .@"1" }; | 970 | if (int_type.bits == 0) return .{ .scalar = .@"1" }; |
| 971 | return .{ .scalar = intAbiAlignment(int_type.bits, target) }; | 971 | return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, int_type.bits)) }; |
| 972 | }, | 972 | }, |
| 973 | .ptr_type, .anyframe_type => { | 973 | .ptr_type, .anyframe_type => { |
| 974 | return .{ .scalar = ptrAbiAlignment(target) }; | 974 | return .{ .scalar = ptrAbiAlignment(target) }; |
| ... | @@ -1021,7 +1021,7 @@ pub fn abiAlignmentInner( | ... | @@ -1021,7 +1021,7 @@ pub fn abiAlignmentInner( |
| 1021 | .error_set_type, .inferred_error_set_type => { | 1021 | .error_set_type, .inferred_error_set_type => { |
| 1022 | const bits = zcu.errorSetBits(); | 1022 | const bits = zcu.errorSetBits(); |
| 1023 | if (bits == 0) return .{ .scalar = .@"1" }; | 1023 | if (bits == 0) return .{ .scalar = .@"1" }; |
| 1024 | return .{ .scalar = intAbiAlignment(bits, target) }; | 1024 | return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, bits)) }; |
| 1025 | }, | 1025 | }, |
| 1026 | | 1026 | |
| 1027 | // represents machine code; not a pointer | 1027 | // represents machine code; not a pointer |
| ... | @@ -1034,7 +1034,7 @@ pub fn abiAlignmentInner( | ... | @@ -1034,7 +1034,7 @@ pub fn abiAlignmentInner( |
| 1034 | | 1034 | |
| 1035 | .usize, | 1035 | .usize, |
| 1036 | .isize, | 1036 | .isize, |
| 1037 | => return .{ .scalar = intAbiAlignment(target.ptrBitWidth(), target) }, | 1037 | => return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, target.ptrBitWidth())) }, |
| 1038 | | 1038 | |
| 1039 | .c_char => return .{ .scalar = cTypeAlign(target, .char) }, | 1039 | .c_char => return .{ .scalar = cTypeAlign(target, .char) }, |
| 1040 | .c_short => return .{ .scalar = cTypeAlign(target, .short) }, | 1040 | .c_short => return .{ .scalar = cTypeAlign(target, .short) }, |
| ... | @@ -1065,7 +1065,7 @@ pub fn abiAlignmentInner( | ... | @@ -1065,7 +1065,7 @@ pub fn abiAlignmentInner( |
| 1065 | .anyerror, .adhoc_inferred_error_set => { | 1065 | .anyerror, .adhoc_inferred_error_set => { |
| 1066 | const bits = zcu.errorSetBits(); | 1066 | const bits = zcu.errorSetBits(); |
| 1067 | if (bits == 0) return .{ .scalar = .@"1" }; | 1067 | if (bits == 0) return .{ .scalar = .@"1" }; |
| 1068 | return .{ .scalar = intAbiAlignment(bits, target) }; | 1068 | return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, bits)) }; |
| 1069 | }, | 1069 | }, |
| 1070 | | 1070 | |
| 1071 | .void, | 1071 | .void, |
| ... | @@ -1297,7 +1297,7 @@ pub fn abiSizeInner( | ... | @@ -1297,7 +1297,7 @@ pub fn abiSizeInner( |
| 1297 | else => switch (ip.indexToKey(ty.toIntern())) { | 1297 | else => switch (ip.indexToKey(ty.toIntern())) { |
| 1298 | .int_type => |int_type| { | 1298 | .int_type => |int_type| { |
| 1299 | if (int_type.bits == 0) return .{ .scalar = 0 }; | 1299 | if (int_type.bits == 0) return .{ .scalar = 0 }; |
| 1300 | return .{ .scalar = intAbiSize(int_type.bits, target) }; | 1300 | return .{ .scalar = std.zig.target.intByteSize(target, int_type.bits) }; |
| 1301 | }, | 1301 | }, |
| 1302 | .ptr_type => |ptr_type| switch (ptr_type.flags.size) { | 1302 | .ptr_type => |ptr_type| switch (ptr_type.flags.size) { |
| 1303 | .slice => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) * 2 }, | 1303 | .slice => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) * 2 }, |
| ... | @@ -1359,7 +1359,7 @@ pub fn abiSizeInner( | ... | @@ -1359,7 +1359,7 @@ pub fn abiSizeInner( |
| 1359 | .error_set_type, .inferred_error_set_type => { | 1359 | .error_set_type, .inferred_error_set_type => { |
| 1360 | const bits = zcu.errorSetBits(); | 1360 | const bits = zcu.errorSetBits(); |
| 1361 | if (bits == 0) return .{ .scalar = 0 }; | 1361 | if (bits == 0) return .{ .scalar = 0 }; |
| 1362 | return .{ .scalar = intAbiSize(bits, target) }; | 1362 | return .{ .scalar = std.zig.target.intByteSize(target, bits) }; |
| 1363 | }, | 1363 | }, |
| 1364 | | 1364 | |
| 1365 | .error_union_type => |error_union_type| { | 1365 | .error_union_type => |error_union_type| { |
| ... | @@ -1452,7 +1452,7 @@ pub fn abiSizeInner( | ... | @@ -1452,7 +1452,7 @@ pub fn abiSizeInner( |
| 1452 | .anyerror, .adhoc_inferred_error_set => { | 1452 | .anyerror, .adhoc_inferred_error_set => { |
| 1453 | const bits = zcu.errorSetBits(); | 1453 | const bits = zcu.errorSetBits(); |
| 1454 | if (bits == 0) return .{ .scalar = 0 }; | 1454 | if (bits == 0) return .{ .scalar = 0 }; |
| 1455 | return .{ .scalar = intAbiSize(bits, target) }; | 1455 | return .{ .scalar = std.zig.target.intByteSize(target, bits) }; |
| 1456 | }, | 1456 | }, |
| 1457 | | 1457 | |
| 1458 | .noreturn => unreachable, | 1458 | .noreturn => unreachable, |
| ... | @@ -1606,100 +1606,6 @@ pub fn ptrAbiAlignment(target: Target) Alignment { | ... | @@ -1606,100 +1606,6 @@ pub fn ptrAbiAlignment(target: Target) Alignment { |
| 1606 | return Alignment.fromNonzeroByteUnits(@divExact(target.ptrBitWidth(), 8)); | 1606 | return Alignment.fromNonzeroByteUnits(@divExact(target.ptrBitWidth(), 8)); |
| 1607 | } | 1607 | } |
| 1608 | | 1608 | |
| 1609 | pub fn intAbiSize(bits: u16, target: Target) u64 { | | |
| 1610 | return intAbiAlignment(bits, target).forward(@as(u16, @intCast((@as(u17, bits) + 7) / 8))); | | |
| 1611 | } | | |
| 1612 | | | |
| 1613 | pub fn intAbiAlignment(bits: u16, target: Target) Alignment { | | |
| 1614 | return switch (target.cpu.arch) { | | |
| 1615 | .x86 => switch (bits) { | | |
| 1616 | 0 => .none, | | |
| 1617 | 1...8 => .@"1", | | |
| 1618 | 9...16 => .@"2", | | |
| 1619 | 17...32 => .@"4", | | |
| 1620 | 33...64 => switch (target.os.tag) { | | |
| 1621 | .uefi, .windows => .@"8", | | |
| 1622 | else => .@"4", | | |
| 1623 | }, | | |
| 1624 | else => .@"16", | | |
| 1625 | }, | | |
| 1626 | .x86_64 => switch (bits) { | | |
| 1627 | 0 => .none, | | |
| 1628 | 1...8 => .@"1", | | |
| 1629 | 9...16 => .@"2", | | |
| 1630 | 17...32 => .@"4", | | |
| 1631 | 33...64 => .@"8", | | |
| 1632 | else => .@"16", | | |
| 1633 | }, | | |
| 1634 | else => return Alignment.fromByteUnits(@min( | | |
| 1635 | std.math.ceilPowerOfTwoPromote(u16, @as(u16, @intCast((@as(u17, bits) + 7) / 8))), | | |
| 1636 | maxIntAlignment(target), | | |
| 1637 | )), | | |
| 1638 | }; | | |
| 1639 | } | | |
| 1640 | | | |
| 1641 | pub fn maxIntAlignment(target: std.Target) u16 { | | |
| 1642 | return switch (target.cpu.arch) { | | |
| 1643 | .avr => 1, | | |
| 1644 | | | |
| 1645 | .msp430 => 2, | | |
| 1646 | | | |
| 1647 | .xcore, | | |
| 1648 | .propeller, | | |
| 1649 | => 4, | | |
| 1650 | | | |
| 1651 | .amdgcn, | | |
| 1652 | .arm, | | |
| 1653 | .armeb, | | |
| 1654 | .thumb, | | |
| 1655 | .thumbeb, | | |
| 1656 | .lanai, | | |
| 1657 | .hexagon, | | |
| 1658 | .mips, | | |
| 1659 | .mipsel, | | |
| 1660 | .powerpc, | | |
| 1661 | .powerpcle, | | |
| 1662 | .riscv32, | | |
| 1663 | .s390x, | | |
| 1664 | => 8, | | |
| 1665 | | | |
| 1666 | // Even LLVMABIAlignmentOfType(i128) agrees on these targets. | | |
| 1667 | .aarch64, | | |
| 1668 | .aarch64_be, | | |
| 1669 | .bpfel, | | |
| 1670 | .bpfeb, | | |
| 1671 | .mips64, | | |
| 1672 | .mips64el, | | |
| 1673 | .nvptx, | | |
| 1674 | .nvptx64, | | |
| 1675 | .powerpc64, | | |
| 1676 | .powerpc64le, | | |
| 1677 | .riscv64, | | |
| 1678 | .sparc, | | |
| 1679 | .sparc64, | | |
| 1680 | .wasm32, | | |
| 1681 | .wasm64, | | |
| 1682 | .x86, | | |
| 1683 | .x86_64, | | |
| 1684 | => 16, | | |
| 1685 | | | |
| 1686 | // Below this comment are unverified but based on the fact that C requires | | |
| 1687 | // int128_t to be 16 bytes aligned, it's a safe default. | | |
| 1688 | .arc, | | |
| 1689 | .csky, | | |
| 1690 | .kalimba, | | |
| 1691 | .loongarch32, | | |
| 1692 | .loongarch64, | | |
| 1693 | .m68k, | | |
| 1694 | .spirv, | | |
| 1695 | .spirv32, | | |
| 1696 | .spirv64, | | |
| 1697 | .ve, | | |
| 1698 | .xtensa, | | |
| 1699 | => 16, | | |
| 1700 | }; | | |
| 1701 | } | | |
| 1702 | | | |
| 1703 | pub fn bitSize(ty: Type, zcu: *const Zcu) u64 { | 1609 | pub fn bitSize(ty: Type, zcu: *const Zcu) u64 { |
| 1704 | return bitSizeInner(ty, .normal, zcu, {}) catch unreachable; | 1610 | return bitSizeInner(ty, .normal, zcu, {}) catch unreachable; |
| 1705 | } | 1611 | } |