From 3997828a6176203b25b541c6e450f5e4bda82ce4 Mon Sep 17 00:00:00 2001 From: Alexander Slesarev Date: Sun, 31 Oct 2021 22:36:30 -0600 Subject: Added _LIBCPP_HAS_NO_THREADS for single_threaded binaries linked with libcxx. Fixed single-threaded mode for Windows. --- src/Compilation.zig | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/Compilation.zig') diff --git a/src/Compilation.zig b/src/Compilation.zig index 9126289804..3eb527b612 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1180,6 +1180,15 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { if (must_single_thread and !single_threaded) { return error.TargetRequiresSingleThreaded; } + if (!single_threaded and options.link_libcpp) { + if (options.target.cpu.arch.isARM()) { + log.warn( + \\libc++ does not work on multi-threaded ARM yet. + \\For more details: https://github.com/ziglang/zig/issues/6573 + , .{}); + return error.TargetRequiresSingleThreaded; + } + } const llvm_cpu_features: ?[*:0]const u8 = if (build_options.have_llvm and use_llvm) blk: { var buf = std.ArrayList(u8).init(arena); @@ -3803,6 +3812,10 @@ pub fn addCCArgs( try argv.append("-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS"); try argv.append("-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS"); try argv.append("-D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS"); + + if (comp.bin_file.options.single_threaded) { + try argv.append("-D_LIBCPP_HAS_NO_THREADS"); + } else {} } if (comp.bin_file.options.link_libunwind) { -- cgit v1.2.3 From 45415093c655d30ec226172695248fbf28941667 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 10 May 2022 16:38:37 -0700 Subject: reduce the scope of this branch * back out the changes to RunStep * move the disabled test to the .cpp code and avoid a confusing name-collision with the _LIBCPP macro prefix * fix merge conflict with the edits to the same test that ensure global initializers are called. Now this branch is only concerned with single-threaded targets and passing the correct macro defines to libc++. --- lib/std/build/RunStep.zig | 72 ------------------------------------ src/Compilation.zig | 2 +- test/standalone/c_compiler/build.zig | 40 +++++++------------- test/standalone/c_compiler/test.cpp | 18 ++++++++- 4 files changed, 31 insertions(+), 101 deletions(-) (limited to 'src/Compilation.zig') diff --git a/lib/std/build/RunStep.zig b/lib/std/build/RunStep.zig index 8cfbc3e89a..e00fe3deb6 100644 --- a/lib/std/build/RunStep.zig +++ b/lib/std/build/RunStep.zig @@ -1,7 +1,6 @@ const std = @import("../std.zig"); const builtin = @import("builtin"); const build = std.build; -const CrossTarget = std.zig.CrossTarget; const Step = build.Step; const Builder = build.Builder; const LibExeObjStep = build.LibExeObjStep; @@ -143,23 +142,6 @@ pub fn expectStdErrEqual(self: *RunStep, bytes: []const u8) void { self.stderr_action = .{ .expect_exact = self.builder.dupe(bytes) }; } -/// Returns true if the step could be run, otherwise false -pub fn isRunnable( - self: *RunStep, -) bool { - for (self.argv.items) |arg| { - switch (arg) { - .artifact => |artifact| { - _ = self.getExternalExecutor(artifact) catch { - return false; - }; - }, - else => {}, - } - } - return true; -} - pub fn expectStdOutEqual(self: *RunStep, bytes: []const u8) void { self.stdout_action = .{ .expect_exact = self.builder.dupe(bytes) }; } @@ -172,57 +154,6 @@ fn stdIoActionToBehavior(action: StdIoAction) std.ChildProcess.StdIo { }; } -fn getExternalExecutor(self: *RunStep, artifact: *LibExeObjStep) !?[]const u8 { - const need_cross_glibc = artifact.target.isGnuLibC() and artifact.is_linking_libc; - const executor = self.builder.host.getExternalExecutor(artifact.target_info, .{ - .qemu_fixes_dl = need_cross_glibc and self.builder.glibc_runtimes_dir != null, - .link_libc = artifact.is_linking_libc, - }); - switch (executor) { - .bad_dl, .bad_os_or_cpu => { - return error.NoExecutable; - }, - .native => { - return null; - }, - .rosetta => { - if (self.builder.enable_rosetta) { - return null; - } else { - return error.RosettaNotEnabled; - } - }, - .qemu => |bin_name| { - if (self.builder.enable_qemu) { - return bin_name; - } else { - return error.QemuNotEnabled; - } - }, - .wine => |bin_name| { - if (self.builder.enable_wine) { - return bin_name; - } else { - return error.WineNotEnabled; - } - }, - .wasmtime => |bin_name| { - if (self.builder.enable_wasmtime) { - return bin_name; - } else { - return error.WasmtimeNotEnabled; - } - }, - .darling => |bin_name| { - if (self.builder.enable_darling) { - return bin_name; - } else { - return error.DarlingNotEnabled; - } - }, - } -} - fn make(step: *Step) !void { const self = @fieldParentPtr(RunStep, "step", step); @@ -238,9 +169,6 @@ fn make(step: *Step) !void { // On Windows we don't have rpaths so we have to add .dll search paths to PATH self.addPathForDynLibs(artifact); } - if (try self.getExternalExecutor(artifact)) |executor| { - try argv_list.append(executor); - } const executable_path = artifact.installed_path orelse artifact.getOutputSource().getPath(self.builder); try argv_list.append(executable_path); }, diff --git a/src/Compilation.zig b/src/Compilation.zig index 3eb527b612..5e4ab0ec12 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -3815,7 +3815,7 @@ pub fn addCCArgs( if (comp.bin_file.options.single_threaded) { try argv.append("-D_LIBCPP_HAS_NO_THREADS"); - } else {} + } } if (comp.bin_file.options.link_libunwind) { diff --git a/test/standalone/c_compiler/build.zig b/test/standalone/c_compiler/build.zig index 5fb39d5a94..240d535182 100644 --- a/test/standalone/c_compiler/build.zig +++ b/test/standalone/c_compiler/build.zig @@ -1,21 +1,20 @@ const std = @import("std"); +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; + + 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 is_wine_enabled = b.option(bool, "enable-wine", "Use Wine to run cross compiled Windows tests") orelse false; - const is_qemu_enabled = b.option(bool, "enable-qemu", "Use QEMU to run cross compiled foreign architecture tests") orelse false; - const is_wasmtime_enabled = b.option(bool, "enable-wasmtime", "Use Wasmtime to enable and run WASI libstd tests") orelse false; - const is_darling_enabled = b.option(bool, "enable-darling", "[Experimental] Use Darling to run cross compiled macOS tests") orelse false; - const single_threaded = b.option(bool, "single-threaded", "Test single threaded mode") orelse false; - b.enable_wine = is_wine_enabled; - b.enable_qemu = is_qemu_enabled; - b.enable_wasmtime = is_wasmtime_enabled; - b.enable_darling = is_darling_enabled; - const test_step = b.step("test", "Test the program"); const exe_c = b.addExecutable("test_c", null); @@ -31,15 +30,8 @@ pub fn build(b: *Builder) void { exe_cpp.setBuildMode(mode); exe_cpp.setTarget(target); exe_cpp.linkLibCpp(); - exe_cpp.single_threaded = single_threaded; - const os_tag = target.getOsTag(); - // macos C++ exceptions could be compiled, but not being catched, - // additional support is required, possibly unwind + DWARF CFI - if (target.getCpuArch().isWasm() or os_tag == .macos) { - exe_cpp.defineCMacro("_LIBCPP_NO_EXCEPTIONS", null); - } - switch (os_tag) { + switch (target.getOsTag()) { .windows => { // https://github.com/ziglang/zig/issues/8531 exe_cpp.want_lto = false; @@ -52,17 +44,13 @@ pub fn build(b: *Builder) void { else => {}, } - const run_c_cmd = exe_c.run(); - if (run_c_cmd.isRunnable()) { + if (isRunnableTarget(target)) { + const run_c_cmd = exe_c.run(); test_step.dependOn(&run_c_cmd.step); - } else { - test_step.dependOn(&exe_c.step); - } - - const run_cpp_cmd = exe_cpp.run(); - if (run_cpp_cmd.isRunnable()) { + const run_cpp_cmd = exe_cpp.run(); test_step.dependOn(&run_cpp_cmd.step); } else { + test_step.dependOn(&exe_c.step); test_step.dependOn(&exe_cpp.step); } } diff --git a/test/standalone/c_compiler/test.cpp b/test/standalone/c_compiler/test.cpp index 71b0c05996..1f3fe173d2 100644 --- a/test/standalone/c_compiler/test.cpp +++ b/test/standalone/c_compiler/test.cpp @@ -30,13 +30,25 @@ private: int m_val; }; +class GlobalConstructorTest { +public: + GlobalConstructorTest(int val) : m_val(val) {}; + virtual ~GlobalConstructorTest() {} + + virtual int getVal() const { return m_val; } + virtual void printVal() { std::cout << "val=" << m_val << std::endl; } +private: + int m_val; +}; + volatile int runtime_val = 456; -CTest global(runtime_val); // test if global initializers are called. +GlobalConstructorTest global(runtime_val); // test if global initializers are called. int main (int argc, char *argv[]) { assert(global.getVal() == 456); + auto t = std::make_unique(123); assert(t->getVal() != 456); assert(tls_counter == 2); @@ -53,7 +65,9 @@ int main (int argc, char *argv[]) assert(ret); #endif -#ifndef _LIBCPP_NO_EXCEPTIONS +#if !defined(__wasm__) && !defined(__APPLE__) + // WASM and macOS are not passing this yet. + // TODO file an issue for this and link it here. try { throw 20; } catch (int e) { -- cgit v1.2.3