authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-05-26 01:58:26+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-05-27 20:56:48-07:00
logd403d8cb7a147856232430afe9af8562d59de38b
tree955c952ed22ad2a734c4df49a4c54264daaff2b6
parentacdf988c24c51129ed3ad9929b6ed8482b9abe54

Module: fix and improve progress reporting

* correctly report time spent analyzing function bodies * print fully qualified decl names * also have a progress node for codegen The downside of these changes is that it's a bit flickerey, but the upside is that it's accurate; you can see what the compiler's doing!

2 files changed, 19 insertions(+), 4 deletions(-)

src/Compilation.zig+3
...@@ -3331,10 +3331,13 @@ pub fn performAllTheWork(...@@ -3331,10 +3331,13 @@ pub fn performAllTheWork(
3331 try reportMultiModuleErrors(mod);3331 try reportMultiModuleErrors(mod);
3332 try mod.flushRetryableFailures();3332 try mod.flushRetryableFailures();
3333 mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);3333 mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);
3334 mod.codegen_prog_node = main_progress_node.start("Code Generation", 0);
3334 }3335 }
3335 defer if (comp.module) |mod| {3336 defer if (comp.module) |mod| {
3336 mod.sema_prog_node.end();3337 mod.sema_prog_node.end();
3337 mod.sema_prog_node = undefined;3338 mod.sema_prog_node = undefined;
3339 mod.codegen_prog_node.end();
3340 mod.codegen_prog_node = undefined;
3338 };3341 };
33393342
3340 while (true) {3343 while (true) {
src/Module.zig+16-4
...@@ -66,6 +66,7 @@ root_mod: *Package.Module,...@@ -66,6 +66,7 @@ root_mod: *Package.Module,
66main_mod: *Package.Module,66main_mod: *Package.Module,
67std_mod: *Package.Module,67std_mod: *Package.Module,
68sema_prog_node: std.Progress.Node = undefined,68sema_prog_node: std.Progress.Node = undefined,
69codegen_prog_node: std.Progress.Node = undefined,
6970
70/// Used by AstGen worker to load and store ZIR cache.71/// Used by AstGen worker to load and store ZIR cache.
71global_zir_cache: Compilation.Directory,72global_zir_cache: Compilation.Directory,
...@@ -3009,7 +3010,7 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {...@@ -3009,7 +3010,7 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
3009 };3010 };
3010 }3011 }
30113012
3012 const decl_prog_node = mod.sema_prog_node.start(decl.name.toSlice(ip), 0);3013 const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(mod)).toSlice(ip), 0);
3013 defer decl_prog_node.end();3014 defer decl_prog_node.end();
30143015
3015 break :blk mod.semaDecl(decl_index) catch |err| switch (err) {3016 break :blk mod.semaDecl(decl_index) catch |err| switch (err) {
...@@ -3215,6 +3216,9 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In...@@ -3215,6 +3216,9 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In
3215 };3216 };
3216 }3217 }
32173218
3219 const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(zcu)).toSlice(ip), 0);
3220 defer codegen_prog_node.end();
3221
3218 if (comp.bin_file) |lf| {3222 if (comp.bin_file) |lf| {
3219 lf.updateFunc(zcu, func_index, air, liveness) catch |err| switch (err) {3223 lf.updateFunc(zcu, func_index, air, liveness) catch |err| switch (err) {
3220 error.OutOfMemory => return error.OutOfMemory,3224 error.OutOfMemory => return error.OutOfMemory,
...@@ -4500,6 +4504,9 @@ pub fn analyzeFnBody(mod: *Module, func_index: InternPool.Index, arena: Allocato...@@ -4500,6 +4504,9 @@ pub fn analyzeFnBody(mod: *Module, func_index: InternPool.Index, arena: Allocato
4500 log.debug("finish func name '{}'", .{(decl.fullyQualifiedName(mod) catch break :blk).fmt(ip)});4504 log.debug("finish func name '{}'", .{(decl.fullyQualifiedName(mod) catch break :blk).fmt(ip)});
4501 }4505 }
45024506
4507 const decl_prog_node = mod.sema_prog_ndoe.start((try decl.fullyQualifiedName(mod)).toSlice(ip), 0);
4508 defer decl_prog_node.end();
4509
4503 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .func = func_index }));4510 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .func = func_index }));
45044511
4505 var comptime_err_ret_trace = std.ArrayList(SrcLoc).init(gpa);4512 var comptime_err_ret_trace = std.ArrayList(SrcLoc).init(gpa);
...@@ -5333,9 +5340,12 @@ pub fn populateTestFunctions(...@@ -5333,9 +5340,12 @@ pub fn populateTestFunctions(
5333 // We have to call `ensureDeclAnalyzed` here in case `builtin.test_functions`5340 // We have to call `ensureDeclAnalyzed` here in case `builtin.test_functions`
5334 // was not referenced by start code.5341 // was not referenced by start code.
5335 mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);5342 mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);
5343 mod.codegen_prog_node = main_progress_node.start("Code Generation", 0);
5336 defer {5344 defer {
5337 mod.sema_prog_node.end();5345 mod.sema_prog_node.end();
5338 mod.sema_prog_node = undefined;5346 mod.sema_prog_node = undefined;
5347 mod.codegen_prog_node.end();
5348 mod.codegen_prog_node = undefined;
5339 }5349 }
5340 try mod.ensureDeclAnalyzed(decl_index);5350 try mod.ensureDeclAnalyzed(decl_index);
5341 }5351 }
...@@ -5445,15 +5455,18 @@ pub fn populateTestFunctions(...@@ -5445,15 +5455,18 @@ pub fn populateTestFunctions(
5445pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {5455pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {
5446 const comp = zcu.comp;5456 const comp = zcu.comp;
54475457
5458 const decl = zcu.declPtr(decl_index);
5459
5460 const codegen_prog_node = zcu.codegen_prog_node.start((try decl.fullyQualifiedName(zcu)).toSlice(&zcu.intern_pool), 0);
5461 defer codegen_prog_node.end();
5462
5448 if (comp.bin_file) |lf| {5463 if (comp.bin_file) |lf| {
5449 lf.updateDecl(zcu, decl_index) catch |err| switch (err) {5464 lf.updateDecl(zcu, decl_index) catch |err| switch (err) {
5450 error.OutOfMemory => return error.OutOfMemory,5465 error.OutOfMemory => return error.OutOfMemory,
5451 error.AnalysisFail => {5466 error.AnalysisFail => {
5452 const decl = zcu.declPtr(decl_index);
5453 decl.analysis = .codegen_failure;5467 decl.analysis = .codegen_failure;
5454 },5468 },
5455 else => {5469 else => {
5456 const decl = zcu.declPtr(decl_index);
5457 const gpa = zcu.gpa;5470 const gpa = zcu.gpa;
5458 try zcu.failed_decls.ensureUnusedCapacity(gpa, 1);5471 try zcu.failed_decls.ensureUnusedCapacity(gpa, 1);
5459 zcu.failed_decls.putAssumeCapacityNoClobber(decl_index, try ErrorMsg.create(5472 zcu.failed_decls.putAssumeCapacityNoClobber(decl_index, try ErrorMsg.create(
...@@ -5471,7 +5484,6 @@ pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {...@@ -5471,7 +5484,6 @@ pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {
5471 llvm_object.updateDecl(zcu, decl_index) catch |err| switch (err) {5484 llvm_object.updateDecl(zcu, decl_index) catch |err| switch (err) {
5472 error.OutOfMemory => return error.OutOfMemory,5485 error.OutOfMemory => return error.OutOfMemory,
5473 error.AnalysisFail => {5486 error.AnalysisFail => {
5474 const decl = zcu.declPtr(decl_index);
5475 decl.analysis = .codegen_failure;5487 decl.analysis = .codegen_failure;
5476 },5488 },
5477 };5489 };