diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2025-04-06 10:14:34 +0200 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2025-04-11 05:22:00 -0400 |
| commit | ed9aa8f259d452cb344064ee412fc5af18877d55 (patch) | |
| tree | bc25fc044efda559430e3ea7d715936b179b37cf /src/Type.zig | |
| parent | 0132be7bf3fd02cfb8c31ffdeaddae918a76b295 (diff) | |
| download | zig-ed9aa8f259d452cb344064ee412fc5af18877d55.tar.gz zig-ed9aa8f259d452cb344064ee412fc5af18877d55.zip | |
compiler: Move int size/alignment functions to std.Target and std.zig.target.
This allows using them in e.g. compiler-rt.
Diffstat (limited to 'src/Type.zig')
| -rw-r--r-- | src/Type.zig | 108 |
1 files changed, 7 insertions, 101 deletions
diff --git a/src/Type.zig b/src/Type.zig index dfa77f3383..a789edefe1 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -968,7 +968,7 @@ pub fn abiAlignmentInner( else => switch (ip.indexToKey(ty.toIntern())) { .int_type => |int_type| { if (int_type.bits == 0) return .{ .scalar = .@"1" }; - return .{ .scalar = intAbiAlignment(int_type.bits, target) }; + return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, int_type.bits)) }; }, .ptr_type, .anyframe_type => { return .{ .scalar = ptrAbiAlignment(target) }; @@ -1021,7 +1021,7 @@ pub fn abiAlignmentInner( .error_set_type, .inferred_error_set_type => { const bits = zcu.errorSetBits(); if (bits == 0) return .{ .scalar = .@"1" }; - return .{ .scalar = intAbiAlignment(bits, target) }; + return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, bits)) }; }, // represents machine code; not a pointer @@ -1034,7 +1034,7 @@ pub fn abiAlignmentInner( .usize, .isize, - => return .{ .scalar = intAbiAlignment(target.ptrBitWidth(), target) }, + => return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, target.ptrBitWidth())) }, .c_char => return .{ .scalar = cTypeAlign(target, .char) }, .c_short => return .{ .scalar = cTypeAlign(target, .short) }, @@ -1065,7 +1065,7 @@ pub fn abiAlignmentInner( .anyerror, .adhoc_inferred_error_set => { const bits = zcu.errorSetBits(); if (bits == 0) return .{ .scalar = .@"1" }; - return .{ .scalar = intAbiAlignment(bits, target) }; + return .{ .scalar = .fromByteUnits(std.zig.target.intAlignment(target, bits)) }; }, .void, @@ -1297,7 +1297,7 @@ pub fn abiSizeInner( else => switch (ip.indexToKey(ty.toIntern())) { .int_type => |int_type| { if (int_type.bits == 0) return .{ .scalar = 0 }; - return .{ .scalar = intAbiSize(int_type.bits, target) }; + return .{ .scalar = std.zig.target.intByteSize(target, int_type.bits) }; }, .ptr_type => |ptr_type| switch (ptr_type.flags.size) { .slice => return .{ .scalar = @divExact(target.ptrBitWidth(), 8) * 2 }, @@ -1359,7 +1359,7 @@ pub fn abiSizeInner( .error_set_type, .inferred_error_set_type => { const bits = zcu.errorSetBits(); if (bits == 0) return .{ .scalar = 0 }; - return .{ .scalar = intAbiSize(bits, target) }; + return .{ .scalar = std.zig.target.intByteSize(target, bits) }; }, .error_union_type => |error_union_type| { @@ -1452,7 +1452,7 @@ pub fn abiSizeInner( .anyerror, .adhoc_inferred_error_set => { const bits = zcu.errorSetBits(); if (bits == 0) return .{ .scalar = 0 }; - return .{ .scalar = intAbiSize(bits, target) }; + return .{ .scalar = std.zig.target.intByteSize(target, bits) }; }, .noreturn => unreachable, @@ -1606,100 +1606,6 @@ pub fn ptrAbiAlignment(target: Target) Alignment { return Alignment.fromNonzeroByteUnits(@divExact(target.ptrBitWidth(), 8)); } -pub fn intAbiSize(bits: u16, target: Target) u64 { - return intAbiAlignment(bits, target).forward(@as(u16, @intCast((@as(u17, bits) + 7) / 8))); -} - -pub fn intAbiAlignment(bits: u16, target: Target) Alignment { - return switch (target.cpu.arch) { - .x86 => switch (bits) { - 0 => .none, - 1...8 => .@"1", - 9...16 => .@"2", - 17...32 => .@"4", - 33...64 => switch (target.os.tag) { - .uefi, .windows => .@"8", - else => .@"4", - }, - else => .@"16", - }, - .x86_64 => switch (bits) { - 0 => .none, - 1...8 => .@"1", - 9...16 => .@"2", - 17...32 => .@"4", - 33...64 => .@"8", - else => .@"16", - }, - else => return Alignment.fromByteUnits(@min( - std.math.ceilPowerOfTwoPromote(u16, @as(u16, @intCast((@as(u17, bits) + 7) / 8))), - maxIntAlignment(target), - )), - }; -} - -pub fn maxIntAlignment(target: std.Target) u16 { - return switch (target.cpu.arch) { - .avr => 1, - - .msp430 => 2, - - .xcore, - .propeller, - => 4, - - .amdgcn, - .arm, - .armeb, - .thumb, - .thumbeb, - .lanai, - .hexagon, - .mips, - .mipsel, - .powerpc, - .powerpcle, - .riscv32, - .s390x, - => 8, - - // Even LLVMABIAlignmentOfType(i128) agrees on these targets. - .aarch64, - .aarch64_be, - .bpfel, - .bpfeb, - .mips64, - .mips64el, - .nvptx, - .nvptx64, - .powerpc64, - .powerpc64le, - .riscv64, - .sparc, - .sparc64, - .wasm32, - .wasm64, - .x86, - .x86_64, - => 16, - - // Below this comment are unverified but based on the fact that C requires - // int128_t to be 16 bytes aligned, it's a safe default. - .arc, - .csky, - .kalimba, - .loongarch32, - .loongarch64, - .m68k, - .spirv, - .spirv32, - .spirv64, - .ve, - .xtensa, - => 16, - }; -} - pub fn bitSize(ty: Type, zcu: *const Zcu) u64 { return bitSizeInner(ty, .normal, zcu, {}) catch unreachable; } |
