diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-18 17:42:22 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-24 12:34:41 +0100 |
| commit | 82e92fe5f605a0ef8fa53e8434458bf18deadb5f (patch) | |
| tree | 31c606cffbf33f542c4365a572fe4675fcabb75e | |
| parent | ee463efdf2e662fb4970aa6e9ba43d165e0cdfc7 (diff) | |
| download | zig-82e92fe5f605a0ef8fa53e8434458bf18deadb5f.tar.gz zig-82e92fe5f605a0ef8fa53e8434458bf18deadb5f.zip | |
macho: fill the rest of ZigObject
| -rw-r--r-- | src/link/MachO/Atom.zig | 9 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 46 |
2 files changed, 45 insertions, 10 deletions
diff --git a/src/link/MachO/Atom.zig b/src/link/MachO/Atom.zig index 5da72886be..25cbe6ca64 100644 --- a/src/link/MachO/Atom.zig +++ b/src/link/MachO/Atom.zig @@ -383,6 +383,15 @@ pub fn free(self: *Atom, macho_file: *MachO) void { self.* = .{}; } +pub fn addReloc(self: *Atom, macho_file: *MachO, reloc: Relocation) !void { + const gpa = macho_file.base.comp.gpa; + const file = self.getFile(macho_file); + assert(file == .zig_object); + const rels = &file.zig_object.relocs.items[self.relocs.pos]; + try rels.append(gpa, reloc); + self.relocs.len += 1; +} + pub fn freeRelocs(self: *Atom, macho_file: *MachO) void { self.getFile(macho_file).zig_object.freeAtomRelocs(self.*); self.relocs.len = 0; diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 2ee829f06c..0199c0707c 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -234,11 +234,24 @@ pub fn getDeclVAddr( decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo, ) !u64 { - _ = self; - _ = macho_file; - _ = decl_index; - _ = reloc_info; - @panic("TODO getDeclVAddr"); + const sym_index = try self.getOrCreateMetadataForDecl(macho_file, decl_index); + const sym = macho_file.getSymbol(sym_index); + const vaddr = sym.getAddress(.{}, macho_file); + const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?; + try parent_atom.addReloc(macho_file, .{ + .tag = .@"extern", + .offset = @intCast(reloc_info.offset), + .target = sym.nlist_idx, + .addend = reloc_info.addend, + .type = .unsigned, + .meta = .{ + .pcrel = false, + .has_subtractor = false, + .length = 3, + .symbolnum = @intCast(sym.nlist_idx), + }, + }); + return vaddr; } pub fn getAnonDeclVAddr( @@ -247,11 +260,24 @@ pub fn getAnonDeclVAddr( decl_val: InternPool.Index, reloc_info: link.File.RelocInfo, ) !u64 { - _ = self; - _ = macho_file; - _ = decl_val; - _ = reloc_info; - @panic("TODO getAnonDeclVAddr"); + const sym_index = self.anon_decls.get(decl_val).?.symbol_index; + const sym = macho_file.getSymbol(sym_index); + const vaddr = sym.getAddress(.{}, macho_file); + const parent_atom = macho_file.getSymbol(reloc_info.parent_atom_index).getAtom(macho_file).?; + try parent_atom.addReloc(macho_file, .{ + .tag = .@"extern", + .offset = @intCast(reloc_info.offset), + .target = sym.nlist_idx, + .addend = reloc_info.addend, + .type = .unsigned, + .meta = .{ + .pcrel = false, + .has_subtractor = false, + .length = 3, + .symbolnum = @intCast(sym.nlist_idx), + }, + }); + return vaddr; } pub fn lowerAnonDecl( |
