diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-18 17:24:07 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-24 12:34:41 +0100 |
| commit | ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7 (patch) | |
| tree | 3e25e3fef3fd40a4637c386bec191496f74245d0 /src | |
| parent | c98d229844e4b12ba2c61291fdf7fa0376f4e087 (diff) | |
| download | zig-ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7.tar.gz zig-ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7.zip | |
macho: fill in more blanks in ZigObject
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO.zig | 2 | ||||
| -rw-r--r-- | 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( |
