From 9a78173ee0019c6b0bd1a73926d1413f603b20ac Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 18 Jan 2024 19:15:06 +0100 Subject: [PATCH] macho: implement ZigObject.flushModule --- src/link/MachO/ZigObject.zig | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 96ef3c1996..ef866167ad 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -223,9 +223,33 @@ pub fn getInputSection(self: ZigObject, atom: Atom, macho_file: *MachO) macho.se } pub fn flushModule(self: *ZigObject, macho_file: *MachO) !void { - _ = self; - _ = macho_file; - @panic("TODO flushModule"); + // Handle any lazy symbols that were emitted by incremental compilation. + if (self.lazy_syms.getPtr(.none)) |metadata| { + const zcu = macho_file.base.comp.module.?; + + // Most lazy symbols can be updated on first use, but + // anyerror needs to wait for everything to be flushed. + if (metadata.text_state != .unused) self.updateLazySymbol( + macho_file, + link.File.LazySymbol.initDecl(.code, null, zcu), + metadata.text_symbol_index, + ) catch |err| return switch (err) { + error.CodegenFail => error.FlushFailure, + else => |e| e, + }; + if (metadata.const_state != .unused) self.updateLazySymbol( + macho_file, + link.File.LazySymbol.initDecl(.const_data, null, zcu), + metadata.const_symbol_index, + ) catch |err| return switch (err) { + error.CodegenFail => error.FlushFailure, + else => |e| e, + }; + } + for (self.lazy_syms.values()) |*metadata| { + if (metadata.text_state != .unused) metadata.text_state = .flushed; + if (metadata.const_state != .unused) metadata.const_state = .flushed; + } } pub fn getDeclVAddr(