diff --git a/src/link/MachO/Zld.zig b/src/link/MachO/Zld.zig index 579fc0f548..5344691bdf 100644 --- a/src/link/MachO/Zld.zig +++ b/src/link/MachO/Zld.zig @@ -517,7 +517,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo var count: usize = seg.sections.items.len; while (count > 0) : (count -= 1) { const sec = &seg.sections.items[count - 1]; - end_off -= mem.alignForwardGeneric(u64, sec.size, @alignOf(u64)); // TODO is 8-byte aligned correct? + end_off -= mem.alignForwardGeneric(u64, sec.size, @alignOf(u128)); // TODO is 8-byte aligned correct? sec.offset = @intCast(u32, end_off); sec.addr = base_vmaddr + end_off; } @@ -526,7 +526,7 @@ fn allocateSegment(self: *Zld, index: u16, offset: u64, start: u64, reverse: boo for (seg.sections.items) |*sect| { sect.offset = @intCast(u32, next_off); sect.addr = base_vmaddr + next_off; - next_off += mem.alignForwardGeneric(u64, sect.size, @alignOf(u64)); // TODO is 8-byte aligned correct? + next_off += mem.alignForwardGeneric(u64, sect.size, @alignOf(u128)); // TODO is 8-byte aligned correct? } } } @@ -1120,6 +1120,11 @@ fn doRelocs(self: *Zld) !void { const narrowed = @truncate(u12, ta); const offset: u12 = blk: { if (parsed.size == 0) { + if (parsed.v == 1) { + // 128-bit SIMD is scaled by 16. + break :blk try math.divExact(u12, narrowed, 16); + } + // Otherwise, 8-bit SIMD or ldrb. break :blk narrowed; } else { const denom: u4 = try math.powi(u4, 2, parsed.size); @@ -2184,25 +2189,26 @@ fn writeSymbolTable(self: *Zld) !void { for (self.locals.items()) |entries| { log.warn("'{s}': {} entries", .{ entries.key, entries.value.items.len }); - var symbol: ?macho.nlist_64 = null; + // var symbol: ?macho.nlist_64 = null; for (entries.value.items) |entry| { log.warn(" | {}", .{entry.inner}); log.warn(" | {}", .{entry.tt}); log.warn(" | {s}", .{entry.object.name}); - switch (entry.tt) { - .Global => { - symbol = entry.inner; - break; - }, - .WeakGlobal => { - symbol = entry.inner; - }, - .Local => {}, - } - } - if (symbol) |s| { - try locals.append(s); + // switch (entry.tt) { + // .Global => { + // symbol = entry.inner; + // break; + // }, + // .WeakGlobal => { + // symbol = entry.inner; + // }, + // .Local => {}, + // } + try locals.append(entry.inner); } + // if (symbol) |s| { + // try locals.append(s); + // } } const nlocals = locals.items.len; diff --git a/src/link/MachO/reloc.zig b/src/link/MachO/reloc.zig index 26af40443e..d428b191a6 100644 --- a/src/link/MachO/reloc.zig +++ b/src/link/MachO/reloc.zig @@ -25,7 +25,10 @@ pub const Arm64 = union(enum) { rt: u5, rn: u5, offset: u12, - _1: u8 = 0b111_0_01_01, + opc: u2, + _2: u2 = 0b01, + v: u1, + _1: u3 = 0b111, size: u2, }, LoadLiteral: packed struct { @@ -144,6 +147,8 @@ pub const Arm64 = union(enum) { .rt = rt, .rn = rn, .offset = offset, + .opc = 0b01, + .v = 0b0, .size = 0b11, }, }; @@ -154,6 +159,8 @@ pub const Arm64 = union(enum) { .rt = rt, .rn = rn, .offset = offset, + .opc = 0b01, + .v = 0b0, .size = 0b01, }, }; @@ -164,6 +171,8 @@ pub const Arm64 = union(enum) { .rt = rt, .rn = rn, .offset = offset, + .opc = 0b01, + .v = 0b0, .size = 0b00, }, };