From 9c45a87490dab538ee480549d3194e946f2ae6b2 Mon Sep 17 00:00:00 2001 From: Matthew Lugg Date: Thu, 13 Nov 2025 10:15:35 +0000 Subject: [PATCH] compiler_rt: fix and simplify additional Windows exports 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). --- lib/compiler_rt/arm.zig | 15 ++++++++++----- lib/compiler_rt/aulldiv.zig | 2 +- lib/compiler_rt/aullrem.zig | 2 +- lib/compiler_rt/common.zig | 29 +++++++++++++++++++++++------ lib/compiler_rt/fixdfdi.zig | 5 ++++- lib/compiler_rt/fixsfdi.zig | 5 ++++- lib/compiler_rt/fixunsdfdi.zig | 5 ++++- lib/compiler_rt/fixunssfdi.zig | 5 ++++- lib/compiler_rt/floatdidf.zig | 5 ++++- lib/compiler_rt/floatdisf.zig | 5 ++++- lib/compiler_rt/floatundidf.zig | 5 ++++- lib/compiler_rt/floatundisf.zig | 5 ++++- 12 files changed, 67 insertions(+), 21 deletions(-) diff --git a/lib/compiler_rt/arm.zig b/lib/compiler_rt/arm.zig index 3c55df5f3bc00dcbb8fed52df20109973e7c289f..01775ab06fc9f41e81283a5b992a1c74edbe1249 100644 --- a/lib/compiler_rt/arm.zig +++ b/lib/compiler_rt/arm.zig @@ -15,11 +15,16 @@ comptime { @export(&__aeabi_unwind_cpp_pr1, .{ .name = "__aeabi_unwind_cpp_pr1", .linkage = common.linkage, .visibility = common.visibility }); @export(&__aeabi_unwind_cpp_pr2, .{ .name = "__aeabi_unwind_cpp_pr2", .linkage = common.linkage, .visibility = common.visibility }); - @export(&__aeabi_ldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv64" else "__aeabi_ldivmod", .linkage = common.linkage, .visibility = common.visibility }); - @export(&__aeabi_uldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_udiv64" else "__aeabi_uldivmod", .linkage = common.linkage, .visibility = common.visibility }); - - @export(&__aeabi_idivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv" else "__aeabi_idivmod", .linkage = common.linkage, .visibility = common.visibility }); - @export(&__aeabi_uidivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_udiv" else "__aeabi_uidivmod", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__aeabi_ldivmod, .{ .name = "__rt_sdiv64", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_uldivmod, .{ .name = "__rt_udiv64", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_idivmod, .{ .name = "__rt_sdiv", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_uidivmod, .{ .name = "__rt_udiv", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__aeabi_ldivmod, .{ .name = "__aeabi_ldivmod", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_uldivmod, .{ .name = "__aeabi_uldivmod", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_idivmod, .{ .name = "__aeabi_idivmod", .linkage = common.linkage, .visibility = common.visibility }); + @export(&__aeabi_uidivmod, .{ .name = "__aeabi_uidivmod", .linkage = common.linkage, .visibility = common.visibility }); @export(&__aeabi_memcpy, .{ .name = "__aeabi_memcpy", .linkage = common.linkage, .visibility = common.visibility }); @export(&__aeabi_memcpy4, .{ .name = "__aeabi_memcpy4", .linkage = common.linkage, .visibility = common.visibility }); diff --git a/lib/compiler_rt/aulldiv.zig b/lib/compiler_rt/aulldiv.zig index 2f57ab16870f17501030bb7147a98a23fa2dfde8..5a202fec00dcda541da5526c7dccb3dfc3ce2687 100644 --- a/lib/compiler_rt/aulldiv.zig +++ b/lib/compiler_rt/aulldiv.zig @@ -8,7 +8,7 @@ const common = @import("common.zig"); pub const panic = common.panic; comptime { - if (arch == .x86 and common.want_windows_msvc_or_itanium_abi and !builtin.link_libc) { + if (common.want_windows_x86_msvc_abi) { // Don't let LLVM apply the stdcall name mangling on those MSVC builtins @export(&_alldiv, .{ .name = "\x01__alldiv", .linkage = common.linkage, .visibility = common.visibility }); @export(&_aulldiv, .{ .name = "\x01__aulldiv", .linkage = common.linkage, .visibility = common.visibility }); diff --git a/lib/compiler_rt/aullrem.zig b/lib/compiler_rt/aullrem.zig index df50ef7381189b4f4464b15f8e877242e47ed977..d4365265be254e3c4a6f3a0bc4aad1a87a3180ec 100644 --- a/lib/compiler_rt/aullrem.zig +++ b/lib/compiler_rt/aullrem.zig @@ -8,7 +8,7 @@ const common = @import("common.zig"); pub const panic = common.panic; comptime { - if (arch == .x86 and common.want_windows_msvc_or_itanium_abi and !builtin.link_libc) { + if (common.want_windows_x86_msvc_abi) { // Don't let LLVM apply the stdcall name mangling on those MSVC builtins @export(&_allrem, .{ .name = "\x01__allrem", .linkage = common.linkage, .visibility = common.visibility }); @export(&_aullrem, .{ .name = "\x01__aullrem", .linkage = common.linkage, .visibility = common.visibility }); diff --git a/lib/compiler_rt/common.zig b/lib/compiler_rt/common.zig index 87747db273ea36edf069f4c232fbcb960bd0b451..8b66e7cc26c1d232ff4f3d0cb237f89d09ffa3eb 100644 --- a/lib/compiler_rt/common.zig +++ b/lib/compiler_rt/common.zig @@ -48,13 +48,30 @@ pub const want_aeabi = switch (builtin.abi) { else => false, }; -/// These functions are provided by libc when targeting MSVC, but not MinGW. -// Temporarily used for thumb-uefi until https://github.com/ziglang/zig/issues/21630 is addressed. -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); +/// These functions are required on Windows on ARM. They are provided by MSVC libc, but in libc-less +/// builds or when linking MinGW libc they are our responsibility. +/// Temporarily used for thumb-uefi until https://github.com/ziglang/zig/issues/21630 is addressed. +pub const want_windows_arm_abi = e: { + if (!builtin.cpu.arch.isArm()) break :e false; + switch (builtin.os.tag) { + .windows, .uefi => {}, + else => break :e false, + } + // The ABI is needed, but it's only our reponsibility if libc won't provide it. + break :e builtin.abi.isGnu() or !builtin.link_libc; +}; -pub const want_windows_msvc_or_itanium_abi = switch (builtin.abi) { - .none, .msvc, .itanium => builtin.os.tag == .windows, - else => false, +/// These functions are required by on Windows on x86 on some ABIs. They are provided by MSVC libc, +/// but in libc-less builds they are our responsibility. +pub const want_windows_x86_msvc_abi = e: { + if (builtin.cpu.arch != .x86) break :e false; + if (builtin.os.tag != .windows) break :e false; + switch (builtin.abi) { + .none, .msvc, .itanium => {}, + else => break :e false, + } + // The ABI is needed, but it's only our responsibility if libc won't provide it. + break :e !builtin.link_libc; }; pub const want_ppc_abi = builtin.cpu.arch.isPowerPC(); diff --git a/lib/compiler_rt/fixdfdi.zig b/lib/compiler_rt/fixdfdi.zig index 50eb788827c4095419ea57f9851e894d5e8582bf..a92c94504389835f53fa1c0f4ca215bc5103a961 100644 --- a/lib/compiler_rt/fixdfdi.zig +++ b/lib/compiler_rt/fixdfdi.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_d2lz, .{ .name = "__aeabi_d2lz", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__fixdfdi, .{ .name = if (common.want_windows_arm_abi) "__dtoi64" else "__fixdfdi", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__fixdfdi, .{ .name = "__dtoi64", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__fixdfdi, .{ .name = "__fixdfdi", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/fixsfdi.zig b/lib/compiler_rt/fixsfdi.zig index 877e7a6d4ca0e8242e1a304e5756479d792b0bbe..f0f7bb01e3fe50a39a44fe0233406dc265be6448 100644 --- a/lib/compiler_rt/fixsfdi.zig +++ b/lib/compiler_rt/fixsfdi.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_f2lz, .{ .name = "__aeabi_f2lz", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__fixsfdi, .{ .name = if (common.want_windows_arm_abi) "__stoi64" else "__fixsfdi", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__fixsfdi, .{ .name = "__stoi64", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__fixsfdi, .{ .name = "__fixsfdi", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/fixunsdfdi.zig b/lib/compiler_rt/fixunsdfdi.zig index e25a194bfc9d68c4f6b4af3df2ccefe7f54e3432..52577361a6889c489a0bab81ab5701fb087a70a9 100644 --- a/lib/compiler_rt/fixunsdfdi.zig +++ b/lib/compiler_rt/fixunsdfdi.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_d2ulz, .{ .name = "__aeabi_d2ulz", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__fixunsdfdi, .{ .name = if (common.want_windows_arm_abi) "__dtou64" else "__fixunsdfdi", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__fixunsdfdi, .{ .name = "__dtou64", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__fixunsdfdi, .{ .name = "__fixunsdfdi", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/fixunssfdi.zig b/lib/compiler_rt/fixunssfdi.zig index e8a206d7b0b825e2fccb40df23d22eda2ddf7dd0..e05d0377e06f963c1c88c61d3a9e5611b6961b02 100644 --- a/lib/compiler_rt/fixunssfdi.zig +++ b/lib/compiler_rt/fixunssfdi.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_f2ulz, .{ .name = "__aeabi_f2ulz", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__fixunssfdi, .{ .name = if (common.want_windows_arm_abi) "__stou64" else "__fixunssfdi", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__fixunssfdi, .{ .name = "__stou64", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__fixunssfdi, .{ .name = "__fixunssfdi", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/floatdidf.zig b/lib/compiler_rt/floatdidf.zig index 50b6fc1aabfd1525548428be480e2249edcb2bb2..38890e35a4e4e7888f59e4005bc65d01a75345db 100644 --- a/lib/compiler_rt/floatdidf.zig +++ b/lib/compiler_rt/floatdidf.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_l2d, .{ .name = "__aeabi_l2d", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__floatdidf, .{ .name = if (common.want_windows_arm_abi) "__i64tod" else "__floatdidf", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__floatdidf, .{ .name = "__i64tod", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__floatdidf, .{ .name = "__floatdidf", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/floatdisf.zig b/lib/compiler_rt/floatdisf.zig index 54f57cc3ca7ece6754c127657fc22f4519eefc78..a942d7b0b1f6a46865671c570614f28c6931ad5c 100644 --- a/lib/compiler_rt/floatdisf.zig +++ b/lib/compiler_rt/floatdisf.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_l2f, .{ .name = "__aeabi_l2f", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__floatdisf, .{ .name = if (common.want_windows_arm_abi) "__i64tos" else "__floatdisf", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__floatdisf, .{ .name = "__i64tos", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__floatdisf, .{ .name = "__floatdisf", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/floatundidf.zig b/lib/compiler_rt/floatundidf.zig index 2aa1c959d885386769f3a5c46bd682d6db2309cb..887ef83215943431098b12a172b071049a42429c 100644 --- a/lib/compiler_rt/floatundidf.zig +++ b/lib/compiler_rt/floatundidf.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_ul2d, .{ .name = "__aeabi_ul2d", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__floatundidf, .{ .name = if (common.want_windows_arm_abi) "__u64tod" else "__floatundidf", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__floatundidf, .{ .name = "__u64tod", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__floatundidf, .{ .name = "__floatundidf", .linkage = common.linkage, .visibility = common.visibility }); } } diff --git a/lib/compiler_rt/floatundisf.zig b/lib/compiler_rt/floatundisf.zig index 3f5b01a4e0720d633943178b8287d778d40167fd..8537779996ebc147a23f04ef92fd385161a14757 100644 --- a/lib/compiler_rt/floatundisf.zig +++ b/lib/compiler_rt/floatundisf.zig @@ -8,7 +8,10 @@ comptime { if (common.want_aeabi) { @export(&__aeabi_ul2f, .{ .name = "__aeabi_ul2f", .linkage = common.linkage, .visibility = common.visibility }); } else { - @export(&__floatundisf, .{ .name = if (common.want_windows_arm_abi) "__u64tos" else "__floatundisf", .linkage = common.linkage, .visibility = common.visibility }); + if (common.want_windows_arm_abi) { + @export(&__floatundisf, .{ .name = "__u64tos", .linkage = common.linkage, .visibility = common.visibility }); + } + @export(&__floatundisf, .{ .name = "__floatundisf", .linkage = common.linkage, .visibility = common.visibility }); } } -- 2.54.0