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 {...@@ -92,6 +92,12 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
92 "-D_WIN32_WINNT=0x0f00",92 "-D_WIN32_WINNT=0x0f00",
93 "-D__MSVCRT_VERSION__=0x700",93 "-D__MSVCRT_VERSION__=0x700",
94 });94 });
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 }
95 c_source_files[i] = .{101 c_source_files[i] = .{
96 .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{102 .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
97 "libc", "mingw", "crt", dep,103 "libc", "mingw", "crt", dep,
test/standalone.zig+26-4
...@@ -13,12 +13,27 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -13,12 +13,27 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
13 cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});13 cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});
14 cases.addBuildFile("test/standalone/shared_library/build.zig", .{});14 cases.addBuildFile("test/standalone/shared_library/build.zig", .{});
15 cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{});15 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 }
16 cases.addBuildFile("test/standalone/global_linkage/build.zig", .{});29 cases.addBuildFile("test/standalone/global_linkage/build.zig", .{});
17 cases.addBuildFile("test/standalone/static_c_lib/build.zig", .{});30 cases.addBuildFile("test/standalone/static_c_lib/build.zig", .{});
18 cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig", .{});31 cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig", .{});
19 cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig", .{});32 cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig", .{});
20 cases.addBuildFile("test/standalone/link_common_symbols/build.zig", .{});33 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 });
22 cases.addBuildFile("test/standalone/issue_339/build.zig", .{});37 cases.addBuildFile("test/standalone/issue_339/build.zig", .{});
23 cases.addBuildFile("test/standalone/issue_8550/build.zig", .{});38 cases.addBuildFile("test/standalone/issue_8550/build.zig", .{});
24 cases.addBuildFile("test/standalone/issue_794/build.zig", .{});39 cases.addBuildFile("test/standalone/issue_794/build.zig", .{});
...@@ -33,10 +48,14 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -33,10 +48,14 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
33 if (builtin.os.tag != .wasi) {48 if (builtin.os.tag != .wasi) {
34 cases.addBuildFile("test/standalone/load_dynamic_library/build.zig", .{});49 cases.addBuildFile("test/standalone/load_dynamic_library/build.zig", .{});
35 }50 }
36 if (builtin.cpu.arch == .x86_64) { // TODO add C ABI support for other architectures51 // C ABI compatibility issue: https://github.com/ziglang/zig/issues/1481
52 if (builtin.cpu.arch == .x86_64) {
37 cases.addBuildFile("test/stage1/c_abi/build.zig", .{});53 cases.addBuildFile("test/stage1/c_abi/build.zig", .{});
38 }54 }
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
41 if (builtin.os.tag == .windows) {60 if (builtin.os.tag == .windows) {
42 cases.addC("test/standalone/issue_9402/main.zig");61 cases.addC("test/standalone/issue_9402/main.zig");
...@@ -46,7 +65,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {...@@ -46,7 +65,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
46 cases.addBuildFile("test/standalone/pie/build.zig", .{});65 cases.addBuildFile("test/standalone/pie/build.zig", .{});
47 }66 }
48 // Try to build and run an Objective-C executable.67 // 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
51 // Ensure the development tools are buildable.73 // Ensure the development tools are buildable.
52 cases.add("tools/gen_spirv_spec.zig");74 cases.add("tools/gen_spirv_spec.zig");
test/standalone/c_compiler/build.zig+2-4
...@@ -3,6 +3,7 @@ const builtin = @import("builtin");...@@ -3,6 +3,7 @@ const builtin = @import("builtin");
3const Builder = std.build.Builder;3const Builder = std.build.Builder;
4const CrossTarget = std.zig.CrossTarget;4const CrossTarget = std.zig.CrossTarget;
55
6// TODO integrate this with the std.build executor API
6fn isRunnableTarget(t: CrossTarget) bool {7fn isRunnableTarget(t: CrossTarget) bool {
7 if (t.isNative()) return true;8 if (t.isNative()) return true;
89
...@@ -30,12 +31,9 @@ pub fn build(b: *Builder) void {...@@ -30,12 +31,9 @@ pub fn build(b: *Builder) void {
30 exe_cpp.setTarget(target);31 exe_cpp.setTarget(target);
31 exe_cpp.linkSystemLibrary("c++");32 exe_cpp.linkSystemLibrary("c++");
3233
33 // disable broken LTO links:
34 switch (target.getOsTag()) {34 switch (target.getOsTag()) {
35 .windows => {
36 exe_cpp.want_lto = false;
37 },
38 .macos => {35 .macos => {
36 // https://github.com/ziglang/zig/issues/8680
39 exe_cpp.want_lto = false;37 exe_cpp.want_lto = false;
40 exe_c.want_lto = false;38 exe_c.want_lto = false;
41 },39 },
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; }