authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-11-15 18:34:52-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-11-15 18:34:52-05:00
log39c0d8bd2c2bd048da6ea1821c6c46aa60fa2907
tree8dd79b588a3b7a20a8589a4fd08a11881a8ff35c
parent33889e1974137a54d1a88b87f57462de2a7cc145
parent08c768ad82280463410eacc5b7f19389cb1ba49b
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #8674 from xxxbxxx/master

build: workaround link error with LTO and mingw

6 files changed, 104 insertions(+), 8 deletions(-)

src/mingw.zig+6
......@@ -92,6 +92,12 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
9292 "-D_WIN32_WINNT=0x0f00",
9393 "-D__MSVCRT_VERSION__=0x700",
9494 });
95 if (std.mem.eql(u8, dep, "tlssup.c") and comp.bin_file.options.lto) {
96 // LLD will incorrectly drop the `_tls_index` symbol. Here we work
97 // around it by not using LTO for this one file.
98 // https://github.com/ziglang/zig/issues/8531
99 try args.append("-fno-lto");
100 }
95101 c_source_files[i] = .{
96102 .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
97103 "libc", "mingw", "crt", dep,
test/standalone.zig+26-4
......@@ -13,12 +13,27 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
1313 cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});
1414 cases.addBuildFile("test/standalone/shared_library/build.zig", .{});
1515 cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{});
16 if (builtin.os.tag == .macos) {
17 // Zig's macOS linker does not yet support LTO for LLVM IR files:
18 // https://github.com/ziglang/zig/issues/8680
19 cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{
20 .build_modes = false,
21 .cross_targets = true,
22 });
23 } else {
24 cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{
25 .build_modes = true,
26 .cross_targets = true,
27 });
28 }
1629 cases.addBuildFile("test/standalone/global_linkage/build.zig", .{});
1730 cases.addBuildFile("test/standalone/static_c_lib/build.zig", .{});
1831 cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig", .{});
1932 cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig", .{});
2033 cases.addBuildFile("test/standalone/link_common_symbols/build.zig", .{});
21 cases.addBuildFile("test/standalone/link_frameworks/build.zig", .{ .requires_macos_sdk = true });
34 cases.addBuildFile("test/standalone/link_frameworks/build.zig", .{
35 .requires_macos_sdk = true,
36 });
2237 cases.addBuildFile("test/standalone/issue_339/build.zig", .{});
2338 cases.addBuildFile("test/standalone/issue_8550/build.zig", .{});
2439 cases.addBuildFile("test/standalone/issue_794/build.zig", .{});
......@@ -33,10 +48,14 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
3348 if (builtin.os.tag != .wasi) {
3449 cases.addBuildFile("test/standalone/load_dynamic_library/build.zig", .{});
3550 }
36 if (builtin.cpu.arch == .x86_64) { // TODO add C ABI support for other architectures
51 // C ABI compatibility issue: https://github.com/ziglang/zig/issues/1481
52 if (builtin.cpu.arch == .x86_64) {
3753 cases.addBuildFile("test/stage1/c_abi/build.zig", .{});
3854 }
39 cases.addBuildFile("test/standalone/c_compiler/build.zig", .{ .build_modes = true, .cross_targets = true });
55 cases.addBuildFile("test/standalone/c_compiler/build.zig", .{
56 .build_modes = true,
57 .cross_targets = true,
58 });
4059
4160 if (builtin.os.tag == .windows) {
4261 cases.addC("test/standalone/issue_9402/main.zig");
......@@ -46,7 +65,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
4665 cases.addBuildFile("test/standalone/pie/build.zig", .{});
4766 }
4867 // Try to build and run an Objective-C executable.
49 cases.addBuildFile("test/standalone/objc/build.zig", .{ .build_modes = true, .requires_macos_sdk = true });
68 cases.addBuildFile("test/standalone/objc/build.zig", .{
69 .build_modes = true,
70 .requires_macos_sdk = true,
71 });
5072
5173 // Ensure the development tools are buildable.
5274 cases.add("tools/gen_spirv_spec.zig");
test/standalone/c_compiler/build.zig+2-4
......@@ -3,6 +3,7 @@ const builtin = @import("builtin");
33const Builder = std.build.Builder;
44const CrossTarget = std.zig.CrossTarget;
55
6// TODO integrate this with the std.build executor API
67fn isRunnableTarget(t: CrossTarget) bool {
78 if (t.isNative()) return true;
89
......@@ -30,12 +31,9 @@ pub fn build(b: *Builder) void {
3031 exe_cpp.setTarget(target);
3132 exe_cpp.linkSystemLibrary("c++");
3233
33 // disable broken LTO links:
3434 switch (target.getOsTag()) {
35 .windows => {
36 exe_cpp.want_lto = false;
37 },
3835 .macos => {
36 // https://github.com/ziglang/zig/issues/8680
3937 exe_cpp.want_lto = false;
4038 exe_c.want_lto = false;
4139 },
test/standalone/mix_c_files/build.zig created+32
......@@ -0,0 +1,32 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const Builder = std.build.Builder;
4const CrossTarget = std.zig.CrossTarget;
5
6// TODO integrate this with the std.build executor API
7fn isRunnableTarget(t: CrossTarget) bool {
8 if (t.isNative()) return true;
9
10 return (t.getOsTag() == builtin.os.tag and
11 t.getCpuArch() == builtin.cpu.arch);
12}
13
14pub fn build(b: *Builder) void {
15 const mode = b.standardReleaseOptions();
16 const target = b.standardTargetOptions(.{});
17
18 const exe = b.addExecutable("test", "main.zig");
19 exe.addCSourceFile("test.c", &[_][]const u8{"-std=c11"});
20 exe.setBuildMode(mode);
21 exe.linkLibC();
22 exe.setTarget(target);
23 b.default_step.dependOn(&exe.step);
24
25 const test_step = b.step("test", "Test the program");
26 if (isRunnableTarget(target)) {
27 const run_cmd = exe.run();
28 test_step.dependOn(&run_cmd.step);
29 } else {
30 test_step.dependOn(&exe.step);
31 }
32}
test/standalone/mix_c_files/main.zig created+30
......@@ -0,0 +1,30 @@
1const std = @import("std");
2
3extern fn add_C(x: i32) i32;
4extern fn add_C_zig(x: i32) i32;
5extern threadlocal var C_k: c_int;
6
7export var zig_k: c_int = 1;
8export fn add_zig(x: i32) i32 {
9 return x + zig_k + C_k;
10}
11export fn add_may_panic(x: i32) i32 {
12 if (x < 0) @panic("negative int");
13 return x + zig_k;
14}
15
16pub fn main() anyerror!void {
17 var x: i32 = 0;
18 x = add_zig(x);
19 x = add_C(x);
20 x = add_C_zig(x);
21
22 C_k = 200;
23 zig_k = 2;
24 x = add_zig(x);
25 x = add_C(x);
26 x = add_C_zig(x);
27
28 const u = @intCast(u32, x);
29 try std.testing.expect(u / 100 == u % 100);
30}
test/standalone/mix_c_files/test.c created+8
......@@ -0,0 +1,8 @@
1
2extern int zig_k;
3extern int add_may_panic(int);
4
5_Thread_local int C_k = 100;
6int unused(int x) { return x*x; }
7int add_C(int x) { return x+zig_k+C_k; }
8int add_C_zig(int x) { return add_may_panic(x) + C_k; }