Skip to content

Commit bc589c2

Browse files
authored
Merge pull request #25924 from mlugg/legalize-soft-float
Legalize: implement soft-float legalizations
2 parents 1ebbdf8 + cd8fdd2 commit bc589c2

27 files changed

+1442
-99
lines changed

build.zig

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -678,14 +678,14 @@ fn addWasiUpdateStep(b: *std.Build, version: [:0]const u8) !void {
678678
});
679679
run_opt.addArtifactArg(exe);
680680
run_opt.addArg("-o");
681-
run_opt.addFileArg(b.path("stage1/zig1.wasm"));
681+
const optimized_wasm = run_opt.addOutputFileArg("zig1.wasm");
682682

683-
const copy_zig_h = b.addUpdateSourceFiles();
684-
copy_zig_h.addCopyFileToSource(b.path("lib/zig.h"), "stage1/zig.h");
683+
const update_zig1 = b.addUpdateSourceFiles();
684+
update_zig1.addCopyFileToSource(optimized_wasm, "stage1/zig1.wasm");
685+
update_zig1.addCopyFileToSource(b.path("lib/zig.h"), "stage1/zig.h");
685686

686687
const update_zig1_step = b.step("update-zig1", "Update stage1/zig1.wasm");
687-
update_zig1_step.dependOn(&run_opt.step);
688-
update_zig1_step.dependOn(&copy_zig_h.step);
688+
update_zig1_step.dependOn(&update_zig1.step);
689689
}
690690

691691
const AddCompilerModOptions = struct {

lib/compiler_rt/arm.zig

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ comptime {
1515
@export(&__aeabi_unwind_cpp_pr1, .{ .name = "__aeabi_unwind_cpp_pr1", .linkage = common.linkage, .visibility = common.visibility });
1616
@export(&__aeabi_unwind_cpp_pr2, .{ .name = "__aeabi_unwind_cpp_pr2", .linkage = common.linkage, .visibility = common.visibility });
1717

18-
@export(&__aeabi_ldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv64" else "__aeabi_ldivmod", .linkage = common.linkage, .visibility = common.visibility });
19-
@export(&__aeabi_uldivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_udiv64" else "__aeabi_uldivmod", .linkage = common.linkage, .visibility = common.visibility });
20-
21-
@export(&__aeabi_idivmod, .{ .name = if (common.want_windows_arm_abi) "__rt_sdiv" else "__aeabi_idivmod", .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 });
18+
if (common.want_windows_arm_abi) {
19+
@export(&__aeabi_ldivmod, .{ .name = "__rt_sdiv64", .linkage = common.linkage, .visibility = common.visibility });
20+
@export(&__aeabi_uldivmod, .{ .name = "__rt_udiv64", .linkage = common.linkage, .visibility = common.visibility });
21+
@export(&__aeabi_idivmod, .{ .name = "__rt_sdiv", .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 });
2328

2429
@export(&__aeabi_memcpy, .{ .name = "__aeabi_memcpy", .linkage = common.linkage, .visibility = common.visibility });
2530
@export(&__aeabi_memcpy4, .{ .name = "__aeabi_memcpy4", .linkage = common.linkage, .visibility = common.visibility });

lib/compiler_rt/aulldiv.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const common = @import("common.zig");
88
pub const panic = common.panic;
99

1010
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) {
1212
// Don't let LLVM apply the stdcall name mangling on those MSVC builtins
1313
@export(&_alldiv, .{ .name = "\x01__alldiv", .linkage = common.linkage, .visibility = common.visibility });
1414
@export(&_aulldiv, .{ .name = "\x01__aulldiv", .linkage = common.linkage, .visibility = common.visibility });

lib/compiler_rt/aullrem.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const common = @import("common.zig");
88
pub const panic = common.panic;
99

1010
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) {
1212
// Don't let LLVM apply the stdcall name mangling on those MSVC builtins
1313
@export(&_allrem, .{ .name = "\x01__allrem", .linkage = common.linkage, .visibility = common.visibility });
1414
@export(&_aullrem, .{ .name = "\x01__aullrem", .linkage = common.linkage, .visibility = common.visibility });

lib/compiler_rt/common.zig

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,30 @@ pub const want_aeabi = switch (builtin.abi) {
4848
else => false,
4949
};
5050

51-
/// These functions are provided by libc when targeting MSVC, but not MinGW.
52-
// Temporarily used for thumb-uefi until https://github.com/ziglang/zig/issues/21630 is addressed.
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);
51+
/// These functions are required on Windows on ARM. They are provided by MSVC libc, but in libc-less
52+
/// builds or when linking MinGW libc they are our responsibility.
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+
};
5463

55-
pub const want_windows_msvc_or_itanium_abi = switch (builtin.abi) {
56-
.none, .msvc, .itanium => builtin.os.tag == .windows,
57-
else => false,
64+
/// These functions are required by on Windows on x86 on some ABIs. They are provided by MSVC libc,
65+
/// but in libc-less builds they are our responsibility.
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;
5875
};
5976

6077
pub const want_ppc_abi = builtin.cpu.arch.isPowerPC();

lib/compiler_rt/fixdfdi.zig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ comptime {
88
if (common.want_aeabi) {
99
@export(&__aeabi_d2lz, .{ .name = "__aeabi_d2lz", .linkage = common.linkage, .visibility = common.visibility });
1010
} 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 });
1215
}
1316
}
1417

lib/compiler_rt/fixsfdi.zig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ comptime {
88
if (common.want_aeabi) {
99
@export(&__aeabi_f2lz, .{ .name = "__aeabi_f2lz", .linkage = common.linkage, .visibility = common.visibility });
1010
} 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 });
1215
}
1316
}
1417

lib/compiler_rt/fixunsdfdi.zig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ comptime {
88
if (common.want_aeabi) {
99
@export(&__aeabi_d2ulz, .{ .name = "__aeabi_d2ulz", .linkage = common.linkage, .visibility = common.visibility });
1010
} 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 });
1215
}
1316
}
1417

lib/compiler_rt/fixunssfdi.zig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ comptime {
88
if (common.want_aeabi) {
99
@export(&__aeabi_f2ulz, .{ .name = "__aeabi_f2ulz", .linkage = common.linkage, .visibility = common.visibility });
1010
} 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 });
1215
}
1316
}
1417

lib/compiler_rt/floatdidf.zig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ comptime {
88
if (common.want_aeabi) {
99
@export(&__aeabi_l2d, .{ .name = "__aeabi_l2d", .linkage = common.linkage, .visibility = common.visibility });
1010
} 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 });
1215
}
1316
}
1417

0 commit comments

Comments
 (0)