aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-18 17:24:07 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-24 12:34:41 +0100
commitee463efdf2e662fb4970aa6e9ba43d165e0cdfc7 (patch)
tree3e25e3fef3fd40a4637c386bec191496f74245d0
parentc98d229844e4b12ba2c61291fdf7fa0376f4e087 (diff)
downloadzig-ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7.tar.gz
zig-ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7.zip
macho: fill in more blanks in ZigObject
-rw-r--r--src/link/MachO.zig2
-rw-r--r--src/link/MachO/ZigObject.zig46
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(