aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-05-28 19:27:14 -0400
committerGitHub <noreply@github.com>2024-05-28 19:27:14 -0400
commit963ffe9d572e6da4ef22672af9b7c54150f66b27 (patch)
tree950c39722d71cdd6f2af75c255ee92a318cda516 /src
parent759c2211c2eba44cccf0608267bf1a05934ad8a1 (diff)
parent3a3d2187f986066859cfb793fb7ee1cae4dfea08 (diff)
downloadzig-963ffe9d572e6da4ef22672af9b7c54150f66b27.tar.gz
zig-963ffe9d572e6da4ef22672af9b7c54150f66b27.zip
Merge pull request #20059 from ziglang/progress
rework std.Progress
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig116
-rw-r--r--src/Module.zig39
-rw-r--r--src/Package/Fetch.zig14
-rw-r--r--src/glibc.zig6
-rw-r--r--src/libcxx.zig4
-rw-r--r--src/libtsan.zig2
-rw-r--r--src/libunwind.zig2
-rw-r--r--src/link.zig8
-rw-r--r--src/link/C.zig7
-rw-r--r--src/link/Coff.zig7
-rw-r--r--src/link/Coff/lld.zig6
-rw-r--r--src/link/Elf.zig13
-rw-r--r--src/link/MachO.zig7
-rw-r--r--src/link/NvPtx.zig4
-rw-r--r--src/link/Plan9.zig7
-rw-r--r--src/link/SpirV.zig11
-rw-r--r--src/link/SpirV/deduplicate.zig5
-rw-r--r--src/link/SpirV/lower_invocation_globals.zig5
-rw-r--r--src/link/SpirV/prune_unused.zig5
-rw-r--r--src/link/Wasm.zig13
-rw-r--r--src/main.zig211
-rw-r--r--src/mingw.zig6
-rw-r--r--src/musl.zig2
-rw-r--r--src/wasi_libc.zig2
24 files changed, 187 insertions, 315 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 03b981812e..507cbfc6d5 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -1273,8 +1273,8 @@ pub fn create(gpa: Allocator, arena: Allocator, options: CreateOptions) !*Compil
if (options.verbose_llvm_cpu_features) {
if (options.root_mod.resolved_target.llvm_cpu_features) |cf| print: {
const target = options.root_mod.resolved_target.result;
- std.debug.getStderrMutex().lock();
- defer std.debug.getStderrMutex().unlock();
+ std.debug.lockStdErr();
+ defer std.debug.unlockStdErr();
const stderr = std.io.getStdErr().writer();
nosuspend {
stderr.print("compilation: {s}\n", .{options.root_name}) catch break :print;
@@ -1934,7 +1934,7 @@ pub fn getTarget(self: Compilation) Target {
/// Only legal to call when cache mode is incremental and a link file is present.
pub fn hotCodeSwap(
comp: *Compilation,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
pid: std.process.Child.Id,
) !void {
const lf = comp.bin_file.?;
@@ -1966,7 +1966,7 @@ fn cleanupAfterUpdate(comp: *Compilation) void {
}
/// Detect changes to source files, perform semantic analysis, and update the output files.
-pub fn update(comp: *Compilation, main_progress_node: *std.Progress.Node) !void {
+pub fn update(comp: *Compilation, main_progress_node: std.Progress.Node) !void {
const tracy_trace = trace(@src());
defer tracy_trace.end();
@@ -2256,7 +2256,7 @@ pub fn update(comp: *Compilation, main_progress_node: *std.Progress.Node) !void
}
}
-fn flush(comp: *Compilation, arena: Allocator, prog_node: *std.Progress.Node) !void {
+fn flush(comp: *Compilation, arena: Allocator, prog_node: std.Progress.Node) !void {
if (comp.bin_file) |lf| {
// This is needed before reading the error flags.
lf.flush(arena, prog_node) catch |err| switch (err) {
@@ -2566,13 +2566,11 @@ pub fn emitLlvmObject(
default_emit: Emit,
bin_emit_loc: ?EmitLoc,
llvm_object: *LlvmObject,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) !void {
if (build_options.only_c) @compileError("unreachable");
- var sub_prog_node = prog_node.start("LLVM Emit Object", 0);
- sub_prog_node.activate();
- sub_prog_node.context.refresh();
+ const sub_prog_node = prog_node.start("LLVM Emit Object", 0);
defer sub_prog_node.end();
try llvm_object.emit(.{
@@ -3249,32 +3247,20 @@ pub fn addZirErrorMessages(eb: *ErrorBundle.Wip, file: *Module.File) !void {
pub fn performAllTheWork(
comp: *Compilation,
- main_progress_node: *std.Progress.Node,
+ main_progress_node: std.Progress.Node,
) error{ TimerUnsupported, OutOfMemory }!void {
// Here we queue up all the AstGen tasks first, followed by C object compilation.
// We wait until the AstGen tasks are all completed before proceeding to the
// (at least for now) single-threaded main work queue. However, C object compilation
// only needs to be finished by the end of this function.
- var zir_prog_node = main_progress_node.start("AST Lowering", 0);
- defer zir_prog_node.end();
-
- var wasm_prog_node = main_progress_node.start("Compile Autodocs", 0);
- defer wasm_prog_node.end();
-
- var c_obj_prog_node = main_progress_node.start("Compile C Objects", comp.c_source_files.len);
- defer c_obj_prog_node.end();
-
- var win32_resource_prog_node = main_progress_node.start("Compile Win32 Resources", comp.rc_source_files.len);
- defer win32_resource_prog_node.end();
-
comp.work_queue_wait_group.reset();
defer comp.work_queue_wait_group.wait();
if (!build_options.only_c and !build_options.only_core_functionality) {
if (comp.docs_emit != null) {
comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerDocsCopy, .{comp});
- comp.work_queue_wait_group.spawnManager(workerDocsWasm, .{ comp, &wasm_prog_node });
+ comp.work_queue_wait_group.spawnManager(workerDocsWasm, .{ comp, main_progress_node });
}
}
@@ -3282,6 +3268,9 @@ pub fn performAllTheWork(
const astgen_frame = tracy.namedFrame("astgen");
defer astgen_frame.end();
+ const zir_prog_node = main_progress_node.start("AST Lowering", 0);
+ defer zir_prog_node.end();
+
comp.astgen_wait_group.reset();
defer comp.astgen_wait_group.wait();
@@ -3313,7 +3302,7 @@ pub fn performAllTheWork(
while (comp.astgen_work_queue.readItem()) |file| {
comp.thread_pool.spawnWg(&comp.astgen_wait_group, workerAstGenFile, .{
- comp, file, &zir_prog_node, &comp.astgen_wait_group, .root,
+ comp, file, zir_prog_node, &comp.astgen_wait_group, .root,
});
}
@@ -3325,14 +3314,14 @@ pub fn performAllTheWork(
while (comp.c_object_work_queue.readItem()) |c_object| {
comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerUpdateCObject, .{
- comp, c_object, &c_obj_prog_node,
+ comp, c_object, main_progress_node,
});
}
if (!build_options.only_core_functionality) {
while (comp.win32_resource_work_queue.readItem()) |win32_resource| {
comp.thread_pool.spawnWg(&comp.work_queue_wait_group, workerUpdateWin32Resource, .{
- comp, win32_resource, &win32_resource_prog_node,
+ comp, win32_resource, main_progress_node,
});
}
}
@@ -3342,11 +3331,13 @@ pub fn performAllTheWork(
try reportMultiModuleErrors(mod);
try mod.flushRetryableFailures();
mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);
- mod.sema_prog_node.activate();
+ mod.codegen_prog_node = main_progress_node.start("Code Generation", 0);
}
defer if (comp.module) |mod| {
mod.sema_prog_node.end();
mod.sema_prog_node = undefined;
+ mod.codegen_prog_node.end();
+ mod.codegen_prog_node = undefined;
};
while (true) {
@@ -3379,7 +3370,7 @@ pub fn performAllTheWork(
}
}
-fn processOneJob(comp: *Compilation, job: Job, prog_node: *std.Progress.Node) !void {
+fn processOneJob(comp: *Compilation, job: Job, prog_node: std.Progress.Node) !void {
switch (job) {
.codegen_decl => |decl_index| {
const module = comp.module.?;
@@ -3803,7 +3794,10 @@ fn docsCopyModule(comp: *Compilation, module: *Package.Module, name: []const u8,
}
}
-fn workerDocsWasm(comp: *Compilation, prog_node: *std.Progress.Node) void {
+fn workerDocsWasm(comp: *Compilation, parent_prog_node: std.Progress.Node) void {
+ const prog_node = parent_prog_node.start("Compile Autodocs", 0);
+ defer prog_node.end();
+
workerDocsWasmFallible(comp, prog_node) catch |err| {
comp.lockAndSetMiscFailure(.docs_wasm, "unable to build autodocs: {s}", .{
@errorName(err),
@@ -3811,7 +3805,7 @@ fn workerDocsWasm(comp: *Compilation, prog_node: *std.Progress.Node) void {
};
}
-fn workerDocsWasmFallible(comp: *Compilation, prog_node: *std.Progress.Node) anyerror!void {
+fn workerDocsWasmFallible(comp: *Compilation, prog_node: std.Progress.Node) anyerror!void {
const gpa = comp.gpa;
var arena_allocator = std.heap.ArenaAllocator.init(gpa);
@@ -3952,12 +3946,11 @@ const AstGenSrc = union(enum) {
fn workerAstGenFile(
comp: *Compilation,
file: *Module.File,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
wg: *WaitGroup,
src: AstGenSrc,
) void {
- var child_prog_node = prog_node.start(file.sub_file_path, 0);
- child_prog_node.activate();
+ const child_prog_node = prog_node.start(file.sub_file_path, 0);
defer child_prog_node.end();
const mod = comp.module.?;
@@ -4265,7 +4258,7 @@ pub fn cImport(comp: *Compilation, c_src: []const u8, owner_mod: *Package.Module
fn workerUpdateCObject(
comp: *Compilation,
c_object: *CObject,
- progress_node: *std.Progress.Node,
+ progress_node: std.Progress.Node,
) void {
comp.updateCObject(c_object, progress_node) catch |err| switch (err) {
error.AnalysisFail => return,
@@ -4282,7 +4275,7 @@ fn workerUpdateCObject(
fn workerUpdateWin32Resource(
comp: *Compilation,
win32_resource: *Win32Resource,
- progress_node: *std.Progress.Node,
+ progress_node: std.Progress.Node,
) void {
comp.updateWin32Resource(win32_resource, progress_node) catch |err| switch (err) {
error.AnalysisFail => return,
@@ -4300,7 +4293,7 @@ fn buildCompilerRtOneShot(
comp: *Compilation,
output_mode: std.builtin.OutputMode,
out: *?CRTFile,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) void {
comp.buildOutputFromZig(
"compiler_rt.zig",
@@ -4427,7 +4420,7 @@ fn reportRetryableEmbedFileError(
}
}
-fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.Progress.Node) !void {
+fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: std.Progress.Node) !void {
if (comp.config.c_frontend == .aro) {
return comp.failCObj(c_object, "aro does not support compiling C objects yet", .{});
}
@@ -4467,9 +4460,7 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P
const c_source_basename = std.fs.path.basename(c_object.src.src_path);
- c_obj_prog_node.activate();
- var child_progress_node = c_obj_prog_node.start(c_source_basename, 0);
- child_progress_node.activate();
+ const child_progress_node = c_obj_prog_node.start(c_source_basename, 0);
defer child_progress_node.end();
// Special case when doing build-obj for just one C file. When there are more than one object
@@ -4731,7 +4722,7 @@ fn updateCObject(comp: *Compilation, c_object: *CObject, c_obj_prog_node: *std.P
};
}
-fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32_resource_prog_node: *std.Progress.Node) !void {
+fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32_resource_prog_node: std.Progress.Node) !void {
if (!std.process.can_spawn) {
return comp.failWin32Resource(win32_resource, "{s} does not support spawning a child process", .{@tagName(builtin.os.tag)});
}
@@ -4763,9 +4754,7 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32
_ = comp.failed_win32_resources.swapRemove(win32_resource);
}
- win32_resource_prog_node.activate();
- var child_progress_node = win32_resource_prog_node.start(src_basename, 0);
- child_progress_node.activate();
+ const child_progress_node = win32_resource_prog_node.start(src_basename, 0);
defer child_progress_node.end();
var man = comp.obtainWin32ResourceCacheManifest();
@@ -4833,7 +4822,7 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32
});
try argv.appendSlice(&.{ "--", in_rc_path, out_res_path });
- try spawnZigRc(comp, win32_resource, src_basename, arena, argv.items, &child_progress_node);
+ try spawnZigRc(comp, win32_resource, arena, argv.items, child_progress_node);
break :blk digest;
};
@@ -4901,7 +4890,7 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32
try argv.appendSlice(rc_src.extra_flags);
try argv.appendSlice(&.{ "--", rc_src.src_path, out_res_path });
- try spawnZigRc(comp, win32_resource, src_basename, arena, argv.items, &child_progress_node);
+ try spawnZigRc(comp, win32_resource, arena, argv.items, child_progress_node);
// Read depfile and update cache manifest
{
@@ -4966,10 +4955,9 @@ fn updateWin32Resource(comp: *Compilation, win32_resource: *Win32Resource, win32
fn spawnZigRc(
comp: *Compilation,
win32_resource: *Win32Resource,
- src_basename: []const u8,
arena: Allocator,
argv: []const []const u8,
- child_progress_node: *std.Progress.Node,
+ child_progress_node: std.Progress.Node,
) !void {
var node_name: std.ArrayListUnmanaged(u8) = .{};
defer node_name.deinit(arena);
@@ -4978,6 +4966,7 @@ fn spawnZigRc(
child.stdin_behavior = .Ignore;
child.stdout_behavior = .Pipe;
child.stderr_behavior = .Pipe;
+ child.progress_node = child_progress_node;
child.spawn() catch |err| {
return comp.failWin32Resource(win32_resource, "unable to spawn {s} rc: {s}", .{ argv[0], @errorName(err) });
@@ -5019,22 +5008,6 @@ fn spawnZigRc(
};
return comp.failWin32ResourceWithOwnedBundle(win32_resource, error_bundle);
},
- .progress => {
- node_name.clearRetainingCapacity();
- // <resinator> is a special string that indicates that the child
- // process has reached resinator's main function
- if (std.mem.eql(u8, body, "<resinator>")) {
- child_progress_node.setName(src_basename);
- }
- // Ignore 0-length strings since if multiple zig rc commands
- // are executed at the same time, only one will send progress strings
- // while the other(s) will send empty strings.
- else if (body.len > 0) {
- try node_name.appendSlice(arena, "build 'zig rc'... ");
- try node_name.appendSlice(arena, body);
- child_progress_node.setName(node_name.items);
- }
- },
else => {}, // ignore other messages
}
@@ -5937,8 +5910,8 @@ pub fn lockAndParseLldStderr(comp: *Compilation, prefix: []const u8, stderr: []c
}
pub fn dump_argv(argv: []const []const u8) void {
- std.debug.getStderrMutex().lock();
- defer std.debug.getStderrMutex().unlock();
+ std.debug.lockStdErr();
+ defer std.debug.unlockStdErr();
const stderr = std.io.getStdErr().writer();
for (argv[0 .. argv.len - 1]) |arg| {
nosuspend stderr.print("{s} ", .{arg}) catch return;
@@ -5989,14 +5962,13 @@ pub fn updateSubCompilation(
parent_comp: *Compilation,
sub_comp: *Compilation,
misc_task: MiscTask,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) !void {
{
- var sub_node = prog_node.start(@tagName(misc_task), 0);
- sub_node.activate();
+ const sub_node = prog_node.start(@tagName(misc_task), 0);
defer sub_node.end();
- try sub_comp.update(prog_node);
+ try sub_comp.update(sub_node);
}
// Look for compilation errors in this sub compilation
@@ -6024,7 +5996,7 @@ fn buildOutputFromZig(
output_mode: std.builtin.OutputMode,
out: *?CRTFile,
misc_task_tag: MiscTask,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) !void {
const tracy_trace = trace(@src());
defer tracy_trace.end();
@@ -6131,7 +6103,7 @@ pub fn build_crt_file(
root_name: []const u8,
output_mode: std.builtin.OutputMode,
misc_task_tag: MiscTask,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
/// These elements have to get mutated to add the owner module after it is
/// created within this function.
c_source_files: []CSourceFile,
diff --git a/src/Module.zig b/src/Module.zig
index c571c851fe..ef410fad4e 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -66,6 +66,7 @@ root_mod: *Package.Module,
main_mod: *Package.Module,
std_mod: *Package.Module,
sema_prog_node: std.Progress.Node = undefined,
+codegen_prog_node: std.Progress.Node = undefined,
/// Used by AstGen worker to load and store ZIR cache.
global_zir_cache: Compilation.Directory,
@@ -2942,11 +2943,12 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
const tracy = trace(@src());
defer tracy.end();
+ const ip = &mod.intern_pool;
const decl = mod.declPtr(decl_index);
log.debug("ensureDeclAnalyzed '{d}' (name '{}')", .{
@intFromEnum(decl_index),
- decl.name.fmt(&mod.intern_pool),
+ decl.name.fmt(ip),
});
// Determine whether or not this Decl is outdated, i.e. requires re-analysis
@@ -2991,10 +2993,6 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
try mod.deleteDeclExports(decl_index);
}
- var decl_prog_node = mod.sema_prog_node.start("", 0);
- decl_prog_node.activate();
- defer decl_prog_node.end();
-
const sema_result: SemaDeclResult = blk: {
if (decl.zir_decl_index == .none and !mod.declIsRoot(decl_index)) {
// Anonymous decl. We don't semantically analyze these.
@@ -3012,6 +3010,9 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
};
}
+ const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(mod)).toSlice(ip), 0);
+ defer decl_prog_node.end();
+
break :blk mod.semaDecl(decl_index) catch |err| switch (err) {
error.AnalysisFail => {
if (decl.analysis == .in_progress) {
@@ -3215,6 +3216,9 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In
};
}
+ const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(zcu)).toSlice(ip), 0);
+ defer codegen_prog_node.end();
+
if (comp.bin_file) |lf| {
lf.updateFunc(zcu, func_index, air, liveness) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
@@ -4500,6 +4504,9 @@ pub fn analyzeFnBody(mod: *Module, func_index: InternPool.Index, arena: Allocato
log.debug("finish func name '{}'", .{(decl.fullyQualifiedName(mod) catch break :blk).fmt(ip)});
}
+ const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(mod)).toSlice(ip), 0);
+ defer decl_prog_node.end();
+
mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .func = func_index }));
var comptime_err_ret_trace = std.ArrayList(SrcLoc).init(gpa);
@@ -5316,7 +5323,7 @@ fn handleUpdateExports(
pub fn populateTestFunctions(
mod: *Module,
- main_progress_node: *std.Progress.Node,
+ main_progress_node: std.Progress.Node,
) !void {
const gpa = mod.gpa;
const ip = &mod.intern_pool;
@@ -5333,13 +5340,13 @@ pub fn populateTestFunctions(
// We have to call `ensureDeclAnalyzed` here in case `builtin.test_functions`
// was not referenced by start code.
mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);
- mod.sema_prog_node.activate();
defer {
mod.sema_prog_node.end();
mod.sema_prog_node = undefined;
}
try mod.ensureDeclAnalyzed(decl_index);
}
+
const decl = mod.declPtr(decl_index);
const test_fn_ty = decl.typeOf(mod).slicePtrFieldType(mod).childType(mod);
@@ -5440,21 +5447,32 @@ pub fn populateTestFunctions(
decl.val = new_val;
decl.has_tv = true;
}
- try mod.linkerUpdateDecl(decl_index);
+ {
+ mod.codegen_prog_node = main_progress_node.start("Code Generation", 0);
+ defer {
+ mod.codegen_prog_node.end();
+ mod.codegen_prog_node = undefined;
+ }
+
+ try mod.linkerUpdateDecl(decl_index);
+ }
}
pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {
const comp = zcu.comp;
+ const decl = zcu.declPtr(decl_index);
+
+ const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(zcu)).toSlice(&zcu.intern_pool), 0);
+ defer codegen_prog_node.end();
+
if (comp.bin_file) |lf| {
lf.updateDecl(zcu, decl_index) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
- const decl = zcu.declPtr(decl_index);
decl.analysis = .codegen_failure;
},
else => {
- const decl = zcu.declPtr(decl_index);
const gpa = zcu.gpa;
try zcu.failed_decls.ensureUnusedCapacity(gpa, 1);
zcu.failed_decls.putAssumeCapacityNoClobber(decl_index, try ErrorMsg.create(
@@ -5472,7 +5490,6 @@ pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {
llvm_object.updateDecl(zcu, decl_index) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
- const decl = zcu.declPtr(decl_index);
decl.analysis = .codegen_failure;
},
};
diff --git a/src/Package/Fetch.zig b/src/Package/Fetch.zig
index 97cbd36bd0..6528c2a53f 100644
--- a/src/Package/Fetch.zig
+++ b/src/Package/Fetch.zig
@@ -35,7 +35,7 @@ name_tok: std.zig.Ast.TokenIndex,
lazy_status: LazyStatus,
parent_package_root: Cache.Path,
parent_manifest_ast: ?*const std.zig.Ast,
-prog_node: *std.Progress.Node,
+prog_node: std.Progress.Node,
job_queue: *JobQueue,
/// If true, don't add an error for a missing hash. This flag is not passed
/// down to recursive dependencies. It's intended to be used only be the CLI.
@@ -720,8 +720,7 @@ fn queueJobsForDeps(f: *Fetch) RunError!void {
};
}
- // job_queue mutex is locked so this is OK.
- f.prog_node.unprotected_estimated_total_items += new_fetch_index;
+ f.prog_node.increaseEstimatedTotalItems(new_fetch_index);
break :nf .{ new_fetches[0..new_fetch_index], prog_names[0..new_fetch_index] };
};
@@ -751,9 +750,8 @@ pub fn relativePathDigest(
}
pub fn workerRun(f: *Fetch, prog_name: []const u8) void {
- var prog_node = f.prog_node.start(prog_name, 0);
+ const prog_node = f.prog_node.start(prog_name, 0);
defer prog_node.end();
- prog_node.activate();
run(f) catch |err| switch (err) {
error.OutOfMemory => f.oom_flag = true,
@@ -1311,9 +1309,8 @@ fn unpackGitPack(f: *Fetch, out_dir: fs.Dir, resource: *Resource) anyerror!Unpac
var index_file = try pack_dir.createFile("pkg.idx", .{ .read = true });
defer index_file.close();
{
- var index_prog_node = f.prog_node.start("Index pack", 0);
+ const index_prog_node = f.prog_node.start("Index pack", 0);
defer index_prog_node.end();
- index_prog_node.activate();
var index_buffered_writer = std.io.bufferedWriter(index_file.writer());
try git.indexPack(gpa, pack_file, index_buffered_writer.writer());
try index_buffered_writer.flush();
@@ -1321,9 +1318,8 @@ fn unpackGitPack(f: *Fetch, out_dir: fs.Dir, resource: *Resource) anyerror!Unpac
}
{
- var checkout_prog_node = f.prog_node.start("Checkout", 0);
+ const checkout_prog_node = f.prog_node.start("Checkout", 0);
defer checkout_prog_node.end();
- checkout_prog_node.activate();
var repository = try git.Repository.init(gpa, pack_file, index_file);
defer repository.deinit();
var diagnostics: git.Diagnostics = .{ .allocator = arena };
diff --git a/src/glibc.zig b/src/glibc.zig
index 5ec0442d6a..6474a23dce 100644
--- a/src/glibc.zig
+++ b/src/glibc.zig
@@ -160,7 +160,7 @@ pub const CRTFile = enum {
libc_nonshared_a,
};
-pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: *std.Progress.Node) !void {
+pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: std.Progress.Node) !void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
@@ -658,7 +658,7 @@ pub const BuiltSharedObjects = struct {
const all_map_basename = "all.map";
-pub fn buildSharedObjects(comp: *Compilation, prog_node: *std.Progress.Node) !void {
+pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !void {
const tracy = trace(@src());
defer tracy.end();
@@ -1065,7 +1065,7 @@ fn buildSharedLib(
bin_directory: Compilation.Directory,
asm_file_basename: []const u8,
lib: Lib,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) !void {
const tracy = trace(@src());
defer tracy.end();
diff --git a/src/libcxx.zig b/src/libcxx.zig
index b1b2014cb5..1c48f77527 100644
--- a/src/libcxx.zig
+++ b/src/libcxx.zig
@@ -113,7 +113,7 @@ pub const BuildError = error{
ZigCompilerNotBuiltWithLLVMExtensions,
};
-pub fn buildLibCXX(comp: *Compilation, prog_node: *std.Progress.Node) BuildError!void {
+pub fn buildLibCXX(comp: *Compilation, prog_node: std.Progress.Node) BuildError!void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
@@ -357,7 +357,7 @@ pub fn buildLibCXX(comp: *Compilation, prog_node: *std.Progress.Node) BuildError
comp.libcxx_static_lib = try sub_compilation.toCrtFile();
}
-pub fn buildLibCXXABI(comp: *Compilation, prog_node: *std.Progress.Node) BuildError!void {
+pub fn buildLibCXXABI(comp: *Compilation, prog_node: std.Progress.Node) BuildError!void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
diff --git a/src/libtsan.zig b/src/libtsan.zig
index 28dba65772..1aa32e6ff0 100644
--- a/src/libtsan.zig
+++ b/src/libtsan.zig
@@ -13,7 +13,7 @@ pub const BuildError = error{
TSANUnsupportedCPUArchitecture,
};
-pub fn buildTsan(comp: *Compilation, prog_node: *std.Progress.Node) BuildError!void {
+pub fn buildTsan(comp: *Compilation, prog_node: std.Progress.Node) BuildError!void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
diff --git a/src/libunwind.zig b/src/libunwind.zig
index 808ea298ab..7783876827 100644
--- a/src/libunwind.zig
+++ b/src/libunwind.zig
@@ -14,7 +14,7 @@ pub const BuildError = error{
ZigCompilerNotBuiltWithLLVMExtensions,
};
-pub fn buildStaticLib(comp: *Compilation, prog_node: *std.Progress.Node) BuildError!void {
+pub fn buildStaticLib(comp: *Compilation, prog_node: std.Progress.Node) BuildError!void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
diff --git a/src/link.zig b/src/link.zig
index c05b545a89..ef09639dcf 100644
--- a/src/link.zig
+++ b/src/link.zig
@@ -535,7 +535,7 @@ pub const File = struct {
/// Commit pending changes and write headers. Takes into account final output mode
/// and `use_lld`, not only `effectiveOutputMode`.
/// `arena` has the lifetime of the call to `Compilation.update`.
- pub fn flush(base: *File, arena: Allocator, prog_node: *std.Progress.Node) FlushError!void {
+ pub fn flush(base: *File, arena: Allocator, prog_node: std.Progress.Node) FlushError!void {
if (build_options.only_c) {
assert(base.tag == .c);
return @as(*C, @fieldParentPtr("base", base)).flush(arena, prog_node);
@@ -572,7 +572,7 @@ pub const File = struct {
/// Commit pending changes and write headers. Works based on `effectiveOutputMode`
/// rather than final output mode.
- pub fn flushModule(base: *File, arena: Allocator, prog_node: *std.Progress.Node) FlushError!void {
+ pub fn flushModule(base: *File, arena: Allocator, prog_node: std.Progress.Node) FlushError!void {
switch (base.tag) {
inline else => |tag| {
if (tag != .c and build_options.only_c) unreachable;
@@ -688,7 +688,7 @@ pub const File = struct {
}
}
- pub fn linkAsArchive(base: *File, arena: Allocator, prog_node: *std.Progress.Node) FlushError!void {
+ pub fn linkAsArchive(base: *File, arena: Allocator, prog_node: std.Progress.Node) FlushError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -966,7 +966,7 @@ pub const File = struct {
base: File,
arena: Allocator,
llvm_object: *LlvmObject,
- prog_node: *std.Progress.Node,
+ prog_node: std.Progress.Node,
) !void {
return base.comp.emitLlvmObject(arena, base.emit, .{
.directory = null,
diff --git a/src/link/C.zig b/src/link/C.zig
index 07814c9e71..305af40156 100644
--- a/src/link/C.zig
+++ b/src/link/C.zig
@@ -370,7 +370,7 @@ pub fn updateDeclLineNumber(self: *C, zcu: *Zcu, decl_index: InternPool.DeclInde
_ = decl_index;
}
-pub fn flush(self: *C, arena: Allocator, prog_node: *std.Progress.Node) !void {
+pub fn flush(self: *C, arena: Allocator, prog_node: std.Progress.Node) !void {
return self.flushModule(arena, prog_node);
}
@@ -389,14 +389,13 @@ fn abiDefines(self: *C, target: std.Target) !std.ArrayList(u8) {
return defines;
}
-pub fn flushModule(self: *C, arena: Allocator, prog_node: *std.Progress.Node) !void {
+pub fn flushModule(self: *C, arena: Allocator, prog_node: std.Progress.Node) !void {
_ = arena; // Has the same lifetime as the call to Compilation.update.
const tracy = trace(@src());
defer tracy.end();
- var sub_prog_node = prog_node.start("Flush Module", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("Flush Module", 0);
defer sub_prog_node.end();
const comp = self.base.comp;
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index 31cfe1ca9d..d24d69d913 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -1702,7 +1702,7 @@ fn resolveGlobalSymbol(self: *Coff, current: SymbolWithLoc) !void {
gop.value_ptr.* = current;
}
-pub fn flush(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *Coff, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const comp = self.base.comp;
const use_lld = build_options.have_llvm and comp.config.use_lld;
if (use_lld) {
@@ -1714,7 +1714,7 @@ pub fn flush(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node) link.
}
}
-pub fn flushModule(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *Coff, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -1726,8 +1726,7 @@ pub fn flushModule(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node)
return;
}
- var sub_prog_node = prog_node.start("COFF Flush", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("COFF Flush", 0);
defer sub_prog_node.end();
const module = comp.module orelse return error.LinkingWithoutZigSourceUnimplemented;
diff --git a/src/link/Coff/lld.zig b/src/link/Coff/lld.zig
index 47753cbf01..c2620c1fe9 100644
--- a/src/link/Coff/lld.zig
+++ b/src/link/Coff/lld.zig
@@ -16,7 +16,7 @@ const Allocator = mem.Allocator;
const Coff = @import("../Coff.zig");
const Compilation = @import("../../Compilation.zig");
-pub fn linkWithLLD(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node) !void {
+pub fn linkWithLLD(self: *Coff, arena: Allocator, prog_node: std.Progress.Node) !void {
const tracy = trace(@src());
defer tracy.end();
@@ -38,9 +38,7 @@ pub fn linkWithLLD(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node)
}
} else null;
- var sub_prog_node = prog_node.start("LLD Link", 0);
- sub_prog_node.activate();
- sub_prog_node.context.refresh();
+ const sub_prog_node = prog_node.start("LLD Link", 0);
defer sub_prog_node.end();
const is_lib = comp.config.output_mode == .Lib;
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 8a3192f93e..eb27b4449e 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -1064,7 +1064,7 @@ pub fn markDirty(self: *Elf, shdr_index: u32) void {
}
}
-pub fn flush(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *Elf, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const use_lld = build_options.have_llvm and self.base.comp.config.use_lld;
if (use_lld) {
return self.linkWithLLD(arena, prog_node);
@@ -1072,7 +1072,7 @@ pub fn flush(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) link.F
try self.flushModule(arena, prog_node);
}
-pub fn flushModule(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *Elf, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -1085,8 +1085,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node)
if (use_lld) return;
}
- var sub_prog_node = prog_node.start("ELF Flush", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("ELF Flush", 0);
defer sub_prog_node.end();
const target = comp.root_mod.resolved_target.result;
@@ -2147,7 +2146,7 @@ fn scanRelocs(self: *Elf) !void {
}
}
-fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !void {
+fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: std.Progress.Node) !void {
const tracy = trace(@src());
defer tracy.end();
@@ -2169,9 +2168,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi
}
} else null;
- var sub_prog_node = prog_node.start("LLD Link", 0);
- sub_prog_node.activate();
- sub_prog_node.context.refresh();
+ const sub_prog_node = prog_node.start("LLD Link", 0);
defer sub_prog_node.end();
const output_mode = comp.config.output_mode;
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 7bf195f5f9..947a2665de 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -360,11 +360,11 @@ pub fn deinit(self: *MachO) void {
self.unwind_records.deinit(gpa);
}
-pub fn flush(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *MachO, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
try self.flushModule(arena, prog_node);
}
-pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *MachO, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -375,8 +375,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
try self.base.emitLlvmObject(arena, llvm_object, prog_node);
}
- var sub_prog_node = prog_node.start("MachO Flush", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("MachO Flush", 0);
defer sub_prog_node.end();
const directory = self.base.emit.directory;
diff --git a/src/link/NvPtx.zig b/src/link/NvPtx.zig
index 111b59fc3b..8e1ebc9726 100644
--- a/src/link/NvPtx.zig
+++ b/src/link/NvPtx.zig
@@ -106,11 +106,11 @@ pub fn freeDecl(self: *NvPtx, decl_index: InternPool.DeclIndex) void {
return self.llvm_object.freeDecl(decl_index);
}
-pub fn flush(self: *NvPtx, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *NvPtx, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
return self.flushModule(arena, prog_node);
}
-pub fn flushModule(self: *NvPtx, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *NvPtx, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
if (build_options.skip_non_native)
@panic("Attempted to compile for architecture that was disabled by build configuration");
diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig
index a45142a12e..328d669b58 100644
--- a/src/link/Plan9.zig
+++ b/src/link/Plan9.zig
@@ -604,7 +604,7 @@ fn allocateGotIndex(self: *Plan9) usize {
}
}
-pub fn flush(self: *Plan9, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *Plan9, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const comp = self.base.comp;
const use_lld = build_options.have_llvm and comp.config.use_lld;
assert(!use_lld);
@@ -663,7 +663,7 @@ fn atomCount(self: *Plan9) usize {
return data_decl_count + fn_decl_count + unnamed_const_count + lazy_atom_count + extern_atom_count + anon_atom_count;
}
-pub fn flushModule(self: *Plan9, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *Plan9, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
if (build_options.skip_non_native and builtin.object_format != .plan9) {
@panic("Attempted to compile for object format that was disabled by build configuration");
}
@@ -677,8 +677,7 @@ pub fn flushModule(self: *Plan9, arena: Allocator, prog_node: *std.Progress.Node
const tracy = trace(@src());
defer tracy.end();
- var sub_prog_node = prog_node.start("Flush Module", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("Flush Module", 0);
defer sub_prog_node.end();
log.debug("flushModule", .{});
diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig
index 27c905cc61..0cc238f140 100644
--- a/src/link/SpirV.zig
+++ b/src/link/SpirV.zig
@@ -193,11 +193,11 @@ pub fn freeDecl(self: *SpirV, decl_index: InternPool.DeclIndex) void {
_ = decl_index;
}
-pub fn flush(self: *SpirV, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(self: *SpirV, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
return self.flushModule(arena, prog_node);
}
-pub fn flushModule(self: *SpirV, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(self: *SpirV, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
if (build_options.skip_non_native) {
@panic("Attempted to compile for architecture that was disabled by build configuration");
}
@@ -205,8 +205,7 @@ pub fn flushModule(self: *SpirV, arena: Allocator, prog_node: *std.Progress.Node
const tracy = trace(@src());
defer tracy.end();
- var sub_prog_node = prog_node.start("Flush Module", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("Flush Module", 0);
defer sub_prog_node.end();
const spv = &self.object.spv;
@@ -253,7 +252,7 @@ pub fn flushModule(self: *SpirV, arena: Allocator, prog_node: *std.Progress.Node
const module = try spv.finalize(arena, target);
errdefer arena.free(module);
- const linked_module = self.linkModule(arena, module, &sub_prog_node) catch |err| switch (err) {
+ const linked_module = self.linkModule(arena, module, sub_prog_node) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
else => |other| {
log.err("error while linking: {s}\n", .{@errorName(other)});
@@ -264,7 +263,7 @@ pub fn flushModule(self: *SpirV, arena: Allocator, prog_node: *std.Progress.Node
try self.base.file.?.writeAll(std.mem.sliceAsBytes(linked_module));
}
-fn linkModule(self: *SpirV, a: Allocator, module: []Word, progress: *std.Progress.Node) ![]Word {
+fn linkModule(self: *SpirV, a: Allocator, module: []Word, progress: std.Progress.Node) ![]Word {
_ = self;
const lower_invocation_globals = @import("SpirV/lower_invocation_globals.zig");
diff --git a/src/link/SpirV/deduplicate.zig b/src/link/SpirV/deduplicate.zig
index 4cf5ebf65a..292ff0e868 100644
--- a/src/link/SpirV/deduplicate.zig
+++ b/src/link/SpirV/deduplicate.zig
@@ -418,9 +418,8 @@ const EntityHashContext = struct {
}
};
-pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: *std.Progress.Node) !void {
- var sub_node = progress.start("deduplicate", 0);
- sub_node.activate();
+pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: std.Progress.Node) !void {
+ const sub_node = progress.start("deduplicate", 0);
defer sub_node.end();
var arena = std.heap.ArenaAllocator.init(parser.a);
diff --git a/src/link/SpirV/lower_invocation_globals.zig b/src/link/SpirV/lower_invocation_globals.zig
index ee992112c8..edf16a7cd8 100644
--- a/src/link/SpirV/lower_invocation_globals.zig
+++ b/src/link/SpirV/lower_invocation_globals.zig
@@ -682,9 +682,8 @@ const ModuleBuilder = struct {
}
};
-pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: *std.Progress.Node) !void {
- var sub_node = progress.start("Lower invocation globals", 6);
- sub_node.activate();
+pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: std.Progress.Node) !void {
+ const sub_node = progress.start("Lower invocation globals", 6);
defer sub_node.end();
var arena = std.heap.ArenaAllocator.init(parser.a);
diff --git a/src/link/SpirV/prune_unused.zig b/src/link/SpirV/prune_unused.zig
index cefdaddd93..a604d62349 100644
--- a/src/link/SpirV/prune_unused.zig
+++ b/src/link/SpirV/prune_unused.zig
@@ -255,9 +255,8 @@ fn removeIdsFromMap(a: Allocator, map: anytype, info: ModuleInfo, alive_marker:
}
}
-pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: *std.Progress.Node) !void {
- var sub_node = progress.start("Prune unused IDs", 0);
- sub_node.activate();
+pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: std.Progress.Node) !void {
+ const sub_node = progress.start("Prune unused IDs", 0);
defer sub_node.end();
var arena = std.heap.ArenaAllocator.init(parser.a);
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index bf345813df..da6425326b 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -2464,7 +2464,7 @@ fn appendDummySegment(wasm: *Wasm) !void {
});
}
-pub fn flush(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flush(wasm: *Wasm, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const comp = wasm.base.comp;
const use_lld = build_options.have_llvm and comp.config.use_lld;
@@ -2475,7 +2475,7 @@ pub fn flush(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) link.
}
/// Uses the in-house linker to link one or multiple object -and archive files into a WebAssembly binary.
-pub fn flushModule(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) link.File.FlushError!void {
+pub fn flushModule(wasm: *Wasm, arena: Allocator, prog_node: std.Progress.Node) link.File.FlushError!void {
const tracy = trace(@src());
defer tracy.end();
@@ -2486,8 +2486,7 @@ pub fn flushModule(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node)
if (use_lld) return;
}
- var sub_prog_node = prog_node.start("Wasm Flush", 0);
- sub_prog_node.activate();
+ const sub_prog_node = prog_node.start("Wasm Flush", 0);
defer sub_prog_node.end();
const directory = wasm.base.emit.directory; // Just an alias to make it shorter to type.
@@ -3323,7 +3322,7 @@ fn emitImport(wasm: *Wasm, writer: anytype, import: types.Import) !void {
}
}
-fn linkWithLLD(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) !void {
+fn linkWithLLD(wasm: *Wasm, arena: Allocator, prog_node: std.Progress.Node) !void {
const tracy = trace(@src());
defer tracy.end();
@@ -3350,9 +3349,7 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) !vo
}
} else null;
- var sub_prog_node = prog_node.start("LLD Link", 0);
- sub_prog_node.activate();
- sub_prog_node.context.refresh();
+ const sub_prog_node = prog_node.start("LLD Link", 0);
defer sub_prog_node.end();
const is_obj = comp.config.output_mode == .Obj;
diff --git a/src/main.zig b/src/main.zig
index 099ceb27f9..22349dd36a 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -3404,11 +3404,16 @@ fn buildOutputType(
},
}
+ const root_prog_node = std.Progress.start(.{
+ .disable_printing = (color == .off),
+ });
+ defer root_prog_node.end();
+
if (arg_mode == .translate_c) {
- return cmdTranslateC(comp, arena, null);
+ return cmdTranslateC(comp, arena, null, root_prog_node);
}
- updateModule(comp, color) catch |err| switch (err) {
+ updateModule(comp, color, root_prog_node) catch |err| switch (err) {
error.SemanticAnalyzeFail => {
assert(listen == .none);
saveState(comp, debug_incremental);
@@ -4028,22 +4033,7 @@ fn serve(
var child_pid: ?std.process.Child.Id = null;
- var progress: std.Progress = .{
- .terminal = null,
- .root = .{
- .context = undefined,
- .parent = null,
- .name = "",
- .unprotected_estimated_total_items = 0,
- .unprotected_completed_items = 0,
- },
- .columns_written = 0,
- .prev_refresh_timestamp = 0,
- .timer = null,
- .done = false,
- };
- const main_progress_node = &progress.root;
- main_progress_node.context = &progress;
+ const main_progress_node = std.Progress.start(.{});
while (true) {
const hdr = try server.receiveMessage();
@@ -4051,7 +4041,6 @@ fn serve(
switch (hdr.tag) {
.exit => return cleanExit(),
.update => {
- assert(main_progress_node.recently_updated_child == null);
tracy.frameMark();
if (arg_mode == .translate_c) {
@@ -4059,7 +4048,7 @@ fn serve(
defer arena_instance.deinit();
const arena = arena_instance.allocator();
var output: Compilation.CImportResult = undefined;
- try cmdTranslateC(comp, arena, &output);
+ try cmdTranslateC(comp, arena, &output, main_progress_node);
defer output.deinit(gpa);
if (output.errors.errorMessageCount() != 0) {
try server.serveErrorBundle(output.errors);
@@ -4075,21 +4064,7 @@ fn serve(
try comp.makeBinFileWritable();
}
- if (builtin.single_threaded) {
- try comp.update(main_progress_node);
- } else {
- var reset: std.Thread.ResetEvent = .{};
-
- var progress_thread = try std.Thread.spawn(.{}, progressThread, .{
- &progress, &server, &reset,
- });
- defer {
- reset.set();
- progress_thread.join();
- }
-
- try comp.update(main_progress_node);
- }
+ try comp.update(main_progress_node);
try comp.makeBinFileExecutable();
try serveUpdateResults(&server, comp);
@@ -4116,7 +4091,6 @@ fn serve(
},
.hot_update => {
tracy.frameMark();
- assert(main_progress_node.recently_updated_child == null);
if (child_pid) |pid| {
try comp.hotCodeSwap(main_progress_node, pid);
try serveUpdateResults(&server, comp);
@@ -4146,63 +4120,6 @@ fn serve(
}
}
-fn progressThread(progress: *std.Progress, server: *const Server, reset: *std.Thread.ResetEvent) void {
- while (true) {
- if (reset.timedWait(500 * std.time.ns_per_ms)) |_| {
- // The Compilation update has completed.
- return;
- } else |err| switch (err) {
- error.Timeout => {},
- }
-
- var buf: std.BoundedArray(u8, 160) = .{};
-
- {
- progress.update_mutex.lock();
- defer progress.update_mutex.unlock();
-
- var need_ellipse = false;
- var maybe_node: ?*std.Progress.Node = &progress.root;
- while (maybe_node) |node| {
- if (need_ellipse) {
- buf.appendSlice("... ") catch {};
- }
- need_ellipse = false;
- const eti = @atomicLoad(usize, &node.unprotected_estimated_total_items, .monotonic);
- const completed_items = @atomicLoad(usize, &node.unprotected_completed_items, .monotonic);
- const current_item = completed_items + 1;
- if (node.name.len != 0 or eti > 0) {
- if (node.name.len != 0) {
- buf.appendSlice(node.name) catch {};
- need_ellipse = true;
- }
- if (eti > 0) {
- if (need_ellipse) buf.appendSlice(" ") catch {};
- buf.writer().print("[{d}/{d}] ", .{ current_item, eti }) catch {};
- need_ellipse = false;
- } else if (completed_items != 0) {
- if (need_ellipse) buf.appendSlice(" ") catch {};
- buf.writer().print("[{d}] ", .{current_item}) catch {};
- need_ellipse = false;
- }
- }
- maybe_node = @atomicLoad(?*std.Progress.Node, &node.recently_updated_child, .acquire);
- }
- }
-
- const progress_string = buf.slice();
-
- server.serveMessage(.{
- .tag = .progress,
- .bytes_len = @as(u32, @intCast(progress_string.len)),
- }, &.{
- progress_string,
- }) catch |err| {
- fatal("unable to write to client: {s}", .{@errorName(err)});
- };
- }
-}
-
fn serveUpdateResults(s: *Server, comp: *Compilation) !void {
const gpa = comp.gpa;
var error_bundle = try comp.getAllErrorsAlloc();
@@ -4469,25 +4386,8 @@ fn runOrTestHotSwap(
}
}
-fn updateModule(comp: *Compilation, color: Color) !void {
- {
- // If the terminal is dumb, we dont want to show the user all the output.
- var progress: std.Progress = .{ .dont_print_on_dumb = true };
- const main_progress_node = progress.start("", 0);
- defer main_progress_node.end();
- switch (color) {
- .off => {
- progress.terminal = null;
- },
- .on => {
- progress.terminal = std.io.getStdErr();
- progress.supports_ansi_escape_codes = true;
- },
- .auto => {},
- }
-
- try comp.update(main_progress_node);
- }
+fn updateModule(comp: *Compilation, color: Color, prog_node: std.Progress.Node) !void {
+ try comp.update(prog_node);
var errors = try comp.getAllErrorsAlloc();
defer errors.deinit(comp.gpa);
@@ -4498,7 +4398,12 @@ fn updateModule(comp: *Compilation, color: Color) !void {
}
}
-fn cmdTranslateC(comp: *Compilation, arena: Allocator, fancy_output: ?*Compilation.CImportResult) !void {
+fn cmdTranslateC(
+ comp: *Compilation,
+ arena: Allocator,
+ fancy_output: ?*Compilation.CImportResult,
+ prog_node: std.Progress.Node,
+) !void {
if (build_options.only_core_functionality) @panic("@translate-c is not available in a zig2.c build");
const color: Color = .auto;
assert(comp.c_source_files.len == 1);
@@ -4559,6 +4464,7 @@ fn cmdTranslateC(comp: *Compilation, arena: Allocator, fancy_output: ?*Compilati
.root_src_path = "aro_translate_c.zig",
.depend_on_aro = true,
.capture = &stdout,
+ .progress_node = prog_node,
});
break :f stdout;
},
@@ -4736,8 +4642,6 @@ const usage_build =
;
fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
- var progress: std.Progress = .{ .dont_print_on_dumb = true };
-
var build_file: ?[]const u8 = null;
var override_lib_dir: ?[]const u8 = try EnvVar.ZIG_LIB_DIR.get(arena);
var override_global_cache_dir: ?[]const u8 = try EnvVar.ZIG_GLOBAL_CACHE_DIR.get(arena);
@@ -4798,6 +4702,8 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
const results_tmp_file_nonce = Package.Manifest.hex64(std.crypto.random.int(u64));
try child_argv.append("-Z" ++ results_tmp_file_nonce);
+ var color: Color = .auto;
+
{
var i: usize = 0;
while (i < args.len) : (i += 1) {
@@ -4882,6 +4788,14 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
verbose_cimport = true;
} else if (mem.eql(u8, arg, "--verbose-llvm-cpu-features")) {
verbose_llvm_cpu_features = true;
+ } else if (mem.eql(u8, arg, "--color")) {
+ if (i + 1 >= args.len) fatal("expected [auto|on|off] after {s}", .{arg});
+ i += 1;
+ color = std.meta.stringToEnum(Color, args[i]) orelse {
+ fatal("expected [auto|on|off] after {s}, found '{s}'", .{ arg, args[i] });
+ };
+ try child_argv.appendSlice(&.{ arg, args[i] });
+ continue;
} else if (mem.eql(u8, arg, "--seed")) {
if (i + 1 >= args.len) fatal("expected argument after '{s}'", .{arg});
i += 1;
@@ -4895,7 +4809,11 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
const work_around_btrfs_bug = native_os == .linux and
EnvVar.ZIG_BTRFS_WORKAROUND.isSet();
- const color: Color = .auto;
+ const root_prog_node = std.Progress.start(.{
+ .disable_printing = (color == .off),
+ .root_name = "Compile Build Script",
+ });
+ defer root_prog_node.end();
const target_query: std.Target.Query = .{};
const resolved_target: Package.Module.ResolvedTarget = .{
@@ -5051,8 +4969,8 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
config,
);
} else {
- const root_prog_node = progress.start("Fetch Packages", 0);
- defer root_prog_node.end();
+ const fetch_prog_node = root_prog_node.start("Fetch Packages", 0);
+ defer fetch_prog_node.end();
var job_queue: Package.Fetch.JobQueue = .{
.http_client = &http_client,
@@ -5093,7 +5011,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
.lazy_status = .eager,
.parent_package_root = build_mod.root,
.parent_manifest_ast = null,
- .prog_node = root_prog_node,
+ .prog_node = fetch_prog_node,
.job_queue = &job_queue,
.omit_missing_hash_error = true,
.allow_missing_paths_field = false,
@@ -5232,7 +5150,7 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
};
defer comp.destroy();
- updateModule(comp, color) catch |err| switch (err) {
+ updateModule(comp, color, root_prog_node) catch |err| switch (err) {
error.SemanticAnalyzeFail => process.exit(2),
else => |e| return e,
};
@@ -5250,7 +5168,12 @@ fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
child.stdout_behavior = .Inherit;
child.stderr_behavior = .Inherit;
- const term = try child.spawnAndWait();
+ const term = t: {
+ std.debug.lockStdErr();
+ defer std.debug.unlockStdErr();
+ break :t try child.spawnAndWait();
+ };
+
switch (term) {
.Exited => |code| {
if (code == 0) return cleanExit();
@@ -5326,8 +5249,9 @@ const JitCmdOptions = struct {
prepend_zig_exe_path: bool = false,
depend_on_aro: bool = false,
capture: ?*[]u8 = null,
- /// Send progress and error bundles via std.zig.Server over stdout
+ /// Send error bundles via std.zig.Server over stdout
server: bool = false,
+ progress_node: ?std.Progress.Node = null,
};
fn jitCmd(
@@ -5337,6 +5261,9 @@ fn jitCmd(
options: JitCmdOptions,
) !void {
const color: Color = .auto;
+ const root_prog_node = if (options.progress_node) |node| node else std.Progress.start(.{
+ .disable_printing = (color == .off),
+ });
const target_query: std.Target.Query = .{};
const resolved_target: Package.Module.ResolvedTarget = .{
@@ -5473,39 +5400,14 @@ fn jitCmd(
};
defer comp.destroy();
- if (options.server and !builtin.single_threaded) {
- var reset: std.Thread.ResetEvent = .{};
- var progress: std.Progress = .{
- .terminal = null,
- .root = .{
- .context = undefined,
- .parent = null,
- .name = "",
- .unprotected_estimated_total_items = 0,
- .unprotected_completed_items = 0,
- },
- .columns_written = 0,
- .prev_refresh_timestamp = 0,
- .timer = null,
- .done = false,
- };
- const main_progress_node = &progress.root;
- main_progress_node.context = &progress;
+ if (options.server) {
var server = std.zig.Server{
.out = std.io.getStdOut(),
.in = undefined, // won't be receiving messages
.receive_fifo = undefined, // won't be receiving messages
};
- var progress_thread = try std.Thread.spawn(.{}, progressThread, .{
- &progress, &server, &reset,
- });
- defer {
- reset.set();
- progress_thread.join();
- }
-
- try comp.update(main_progress_node);
+ try comp.update(root_prog_node);
var error_bundle = try comp.getAllErrorsAlloc();
defer error_bundle.deinit(comp.gpa);
@@ -5514,7 +5416,7 @@ fn jitCmd(
process.exit(2);
}
} else {
- updateModule(comp, color) catch |err| switch (err) {
+ updateModule(comp, color, root_prog_node) catch |err| switch (err) {
error.SemanticAnalyzeFail => process.exit(2),
else => |e| return e,
};
@@ -6963,8 +6865,9 @@ fn cmdFetch(
try http_client.initDefaultProxies(arena);
- var progress: std.Progress = .{ .dont_print_on_dumb = true };
- const root_prog_node = progress.start("Fetch", 0);
+ var root_prog_node = std.Progress.start(.{
+ .root_name = "Fetch",
+ });
defer root_prog_node.end();
var global_cache_directory: Compilation.Directory = l: {
@@ -7028,8 +6931,8 @@ fn cmdFetch(
const hex_digest = Package.Manifest.hexDigest(fetch.actual_hash);
- progress.done = true;
- progress.refresh();
+ root_prog_node.end();
+ root_prog_node = .{ .index = .none };
const name = switch (save) {
.no => {
diff --git a/src/mingw.zig b/src/mingw.zig
index 803c0f9367..5aa79064ee 100644
--- a/src/mingw.zig
+++ b/src/mingw.zig
@@ -16,7 +16,7 @@ pub const CRTFile = enum {
mingw32_lib,
};
-pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: *std.Progress.Node) !void {
+pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: std.Progress.Node) !void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
@@ -234,8 +234,8 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void {
const include_dir = try comp.zig_lib_directory.join(arena, &[_][]const u8{ "libc", "mingw", "def-include" });
if (comp.verbose_cc) print: {
- std.debug.getStderrMutex().lock();
- defer std.debug.getStderrMutex().unlock();
+ std.debug.lockStdErr();
+ defer std.debug.unlockStdErr();
const stderr = std.io.getStdErr().writer();
nosuspend stderr.print("def file: {s}\n", .{def_file_path}) catch break :print;
nosuspend stderr.print("include dir: {s}\n", .{include_dir}) catch break :print;
diff --git a/src/musl.zig b/src/musl.zig
index 3228faf271..edeea9cca7 100644
--- a/src/musl.zig
+++ b/src/musl.zig
@@ -19,7 +19,7 @@ pub const CRTFile = enum {
libc_so,
};
-pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: *std.Progress.Node) !void {
+pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: std.Progress.Node) !void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}
diff --git a/src/wasi_libc.zig b/src/wasi_libc.zig
index 122d45230b..57d93b6f56 100644
--- a/src/wasi_libc.zig
+++ b/src/wasi_libc.zig
@@ -57,7 +57,7 @@ pub fn execModelCrtFileFullName(wasi_exec_model: std.builtin.WasiExecModel) []co
};
}
-pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: *std.Progress.Node) !void {
+pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: std.Progress.Node) !void {
if (!build_options.have_llvm) {
return error.ZigCompilerNotBuiltWithLLVMExtensions;
}