diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig index 728db2d848..950e0375f0 100644 --- a/src/link/SpirV.zig +++ b/src/link/SpirV.zig @@ -245,7 +245,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) 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)}); @@ -256,7 +256,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) ![]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"); @@ -267,9 +267,9 @@ fn linkModule(self: *SpirV, a: Allocator, module: []Word) ![]Word { defer parser.deinit(); var binary = try parser.parse(module); - try lower_invocation_globals.run(&parser, &binary); - try prune_unused.run(&parser, &binary); - try dedup.run(&parser, &binary); + try lower_invocation_globals.run(&parser, &binary, progress); + try prune_unused.run(&parser, &binary, progress); + try dedup.run(&parser, &binary, progress); return binary.finalize(a); } diff --git a/src/link/SpirV/deduplicate.zig b/src/link/SpirV/deduplicate.zig index 4a73276a9a..95c3961996 100644 --- a/src/link/SpirV/deduplicate.zig +++ b/src/link/SpirV/deduplicate.zig @@ -363,7 +363,11 @@ const EntityHashContext = struct { } }; -pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { +pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule, progress: *std.Progress.Node) !void { + var sub_node = progress.start("deduplicate", 0); + sub_node.activate(); + defer sub_node.end(); + var arena = std.heap.ArenaAllocator.init(parser.a); defer arena.deinit(); const a = arena.allocator(); @@ -376,6 +380,7 @@ pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { .info = &info, .binary = binary, }; + for (info.entities.keys()) |id| { _ = try ctx.hash(id); } @@ -395,6 +400,8 @@ pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { } } + sub_node.setEstimatedTotalItems(binary.instructions.len); + // Now process the module, and replace instructions where needed. var section = Section{}; var it = binary.iterateInstructions(); @@ -402,6 +409,8 @@ pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { var new_operands = std.ArrayList(u32).init(a); var emitted_ptrs = std.AutoHashMap(ResultId, void).init(a); while (it.next()) |inst| { + defer sub_node.setCompletedItems(inst.offset); + // Result-id can only be the first or second operand const inst_spec = parser.getInstSpec(inst.opcode).?; diff --git a/src/link/SpirV/lower_invocation_globals.zig b/src/link/SpirV/lower_invocation_globals.zig index e6de48ff93..ee992112c8 100644 --- a/src/link/SpirV/lower_invocation_globals.zig +++ b/src/link/SpirV/lower_invocation_globals.zig @@ -682,7 +682,11 @@ const ModuleBuilder = struct { } }; -pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { +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(); + defer sub_node.end(); + var arena = std.heap.ArenaAllocator.init(parser.a); defer arena.deinit(); const a = arena.allocator(); @@ -691,10 +695,16 @@ pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { try info.resolve(a); var builder = try ModuleBuilder.init(a, binary.*, info); + sub_node.completeOne(); try builder.deriveNewFnInfo(info); + sub_node.completeOne(); try builder.processPreamble(binary.*, info); + sub_node.completeOne(); try builder.emitFunctionTypes(info); + sub_node.completeOne(); try builder.rewriteFunctions(parser, binary.*, info); + sub_node.completeOne(); try builder.emitNewEntryPoints(info); + sub_node.completeOne(); try builder.finalize(parser.a, binary); } diff --git a/src/link/SpirV/prune_unused.zig b/src/link/SpirV/prune_unused.zig index a6d0ceaea7..cefdaddd93 100644 --- a/src/link/SpirV/prune_unused.zig +++ b/src/link/SpirV/prune_unused.zig @@ -255,7 +255,11 @@ fn removeIdsFromMap(a: Allocator, map: anytype, info: ModuleInfo, alive_marker: } } -pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { +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(); + defer sub_node.end(); + var arena = std.heap.ArenaAllocator.init(parser.a); defer arena.deinit(); const a = arena.allocator(); @@ -285,9 +289,13 @@ pub fn run(parser: *BinaryModule.Parser, binary: *BinaryModule) !void { var section = Section{}; + sub_node.setEstimatedTotalItems(binary.instructions.len); + var new_functions_section: ?usize = null; var it = binary.iterateInstructions(); skip: while (it.next()) |inst| { + defer sub_node.setCompletedItems(inst.offset); + const inst_spec = parser.getInstSpec(inst.opcode).?; reemit: {