authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-28 00:49:59+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-28 00:49:59+01:00
log8cdaaa7b4fcf10f1cb5603dc3bb2340ef17c9fc9
treeb1bcb6ec12f1fe1473c3970a6bb69696c0ded407
parent6337ce16ae76977b2444b5c07f3c436db4d5ece7

macho: move getAtomData switch into Atom


2 files changed, 12 insertions(+), 7 deletions(-)

src/link/MachO.zig+2-7
...@@ -613,7 +613,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node...@@ -613,7 +613,7 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
613 const atom_size = math.cast(usize, atom.size) orelse return error.Overflow;613 const atom_size = math.cast(usize, atom.size) orelse return error.Overflow;
614 const code = try gpa.alloc(u8, atom_size);614 const code = try gpa.alloc(u8, atom_size);
615 defer gpa.free(code);615 defer gpa.free(code);
616 zo.getAtomData(self, atom.*, code) catch |err| switch (err) {616 atom.getData(self, code) catch |err| switch (err) {
617 error.InputOutput => {617 error.InputOutput => {
618 try self.reportUnexpectedError("fetching code for '{s}' failed", .{618 try self.reportUnexpectedError("fetching code for '{s}' failed", .{
619 atom.getName(self),619 atom.getName(self),
...@@ -2591,12 +2591,7 @@ fn writeAtoms(self: *MachO) !void {...@@ -2591,12 +2591,7 @@ fn writeAtoms(self: *MachO) !void {
2591 assert(atom.flags.alive);2591 assert(atom.flags.alive);
2592 const off = math.cast(usize, atom.value - header.addr) orelse return error.Overflow;2592 const off = math.cast(usize, atom.value - header.addr) orelse return error.Overflow;
2593 const atom_size = math.cast(usize, atom.size) orelse return error.Overflow;2593 const atom_size = math.cast(usize, atom.size) orelse return error.Overflow;
2594 switch (atom.getFile(self)) {2594 try atom.getData(self, buffer[off..][0..atom_size]);
2595 .internal => |x| try x.getAtomData(atom.*, buffer[off..][0..atom_size]),
2596 .object => |x| try x.getAtomData(atom.*, buffer[off..][0..atom_size]),
2597 .zig_object => |x| try x.getAtomData(self, atom.*, buffer[off..][0..atom_size]),
2598 else => unreachable,
2599 }
2600 atom.resolveRelocs(self, buffer[off..][0..atom_size]) catch |err| switch (err) {2595 atom.resolveRelocs(self, buffer[off..][0..atom_size]) catch |err| switch (err) {
2601 error.ResolveFailed => has_resolve_error = true,2596 error.ResolveFailed => has_resolve_error = true,
2602 else => |e| return e,2597 else => |e| return e,
src/link/MachO/Atom.zig+10
...@@ -54,6 +54,16 @@ pub fn getFile(self: Atom, macho_file: *MachO) File {...@@ -54,6 +54,16 @@ pub fn getFile(self: Atom, macho_file: *MachO) File {
54 return macho_file.getFile(self.file).?;54 return macho_file.getFile(self.file).?;
55}55}
5656
57pub fn getData(self: Atom, macho_file: *MachO, buffer: []u8) !void {
58 assert(buffer.len == self.size);
59 switch (self.getFile(macho_file)) {
60 .internal => |x| try x.getAtomData(self, buffer),
61 .object => |x| try x.getAtomData(self, buffer),
62 .zig_object => |x| try x.getAtomData(macho_file, self, buffer),
63 else => unreachable,
64 }
65}
66
57pub fn getRelocs(self: Atom, macho_file: *MachO) []const Relocation {67pub fn getRelocs(self: Atom, macho_file: *MachO) []const Relocation {
58 return switch (self.getFile(macho_file)) {68 return switch (self.getFile(macho_file)) {
59 .dylib => unreachable,69 .dylib => unreachable,