| author | |
| committer | |
| log | 9c45a87490dab538ee480549d3194e946f2ae6b2 |
| tree | 9d8d3efa8999ce19615f79964df748d6c820768e |
| parent | 4187d0e8feda7982c1d15a73e99a42cbf4e355e3 |
| signature |
Simplifies the logic, clarifies the comment, and fixes a minor bug,
which is that we exported the Windows ABI name *instead* of the standard
compiler-rt name, but it's meant to be exported *in addition* to the
standard name (this is LLVM's behavior and it is more useful).12 files changed, 67 insertions(+), 21 deletions(-)
lib/compiler_rt/arm.zig+10-5| ... | @@ -15,11 +15,16 @@ comptime { | ... | @@ -15,11 +15,16 @@ comptime { |
| 15 | @export(&__aeabi_unwind_cpp_pr1, .{ .name = "__aeabi_unwind_cpp_pr1", .linkage = common.linkage, .visibility = common.visibility }); | 15 | @export(&__aeabi_unwind_cpp_pr1, .{ .name = "__aeabi_unwind_cpp_pr1", .linkage = common.linkage, .visibility = common.visibility }); |
| 16 | @export(&__aeabi_unwind_cpp_pr2, .{ .name = "__aeabi_unwind_cpp_pr2", .linkage = common.linkage, .visibility = common.visibility }); | 16 | @export(&__aeabi_unwind_cpp_pr2, .{ .name = "__aeabi_unwind_cpp_pr2", .linkage = common.linkage, .visibility = common.visibility }); |
| 17 | 17 | ||
| 18 | @export(&__aeabi_ldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv64" else "__aeabi_ldivmod", .linkage = common.linkage, .visibility = common.visibility }); | 18 | if (common.want_windows_arm_abi) { |
| 19 | @export(&__aeabi_uldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_udiv64" else "__aeabi_uldivmod", .linkage = common.linkage, .visibility = common.visibility }); | 19 | @export(&__aeabi_ldivmod, .{ .name = "__rt_sdiv64", .linkage = common.linkage, .visibility = common.visibility }); |
| 20 | 20 | @export(&__aeabi_uldivmod, .{ .name = "__rt_udiv64", .linkage = common.linkage, .visibility = common.visibility }); | |
| 21 | @export(&__aeabi_idivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv" else "__aeabi_idivmod", .linkage = common.linkage, .visibility = common.visibility }); | 21 | @export(&__aeabi_idivmod, .{ .name = "__rt_sdiv", .linkage = common.linkage, .visibility = common.visibility }); |
| 22 | @export(&__aeabi_uidivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_udiv" else "__aeabi_uidivmod", .linkage = common.linkage, .visibility = common.visibility }); | 22 | @export(&__aeabi_uidivmod, .{ .name = "__rt_udiv", .linkage = common.linkage, .visibility = common.visibility }); |
| 23 | } | ||
| 24 | @export(&__aeabi_ldivmod, .{ .name = "__aeabi_ldivmod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 25 | @export(&__aeabi_uldivmod, .{ .name = "__aeabi_uldivmod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 26 | @export(&__aeabi_idivmod, .{ .name = "__aeabi_idivmod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 27 | @export(&__aeabi_uidivmod, .{ .name = "__aeabi_uidivmod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 23 | 28 | ||
| 24 | @export(&__aeabi_memcpy, .{ .name = "__aeabi_memcpy", .linkage = common.linkage, .visibility = common.visibility }); | 29 | @export(&__aeabi_memcpy, .{ .name = "__aeabi_memcpy", .linkage = common.linkage, .visibility = common.visibility }); |
| 25 | @export(&__aeabi_memcpy4, .{ .name = "__aeabi_memcpy4", .linkage = common.linkage, .visibility = common.visibility }); | 30 | @export(&__aeabi_memcpy4, .{ .name = "__aeabi_memcpy4", .linkage = common.linkage, .visibility = common.visibility }); |
lib/compiler_rt/aulldiv.zig+1-1| ... | @@ -8,7 +8,7 @@ const common = @import("common.zig"); | ... | @@ -8,7 +8,7 @@ const common = @import("common.zig"); |
| 8 | pub const panic = common.panic; | 8 | pub const panic = common.panic; |
| 9 | 9 | ||
| 10 | comptime { | 10 | comptime { |
| 11 | if (arch == .x86 and common.want_windows_msvc_or_itanium_abi and !builtin.link_libc) { | 11 | if (common.want_windows_x86_msvc_abi) { |
| 12 | // Don't let LLVM apply the stdcall name mangling on those MSVC builtins | 12 | // Don't let LLVM apply the stdcall name mangling on those MSVC builtins |
| 13 | @export(&_alldiv, .{ .name = "\x01__alldiv", .linkage = common.linkage, .visibility = common.visibility }); | 13 | @export(&_alldiv, .{ .name = "\x01__alldiv", .linkage = common.linkage, .visibility = common.visibility }); |
| 14 | @export(&_aulldiv, .{ .name = "\x01__aulldiv", .linkage = common.linkage, .visibility = common.visibility }); | 14 | @export(&_aulldiv, .{ .name = "\x01__aulldiv", .linkage = common.linkage, .visibility = common.visibility }); |
lib/compiler_rt/aullrem.zig+1-1| ... | @@ -8,7 +8,7 @@ const common = @import("common.zig"); | ... | @@ -8,7 +8,7 @@ const common = @import("common.zig"); |
| 8 | pub const panic = common.panic; | 8 | pub const panic = common.panic; |
| 9 | 9 | ||
| 10 | comptime { | 10 | comptime { |
| 11 | if (arch == .x86 and common.want_windows_msvc_or_itanium_abi and !builtin.link_libc) { | 11 | if (common.want_windows_x86_msvc_abi) { |
| 12 | // Don't let LLVM apply the stdcall name mangling on those MSVC builtins | 12 | // Don't let LLVM apply the stdcall name mangling on those MSVC builtins |
| 13 | @export(&_allrem, .{ .name = "\x01__allrem", .linkage = common.linkage, .visibility = common.visibility }); | 13 | @export(&_allrem, .{ .name = "\x01__allrem", .linkage = common.linkage, .visibility = common.visibility }); |
| 14 | @export(&_aullrem, .{ .name = "\x01__aullrem", .linkage = common.linkage, .visibility = common.visibility }); | 14 | @export(&_aullrem, .{ .name = "\x01__aullrem", .linkage = common.linkage, .visibility = common.visibility }); |
lib/compiler_rt/common.zig+23-6| ... | @@ -48,13 +48,30 @@ pub const want_aeabi = switch (builtin.abi) { | ... | @@ -48,13 +48,30 @@ pub const want_aeabi = switch (builtin.abi) { |
| 48 | else => false, | 48 | else => false, |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | /// These functions are provided by libc when targeting MSVC, but not MinGW. | 51 | /// These functions are required on Windows on ARM. They are provided by MSVC libc, but in libc-less |
| 52 | // Temporarily used for thumb-uefi until https://github.com/ziglang/zig/issues/21630 is addressed. | 52 | /// builds or when linking MinGW libc they are our responsibility. |
| 53 | pub const want_windows_arm_abi = builtin.cpu.arch.isArm() and (builtin.os.tag == .windows or builtin.os.tag == .uefi) and (builtin.abi.isGnu() or !builtin.link_libc); | 53 | /// Temporarily used for thumb-uefi until https://github.com/ziglang/zig/issues/21630 is addressed. |
| 54 | pub const want_windows_arm_abi = e: { | ||
| 55 | if (!builtin.cpu.arch.isArm()) break :e false; | ||
| 56 | switch (builtin.os.tag) { | ||
| 57 | .windows, .uefi => {}, | ||
| 58 | else => break :e false, | ||
| 59 | } | ||
| 60 | // The ABI is needed, but it's only our reponsibility if libc won't provide it. | ||
| 61 | break :e builtin.abi.isGnu() or !builtin.link_libc; | ||
| 62 | }; | ||
| 54 | 63 | ||
| 55 | pub const want_windows_msvc_or_itanium_abi = switch (builtin.abi) { | 64 | /// These functions are required by on Windows on x86 on some ABIs. They are provided by MSVC libc, |
| 56 | .none, .msvc, .itanium => builtin.os.tag == .windows, | 65 | /// but in libc-less builds they are our responsibility. |
| 57 | else => false, | 66 | pub const want_windows_x86_msvc_abi = e: { |
| 67 | if (builtin.cpu.arch != .x86) break :e false; | ||
| 68 | if (builtin.os.tag != .windows) break :e false; | ||
| 69 | switch (builtin.abi) { | ||
| 70 | .none, .msvc, .itanium => {}, | ||
| 71 | else => break :e false, | ||
| 72 | } | ||
| 73 | // The ABI is needed, but it's only our responsibility if libc won't provide it. | ||
| 74 | break :e !builtin.link_libc; | ||
| 58 | }; | 75 | }; |
| 59 | 76 | ||
| 60 | pub const want_ppc_abi = builtin.cpu.arch.isPowerPC(); | 77 | pub const want_ppc_abi = builtin.cpu.arch.isPowerPC(); |
lib/compiler_rt/fixdfdi.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_d2lz, .{ .name = "__aeabi_d2lz", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_d2lz, .{ .name = "__aeabi_d2lz", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__fixdfdi, .{ .name = if (common.want_windows_arm_abi) "__dtoi64" else "__fixdfdi", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__fixdfdi, .{ .name = "__dtoi64", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__fixdfdi, .{ .name = "__fixdfdi", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/fixsfdi.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_f2lz, .{ .name = "__aeabi_f2lz", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_f2lz, .{ .name = "__aeabi_f2lz", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__fixsfdi, .{ .name = if (common.want_windows_arm_abi) "__stoi64" else "__fixsfdi", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__fixsfdi, .{ .name = "__stoi64", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__fixsfdi, .{ .name = "__fixsfdi", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/fixunsdfdi.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_d2ulz, .{ .name = "__aeabi_d2ulz", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_d2ulz, .{ .name = "__aeabi_d2ulz", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__fixunsdfdi, .{ .name = if (common.want_windows_arm_abi) "__dtou64" else "__fixunsdfdi", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__fixunsdfdi, .{ .name = "__dtou64", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__fixunsdfdi, .{ .name = "__fixunsdfdi", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/fixunssfdi.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_f2ulz, .{ .name = "__aeabi_f2ulz", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_f2ulz, .{ .name = "__aeabi_f2ulz", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__fixunssfdi, .{ .name = if (common.want_windows_arm_abi) "__stou64" else "__fixunssfdi", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__fixunssfdi, .{ .name = "__stou64", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__fixunssfdi, .{ .name = "__fixunssfdi", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/floatdidf.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_l2d, .{ .name = "__aeabi_l2d", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_l2d, .{ .name = "__aeabi_l2d", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__floatdidf, .{ .name = if (common.want_windows_arm_abi) "__i64tod" else "__floatdidf", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__floatdidf, .{ .name = "__i64tod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__floatdidf, .{ .name = "__floatdidf", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/floatdisf.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_l2f, .{ .name = "__aeabi_l2f", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_l2f, .{ .name = "__aeabi_l2f", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__floatdisf, .{ .name = if (common.want_windows_arm_abi) "__i64tos" else "__floatdisf", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__floatdisf, .{ .name = "__i64tos", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__floatdisf, .{ .name = "__floatdisf", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/floatundidf.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_ul2d, .{ .name = "__aeabi_ul2d", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_ul2d, .{ .name = "__aeabi_ul2d", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__floatundidf, .{ .name = if (common.want_windows_arm_abi) "__u64tod" else "__floatundidf", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__floatundidf, .{ .name = "__u64tod", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__floatundidf, .{ .name = "__floatundidf", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |
lib/compiler_rt/floatundisf.zig+4-1| ... | @@ -8,7 +8,10 @@ comptime { | ... | @@ -8,7 +8,10 @@ comptime { |
| 8 | if (common.want_aeabi) { | 8 | if (common.want_aeabi) { |
| 9 | @export(&__aeabi_ul2f, .{ .name = "__aeabi_ul2f", .linkage = common.linkage, .visibility = common.visibility }); | 9 | @export(&__aeabi_ul2f, .{ .name = "__aeabi_ul2f", .linkage = common.linkage, .visibility = common.visibility }); |
| 10 | } else { | 10 | } else { |
| 11 | @export(&__floatundisf, .{ .name = if (common.want_windows_arm_abi) "__u64tos" else "__floatundisf", .linkage = common.linkage, .visibility = common.visibility }); | 11 | if (common.want_windows_arm_abi) { |
| 12 | @export(&__floatundisf, .{ .name = "__u64tos", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 13 | } | ||
| 14 | @export(&__floatundisf, .{ .name = "__floatundisf", .linkage = common.linkage, .visibility = common.visibility }); | ||
| 12 | } | 15 | } |
| 13 | } | 16 | } |
| 14 | 17 |