authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-18 17:42:22+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:41+01:00
log82e92fe5f605a0ef8fa53e8434458bf18deadb5f
tree31c606cffbf33f542c4365a572fe4675fcabb75e
parentee463efdf2e662fb4970aa6e9ba43d165e0cdfc7

macho: fill the rest of ZigObject


2 files changed, 45 insertions(+), 10 deletions(-)

src/link/MachO/Atom.zig+9
......@@ -383,6 +383,15 @@ pub fn free(self: *Atom, macho_file: *MachO) void {
383383 self.* = .{};
384384}
385385
386pub fn addReloc(self: *Atom, macho_file: *MachO, reloc: Relocation) !void {
387 const gpa = macho_file.base.comp.gpa;
388 const file = self.getFile(macho_file);
389 assert(file == .zig_object);
390 const rels = &file.zig_object.relocs.items[self.relocs.pos];
391 try rels.append(gpa, reloc);
392 self.relocs.len += 1;
393}
394
386395pub fn freeRelocs(self: *Atom, macho_file: *MachO) void {
387396 self.getFile(macho_file).zig_object.freeAtomRelocs(self.*);
388397 self.relocs.len = 0;
src/link/MachO/ZigObject.zig+36-10
......@@ -234,11 +234,24 @@ pub fn getDeclVAddr(
234234 decl_index: InternPool.DeclIndex,
235235 reloc_info: link.File.RelocInfo,
236236) !u64 {
237 _ = self;
238 _ = macho_file;
239 _ = decl_index;
240 _ = reloc_info;
241 @panic("TODO getDeclVAddr");
237 const sym_index = try self.getOrCreateMetadataForDecl(macho_file, decl_index);
238 const sym = macho_file.getSymbol(sym_index);
239 const vaddr = sym.getAddress(.{}, macho_file);
240 const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?;
241 try parent_atom.addReloc(macho_file, .{
242 .tag = .@"extern",
243 .offset = @intCast(reloc_info.offset),
244 .target = sym.nlist_idx,
245 .addend = reloc_info.addend,
246 .type = .unsigned,
247 .meta = .{
248 .pcrel = false,
249 .has_subtractor = false,
250 .length = 3,
251 .symbolnum = @intCast(sym.nlist_idx),
252 },
253 });
254 return vaddr;
242255}
243256
244257pub fn getAnonDeclVAddr(
......@@ -247,11 +260,24 @@ pub fn getAnonDeclVAddr(
247260 decl_val: InternPool.Index,
248261 reloc_info: link.File.RelocInfo,
249262) !u64 {
250 _ = self;
251 _ = macho_file;
252 _ = decl_val;
253 _ = reloc_info;
254 @panic("TODO getAnonDeclVAddr");
263 const sym_index = self.anon_decls.get(decl_val).?.symbol_index;
264 const sym = macho_file.getSymbol(sym_index);
265 const vaddr = sym.getAddress(.{}, macho_file);
266 const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?;
267 try parent_atom.addReloc(macho_file, .{
268 .tag = .@"extern",
269 .offset = @intCast(reloc_info.offset),
270 .target = sym.nlist_idx,
271 .addend = reloc_info.addend,
272 .type = .unsigned,
273 .meta = .{
274 .pcrel = false,
275 .has_subtractor = false,
276 .length = 3,
277 .symbolnum = @intCast(sym.nlist_idx),
278 },
279 });
280 return vaddr;
255281}
256282
257283pub fn lowerAnonDecl(