authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-10 22:17:19+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-10 22:25:57+02:00
log8f82a66019dac33ee1065ffe9e4520949203a9a6
tree1ebeee037d87608ee0c5e6fb9c980cf605338624
parent5d6e49d0655b4523c249f1d62da9dc477f1c82af

MachO/ZigObject: handle ref to an extern in getDeclVAddr


2 files changed, 15 insertions(+), 3 deletions(-)

src/link/MachO.zig+2-2
...@@ -3042,9 +3042,9 @@ pub fn freeDecl(self: *MachO, decl_index: InternPool.DeclIndex) void {...@@ -3042,9 +3042,9 @@ pub fn freeDecl(self: *MachO, decl_index: InternPool.DeclIndex) void {
3042 return self.getZigObject().?.freeDecl(decl_index);3042 return self.getZigObject().?.freeDecl(decl_index);
3043}3043}
30443044
3045pub fn getDeclVAddr(self: *MachO, _: Zcu.PerThread, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 {3045pub fn getDeclVAddr(self: *MachO, pt: Zcu.PerThread, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 {
3046 assert(self.llvm_object == null);3046 assert(self.llvm_object == null);
3047 return self.getZigObject().?.getDeclVAddr(self, decl_index, reloc_info);3047 return self.getZigObject().?.getDeclVAddr(self, pt, decl_index, reloc_info);
3048}3048}
30493049
3050pub fn lowerAnonDecl(3050pub fn lowerAnonDecl(
src/link/MachO/ZigObject.zig+13-1
...@@ -694,10 +694,22 @@ pub fn flushModule(self: *ZigObject, macho_file: *MachO, tid: Zcu.PerThread.Id)...@@ -694,10 +694,22 @@ pub fn flushModule(self: *ZigObject, macho_file: *MachO, tid: Zcu.PerThread.Id)
694pub fn getDeclVAddr(694pub fn getDeclVAddr(
695 self: *ZigObject,695 self: *ZigObject,
696 macho_file: *MachO,696 macho_file: *MachO,
697 pt: Zcu.PerThread,
697 decl_index: InternPool.DeclIndex,698 decl_index: InternPool.DeclIndex,
698 reloc_info: link.File.RelocInfo,699 reloc_info: link.File.RelocInfo,
699) !u64 {700) !u64 {
700 const sym_index = try self.getOrCreateMetadataForDecl(macho_file, decl_index);701 const zcu = pt.zcu;
702 const ip = &zcu.intern_pool;
703 const decl = zcu.declPtr(decl_index);
704 log.debug("getDeclVAddr {}({d})", .{ decl.fqn.fmt(ip), decl_index });
705 const sym_index = if (decl.isExtern(zcu)) blk: {
706 const name = decl.name.toSlice(ip);
707 const lib_name = if (decl.getOwnedExternFunc(zcu)) |ext_fn|
708 ext_fn.lib_name.toSlice(ip)
709 else
710 decl.getOwnedVariable(zcu).?.lib_name.toSlice(ip);
711 break :blk try self.getGlobalSymbol(macho_file, name, lib_name);
712 } else try self.getOrCreateMetadataForDecl(macho_file, decl_index);
701 const sym = self.symbols.items[sym_index];713 const sym = self.symbols.items[sym_index];
702 const vaddr = sym.getAddress(.{}, macho_file);714 const vaddr = sym.getAddress(.{}, macho_file);
703 const parent_atom = self.symbols.items[reloc_info.parent_atom_index].getAtom(macho_file).?;715 const parent_atom = self.symbols.items[reloc_info.parent_atom_index].getAtom(macho_file).?;