authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-20 15:37:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-20 15:37:58-07:00
log1d94a6893689ad1fb8e06308ae51603a6c8708a8
tree4adb4cbf5e6764df65747fb3bae2c1640060eb89
parent10d30838d1887a8585e79ad7a680d3067674c9d9

add an option to compile zig in single-threaded mode

And enable it for Drone CI. I hate to do this, but I need to make progress on other fronts.

5 files changed, 29 insertions(+), 6 deletions(-)

CMakeLists.txt+10
......@@ -75,6 +75,7 @@ set(ZIG_TARGET_TRIPLE "native" CACHE STRING "arch-os-abi to output binaries for"
7575set(ZIG_TARGET_MCPU "baseline" CACHE STRING "-mcpu parameter to output binaries for")
7676set(ZIG_EXECUTABLE "" CACHE STRING "(when cross compiling) path to already-built zig binary")
7777set(ZIG_PREFER_LLVM_CONFIG off CACHE BOOL "(when cross compiling) use llvm-config to find target llvm dependencies if needed")
78set(ZIG_SINGLE_THREADED off CACHE BOOL "limit the zig compiler to use only 1 thread")
7879
7980find_package(llvm)
8081find_package(clang)
......@@ -510,10 +511,13 @@ set(ZIG_STAGE2_SOURCES
510511 "${CMAKE_SOURCE_DIR}/src/Cache.zig"
511512 "${CMAKE_SOURCE_DIR}/src/Compilation.zig"
512513 "${CMAKE_SOURCE_DIR}/src/DepTokenizer.zig"
514 "${CMAKE_SOURCE_DIR}/src/Event.zig"
513515 "${CMAKE_SOURCE_DIR}/src/Module.zig"
514516 "${CMAKE_SOURCE_DIR}/src/Package.zig"
515517 "${CMAKE_SOURCE_DIR}/src/RangeSet.zig"
518 "${CMAKE_SOURCE_DIR}/src/ThreadPool.zig"
516519 "${CMAKE_SOURCE_DIR}/src/TypedValue.zig"
520 "${CMAKE_SOURCE_DIR}/src/WaitGroup.zig"
517521 "${CMAKE_SOURCE_DIR}/src/astgen.zig"
518522 "${CMAKE_SOURCE_DIR}/src/clang.zig"
519523 "${CMAKE_SOURCE_DIR}/src/clang_options.zig"
......@@ -713,6 +717,11 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
713717else()
714718 set(ZIG1_RELEASE_ARG -OReleaseFast --strip)
715719endif()
720if(ZIG_SINGLE_THREADED)
721 set(ZIG1_SINGLE_THREADED_ARG "--single-threaded")
722else()
723 set(ZIG1_SINGLE_THREADED_ARG "")
724endif()
716725
717726set(BUILD_ZIG1_ARGS
718727 "src/stage1.zig"
......@@ -722,6 +731,7 @@ set(BUILD_ZIG1_ARGS
722731 --override-lib-dir "${CMAKE_SOURCE_DIR}/lib"
723732 "-femit-bin=${ZIG1_OBJECT}"
724733 "${ZIG1_RELEASE_ARG}"
734 "${ZIG1_SINGLE_THREADED_ARG}"
725735 -lc
726736 --pkg-begin build_options "${ZIG_CONFIG_ZIG_OUT}"
727737 --pkg-end
ci/drone/linux_script+2-1
......@@ -17,7 +17,8 @@ git config core.abbrev 9
1717
1818mkdir build
1919cd build
20cmake .. -DCMAKE_BUILD_TYPE=Release "-DCMAKE_INSTALL_PREFIX=$DISTDIR" -DZIG_STATIC=ON -DCMAKE_PREFIX_PATH=/deps/local -GNinja
20# TODO figure out why Drone CI is deadlocking and stop passing -DZIG_SINGLE_THREADED=ON
21cmake .. -DCMAKE_BUILD_TYPE=Release "-DCMAKE_INSTALL_PREFIX=$DISTDIR" -DZIG_STATIC=ON -DCMAKE_PREFIX_PATH=/deps/local -GNinja -DZIG_SINGLE_THREADED=ON
2122
2223samu install
2324./zig build test -Dskip-release -Dskip-non-native
src/Compilation.zig+7-5
......@@ -1728,7 +1728,7 @@ fn workerUpdateCObject(
17281728 error.AnalysisFail => return,
17291729 else => {
17301730 {
1731 var lock = comp.mutex.acquire();
1731 const lock = comp.mutex.acquire();
17321732 defer lock.release();
17331733 comp.failed_c_objects.ensureCapacity(comp.gpa, comp.failed_c_objects.items().len + 1) catch {
17341734 fatal("TODO handle this by setting c_object.status = oom failure", .{});
......@@ -1759,7 +1759,7 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_comp_progress_node: *
17591759
17601760 if (c_object.clearStatus(comp.gpa)) {
17611761 // There was previous failure.
1762 var lock = comp.mutex.acquire();
1762 const lock = comp.mutex.acquire();
17631763 defer lock.release();
17641764 comp.failed_c_objects.removeAssertDiscard(c_object);
17651765 }
......@@ -1789,10 +1789,12 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_comp_progress_node: *
17891789
17901790 {
17911791 const is_collision = blk: {
1792 var lock = comp.mutex.acquire();
1792 const bin_digest = man.hash.peekBin();
1793
1794 const lock = comp.mutex.acquire();
17931795 defer lock.release();
17941796
1795 const gop = try comp.c_object_cache_digest_set.getOrPut(comp.gpa, man.hash.peekBin());
1797 const gop = try comp.c_object_cache_digest_set.getOrPut(comp.gpa, bin_digest);
17961798 break :blk gop.found_existing;
17971799 };
17981800 if (is_collision) {
......@@ -2211,7 +2213,7 @@ fn failCObj(comp: *Compilation, c_object: *CObject, comptime format: []const u8,
22112213
22122214fn failCObjWithOwnedErrorMsg(comp: *Compilation, c_object: *CObject, err_msg: *ErrorMsg) InnerError {
22132215 {
2214 var lock = comp.mutex.acquire();
2216 const lock = comp.mutex.acquire();
22152217 defer lock.release();
22162218 {
22172219 errdefer err_msg.destroy(comp.gpa);
src/ThreadPool.zig+6
......@@ -25,6 +25,8 @@ pub fn init(self: *ThreadPool, allocator: *std.mem.Allocator) !void {
2525 .allocator = allocator,
2626 .threads = &[_]*std.Thread{},
2727 };
28 if (std.builtin.single_threaded)
29 return;
2830
2931 errdefer self.deinit();
3032
......@@ -67,6 +69,10 @@ pub fn shutdown(self: *ThreadPool) void {
6769}
6870
6971pub fn spawn(self: *ThreadPool, comptime func: anytype, args: anytype) !void {
72 if (std.builtin.single_threaded) {
73 @call(.{}, func, args);
74 return;
75 }
7076 const Args = @TypeOf(args);
7177 const Closure = struct {
7278 arguments: Args,
src/stage1/zig0.cpp+4
......@@ -266,6 +266,7 @@ int main(int argc, char **argv) {
266266 TargetSubsystem subsystem = TargetSubsystemAuto;
267267 const char *override_lib_dir = nullptr;
268268 const char *mcpu = nullptr;
269 bool single_threaded = false;
269270
270271 for (int i = 1; i < argc; i += 1) {
271272 char *arg = argv[i];
......@@ -281,6 +282,8 @@ int main(int argc, char **argv) {
281282 optimize_mode = BuildModeSafeRelease;
282283 } else if (strcmp(arg, "-OReleaseSmall") == 0) {
283284 optimize_mode = BuildModeSmallRelease;
285 } else if (strcmp(arg, "--single-threaded") == 0) {
286 single_threaded = true;
284287 } else if (strcmp(arg, "--help") == 0) {
285288 return print_full_usage(arg0, stdout, EXIT_SUCCESS);
286289 } else if (strcmp(arg, "--strip") == 0) {
......@@ -469,6 +472,7 @@ int main(int argc, char **argv) {
469472 stage1->link_libcpp = link_libcpp;
470473 stage1->subsystem = subsystem;
471474 stage1->pic = true;
475 stage1->is_single_threaded = single_threaded;
472476
473477 zig_stage1_build_object(stage1);
474478