From 2c49a6c1909e7ea17af5fb7d43adef45d7125473 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 5 Dec 2022 14:52:21 -0700 Subject: [PATCH] compiler_rt: avoid using weak aliases This is a partial revert of 0d533433e21621177fb291e2a4901bee11834501, which regressed this behavior. The idea here is to avoid aliases, which happens when the same function is exported with multiple names. The problem with aliases is that weak aliases don't seem to work, causing symbol collisions when multiple of the same symbol are provided, despite the desired behavior that weak symbols are overridden. In this case we export redundant functions with different names. Thanks to -ffunction-sections, the unused functions will be garbage-collected at link time. This leaves us with the best of both worlds: Zig's compiler-rt will provide both sets of symbols, and it will be binary-compatible with different compilers that expect different names, while still resulting in binaries without garbage. --- lib/compiler_rt/extendhfsf2.zig | 6 +++++- lib/compiler_rt/truncsfhf2.zig | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/compiler_rt/extendhfsf2.zig b/lib/compiler_rt/extendhfsf2.zig index 0c204ec188..f019b42cb6 100644 --- a/lib/compiler_rt/extendhfsf2.zig +++ b/lib/compiler_rt/extendhfsf2.zig @@ -5,7 +5,7 @@ pub const panic = common.panic; comptime { if (common.gnu_f16_abi) { - @export(__extendhfsf2, .{ .name = "__gnu_h2f_ieee", .linkage = common.linkage }); + @export(__gnu_h2f_ieee, .{ .name = "__gnu_h2f_ieee", .linkage = common.linkage }); } else if (common.want_aeabi) { @export(__aeabi_h2f, .{ .name = "__aeabi_h2f", .linkage = common.linkage }); } @@ -16,6 +16,10 @@ pub fn __extendhfsf2(a: common.F16T) callconv(.C) f32 { return extendf(f32, f16, @bitCast(u16, a)); } +fn __gnu_h2f_ieee(a: common.F16T) callconv(.C) f32 { + return extendf(f32, f16, @bitCast(u16, a)); +} + fn __aeabi_h2f(a: u16) callconv(.AAPCS) f32 { return extendf(f32, f16, @bitCast(u16, a)); } diff --git a/lib/compiler_rt/truncsfhf2.zig b/lib/compiler_rt/truncsfhf2.zig index 010e257923..403306979c 100644 --- a/lib/compiler_rt/truncsfhf2.zig +++ b/lib/compiler_rt/truncsfhf2.zig @@ -5,7 +5,7 @@ pub const panic = common.panic; comptime { if (common.gnu_f16_abi) { - @export(__truncsfhf2, .{ .name = "__gnu_f2h_ieee", .linkage = common.linkage }); + @export(__gnu_f2h_ieee, .{ .name = "__gnu_f2h_ieee", .linkage = common.linkage }); } else if (common.want_aeabi) { @export(__aeabi_f2h, .{ .name = "__aeabi_f2h", .linkage = common.linkage }); } @@ -16,6 +16,10 @@ pub fn __truncsfhf2(a: f32) callconv(.C) common.F16T { return @bitCast(common.F16T, truncf(f16, f32, a)); } +fn __gnu_f2h_ieee(a: f32) callconv(.C) common.F16T { + return @bitCast(common.F16T, truncf(f16, f32, a)); +} + fn __aeabi_f2h(a: f32) callconv(.AAPCS) u16 { return @bitCast(common.F16T, truncf(f16, f32, a)); }