Commit 08c768ad82

Andrew Kelley <andrew@ziglang.org>
2021-11-16 00:32:15
pre-merge cleanups
* Annotate workarounds with their corresponding GitHub issue links. * Enable test coverage for LTO on Windows with the added c_compiler test.
1 parent 564629f
Changed files (4)
src
test
standalone
c_compiler
mix_c_files
src/mingw.zig
@@ -92,8 +92,10 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
                     "-D_WIN32_WINNT=0x0f00",
                     "-D__MSVCRT_VERSION__=0x700",
                 });
-                if (std.mem.eql(u8, dep, "tlssup.c")) {
-                    // Can't let LTO drop symbols defined in this file (eg: _tls_index)
+                if (std.mem.eql(u8, dep, "tlssup.c") and comp.bin_file.options.lto) {
+                    // LLD will incorrectly drop the `_tls_index` symbol. Here we work
+                    // around it by not using LTO for this one file.
+                    // https://github.com/ziglang/zig/issues/8531
                     try args.append("-fno-lto");
                 }
                 c_source_files[i] = .{
test/standalone/c_compiler/build.zig
@@ -3,6 +3,7 @@ const builtin = @import("builtin");
 const Builder = std.build.Builder;
 const CrossTarget = std.zig.CrossTarget;
 
+// TODO integrate this with the std.build executor API
 fn isRunnableTarget(t: CrossTarget) bool {
     if (t.isNative()) return true;
 
@@ -30,12 +31,9 @@ pub fn build(b: *Builder) void {
     exe_cpp.setTarget(target);
     exe_cpp.linkSystemLibrary("c++");
 
-    // disable broken LTO links:
     switch (target.getOsTag()) {
-        .windows => {
-            exe_cpp.want_lto = false;
-        },
         .macos => {
+            // https://github.com/ziglang/zig/issues/8680
             exe_cpp.want_lto = false;
             exe_c.want_lto = false;
         },
test/standalone/mix_c_files/build.zig
@@ -1,23 +1,20 @@
 const std = @import("std");
+const builtin = @import("builtin");
 const Builder = std.build.Builder;
 const CrossTarget = std.zig.CrossTarget;
 
-fn isUnpecifiedTarget(t: CrossTarget) bool {
-    return t.cpu_arch == null and t.abi == null and t.os_tag == null;
-}
+// TODO integrate this with the std.build executor API
 fn isRunnableTarget(t: CrossTarget) bool {
     if (t.isNative()) return true;
 
-    return (t.getOsTag() == std.Target.current.os.tag and
-        t.getCpuArch() == std.Target.current.cpu.arch);
+    return (t.getOsTag() == builtin.os.tag and
+        t.getCpuArch() == builtin.cpu.arch);
 }
 
 pub fn build(b: *Builder) void {
     const mode = b.standardReleaseOptions();
     const target = b.standardTargetOptions(.{});
 
-    const test_step = b.step("test", "Test the program");
-
     const exe = b.addExecutable("test", "main.zig");
     exe.addCSourceFile("test.c", &[_][]const u8{"-std=c11"});
     exe.setBuildMode(mode);
@@ -25,6 +22,7 @@ pub fn build(b: *Builder) void {
     exe.setTarget(target);
     b.default_step.dependOn(&exe.step);
 
+    const test_step = b.step("test", "Test the program");
     if (isRunnableTarget(target)) {
         const run_cmd = exe.run();
         test_step.dependOn(&run_cmd.step);
test/standalone.zig
@@ -13,18 +13,27 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
     cases.addBuildFile("test/standalone/main_pkg_path/build.zig", .{});
     cases.addBuildFile("test/standalone/shared_library/build.zig", .{});
     cases.addBuildFile("test/standalone/mix_o_files/build.zig", .{});
-    if (std.Target.current.os.tag == .macos) {
-        // TODO zld cannot link llvm-ir object files for LTO yet.
-        cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{ .build_modes = false, .cross_targets = true });
+    if (builtin.os.tag == .macos) {
+        // Zig's macOS linker does not yet support LTO for LLVM IR files:
+        // https://github.com/ziglang/zig/issues/8680
+        cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{
+            .build_modes = false,
+            .cross_targets = true,
+        });
     } else {
-        cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{ .build_modes = true, .cross_targets = true });
+        cases.addBuildFile("test/standalone/mix_c_files/build.zig", .{
+            .build_modes = true,
+            .cross_targets = true,
+        });
     }
     cases.addBuildFile("test/standalone/global_linkage/build.zig", .{});
     cases.addBuildFile("test/standalone/static_c_lib/build.zig", .{});
     cases.addBuildFile("test/standalone/link_interdependent_static_c_libs/build.zig", .{});
     cases.addBuildFile("test/standalone/link_static_lib_as_system_lib/build.zig", .{});
     cases.addBuildFile("test/standalone/link_common_symbols/build.zig", .{});
-    cases.addBuildFile("test/standalone/link_frameworks/build.zig", .{ .requires_macos_sdk = true });
+    cases.addBuildFile("test/standalone/link_frameworks/build.zig", .{
+        .requires_macos_sdk = true,
+    });
     cases.addBuildFile("test/standalone/issue_339/build.zig", .{});
     cases.addBuildFile("test/standalone/issue_8550/build.zig", .{});
     cases.addBuildFile("test/standalone/issue_794/build.zig", .{});
@@ -39,10 +48,14 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
     if (builtin.os.tag != .wasi) {
         cases.addBuildFile("test/standalone/load_dynamic_library/build.zig", .{});
     }
-    if (builtin.cpu.arch == .x86_64) { // TODO add C ABI support for other architectures
+    // C ABI compatibility issue: https://github.com/ziglang/zig/issues/1481
+    if (builtin.cpu.arch == .x86_64) {
         cases.addBuildFile("test/stage1/c_abi/build.zig", .{});
     }
-    cases.addBuildFile("test/standalone/c_compiler/build.zig", .{ .build_modes = true, .cross_targets = true });
+    cases.addBuildFile("test/standalone/c_compiler/build.zig", .{
+        .build_modes = true,
+        .cross_targets = true,
+    });
 
     if (builtin.os.tag == .windows) {
         cases.addC("test/standalone/issue_9402/main.zig");
@@ -52,7 +65,10 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
         cases.addBuildFile("test/standalone/pie/build.zig", .{});
     }
     // Try to build and run an Objective-C executable.
-    cases.addBuildFile("test/standalone/objc/build.zig", .{ .build_modes = true, .requires_macos_sdk = true });
+    cases.addBuildFile("test/standalone/objc/build.zig", .{
+        .build_modes = true,
+        .requires_macos_sdk = true,
+    });
 
     // Ensure the development tools are buildable.
     cases.add("tools/gen_spirv_spec.zig");