From ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 18 Jan 2024 17:24:07 +0100 Subject: [PATCH] macho: fill in more blanks in ZigObject --- src/link/MachO.zig | 2 +- src/link/MachO/ZigObject.zig | 46 ++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 239deda1c8..165dbbe17a 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -21,7 +21,7 @@ sections: std.MultiArrayList(Section) = .{}, symbols: std.ArrayListUnmanaged(Symbol) = .{}, symbols_extra: std.ArrayListUnmanaged(u32) = .{}, symbols_free_list: std.ArrayListUnmanaged(Symbol.Index) = .{}, -globals: std.AutoHashMapUnmanaged(u32, Symbol.Index) = .{}, +globals: std.AutoArrayHashMapUnmanaged(u32, Symbol.Index) = .{}, /// This table will be populated after `scanRelocs` has run. /// Key is symbol index. undefs: std.AutoHashMapUnmanaged(Symbol.Index, std.ArrayListUnmanaged(Atom.Index)) = .{}, diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 2f2434f211..2ee829f06c 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -6,6 +6,7 @@ symtab: std.MultiArrayList(Nlist) = .{}, symbols: std.ArrayListUnmanaged(Symbol.Index) = .{}, atoms: std.ArrayListUnmanaged(Atom.Index) = .{}, +globals_lookup: std.AutoHashMapUnmanaged(u32, Symbol.Index) = .{}, /// Table of tracked LazySymbols. lazy_syms: LazySymbolTable = .{}, @@ -53,6 +54,7 @@ pub fn deinit(self: *ZigObject, allocator: Allocator) void { self.symtab.deinit(allocator); self.symbols.deinit(allocator); self.atoms.deinit(allocator); + self.globals_lookup.deinit(allocator); { var it = self.decls.iterator(); @@ -918,20 +920,44 @@ pub fn deleteDeclExport( macho_file: *MachO, decl_index: InternPool.DeclIndex, name: InternPool.NullTerminatedString, -) void { - _ = self; - _ = macho_file; - _ = decl_index; - _ = name; - @panic("TODO deleteDeclExport"); +) Allocator.Error!void { + const metadata = self.decls.getPtr(decl_index) orelse return; + + const gpa = macho_file.base.comp.gpa; + const mod = macho_file.base.comp.module.?; + const exp_name = try std.fmt.allocPrint(gpa, "_{s}", .{mod.intern_pool.stringToSlice(name)}); + defer gpa.free(exp_name); + const nlist_index = metadata.@"export"(self, macho_file, exp_name) orelse return; + + log.debug("deleting export '{s}'", .{exp_name}); + + const nlist = &self.symtab.items(.nlist)[nlist_index.*]; + self.symtab.items(.size)[nlist_index.*] = 0; + _ = self.globals_lookup.remove(nlist.n_strx); + const sym_index = macho_file.globals.get(nlist.n_strx).?; + const sym = macho_file.getSymbol(sym_index); + if (sym.file == self.index) { + _ = macho_file.globals.swapRemove(nlist.n_strx); + sym.* = .{}; + } + nlist.* = MachO.null_sym; } pub fn getGlobalSymbol(self: *ZigObject, macho_file: *MachO, name: []const u8, lib_name: ?[]const u8) !u32 { - _ = self; - _ = macho_file; - _ = name; _ = lib_name; - @panic("TODO getGlobalSymbol"); + const gpa = macho_file.base.comp.gpa; + const off = try macho_file.strings.insert(gpa, name); + const lookup_gop = try self.globals_lookup.getOrPut(gpa, off); + if (!lookup_gop.found_existing) { + const nlist_index = try self.addNlist(gpa); + const nlist = &self.symtab.items(.nlist)[nlist_index]; + nlist.n_strx = off; + nlist.n_type = macho.N_EXT; + lookup_gop.value_ptr.* = nlist_index; + const gop = try macho_file.getOrCreateGlobal(off); + try self.symbols.append(gpa, gop.index); + } + return lookup_gop.value_ptr.*; } pub fn getOrCreateMetadataForDecl(