From 92deebcd668750bd4042c5874bf35b447828cd8a Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Fri, 2 Feb 2024 14:05:51 +0100 Subject: cli+build: handle -ObjC flag and route it to MachO linker --- src/link/Coff/lld.zig | 2 +- src/link/Elf.zig | 2 +- src/link/MachO.zig | 9 +++++++-- src/link/Wasm.zig | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src/link') diff --git a/src/link/Coff/lld.zig b/src/link/Coff/lld.zig index b4843ae6cd..90e284900a 100644 --- a/src/link/Coff/lld.zig +++ b/src/link/Coff/lld.zig @@ -70,7 +70,7 @@ pub fn linkWithLLD(self: *Coff, arena: Allocator, prog_node: *std.Progress.Node) man = comp.cache_parent.obtain(); self.base.releaseLock(); - comptime assert(Compilation.link_hash_implementation_version == 11); + comptime assert(Compilation.link_hash_implementation_version == 12); for (comp.objects) |obj| { _ = try man.addFile(obj.path, null); diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 70ed2f76ab..2a130d452a 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -2380,7 +2380,7 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi // We are about to obtain this lock, so here we give other processes a chance first. self.base.releaseLock(); - comptime assert(Compilation.link_hash_implementation_version == 11); + comptime assert(Compilation.link_hash_implementation_version == 12); try man.addOptionalFile(self.linker_script); try man.addOptionalFile(self.version_script); diff --git a/src/link/MachO.zig b/src/link/MachO.zig index c2a098b9f5..e7603e2bde 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -217,6 +217,7 @@ pub fn createEmpty( .undefined_treatment = if (allow_shlib_undefined) .dynamic_lookup else .@"error", .lib_dirs = options.lib_dirs, .framework_dirs = options.framework_dirs, + .force_load_objc = options.force_load_objc, }; if (use_llvm and comp.config.have_zcu) { self.llvm_object = try LlvmObject.create(arena, comp); @@ -807,6 +808,10 @@ fn dumpArgv(self: *MachO, comp: *Compilation) !void { try argv.append("-dead_strip_dylibs"); } + if (self.force_load_objc) { + try argv.append("-ObjC"); + } + if (self.entry_name) |entry_name| { try argv.appendSlice(&.{ "-e", entry_name }); } @@ -1247,7 +1252,7 @@ fn parseDependentDylibs(self: *MachO) !void { try checked_paths.append(rel_path); var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; const full_path = std.fs.realpath(rel_path, &buffer) catch continue; - break :full_path full_path; + break :full_path try arena.dupe(u8, full_path); } } else if (eatPrefix(id.name, "@loader_path/")) |_| { try self.reportParseError2(dylib_index, "TODO handle install_name '{s}'", .{id.name}); @@ -1260,7 +1265,7 @@ fn parseDependentDylibs(self: *MachO) !void { try checked_paths.append(try arena.dupe(u8, id.name)); var buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; if (std.fs.realpath(id.name, &buffer)) |full_path| { - break :full_path full_path; + break :full_path try arena.dupe(u8, full_path); } else |_| { try self.reportMissingDependencyError( self.getFile(dylib_index).?.dylib.getUmbrella(self).index, diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index a0cf23579b..9fe8ce417e 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -3511,7 +3511,7 @@ fn linkWithZld(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) lin // We are about to obtain this lock, so here we give other processes a chance first. wasm.base.releaseLock(); - comptime assert(Compilation.link_hash_implementation_version == 11); + comptime assert(Compilation.link_hash_implementation_version == 12); for (objects) |obj| { _ = try man.addFile(obj.path, null); @@ -4580,7 +4580,7 @@ fn linkWithLLD(wasm: *Wasm, arena: Allocator, prog_node: *std.Progress.Node) !vo // We are about to obtain this lock, so here we give other processes a chance first. wasm.base.releaseLock(); - comptime assert(Compilation.link_hash_implementation_version == 11); + comptime assert(Compilation.link_hash_implementation_version == 12); for (comp.objects) |obj| { _ = try man.addFile(obj.path, null); -- cgit v1.2.3