diff options
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 2a33cca702..49628b93f6 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -3018,7 +3018,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { } } else if (func_value.castTag(.extern_fn)) |func_payload| { const decl = func_payload.data; - const resolv = try macho_file.addExternFn(mem.spanZ(decl.name)); + const n_strx = try macho_file.addExternFn(mem.spanZ(decl.name)); const offset = blk: { switch (arch) { .x86_64 => { @@ -3039,14 +3039,16 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { // Add relocation to the decl. try macho_file.active_decl.?.link.macho.relocs.append(self.bin_file.allocator, .{ .offset = offset, - .where = switch (resolv.where) { - .local => .local, - .undef => .undef, + .target = .{ .global = n_strx }, + .addend = 0, + .subtractor = null, + .pcrel = true, + .length = 2, + .@"type" = switch (arch) { + .aarch64 => @enumToInt(std.macho.reloc_type_arm64.ARM64_RELOC_BRANCH26), + .x86_64 => @enumToInt(std.macho.reloc_type_x86_64.X86_64_RELOC_BRANCH), + else => unreachable, }, - .where_index = resolv.where_index, - .payload = .{ .branch = .{ - .arch = arch, - } }, }); } else { return self.fail("TODO implement calling bitcasted functions", .{}); @@ -4540,16 +4542,22 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { // Page reloc for adrp instruction. try decl.link.macho.relocs.append(self.bin_file.allocator, .{ .offset = offset, - .where = .local, - .where_index = @intCast(u32, addr), - .payload = .{ .page = .{ .kind = .got } }, + .target = .{ .local = @intCast(u32, addr) }, + .addend = 0, + .subtractor = null, + .pcrel = true, + .length = 2, + .@"type" = @enumToInt(std.macho.reloc_type_arm64.ARM64_RELOC_GOT_LOAD_PAGE21), }); // Pageoff reloc for adrp instruction. try decl.link.macho.relocs.append(self.bin_file.allocator, .{ .offset = offset + 4, - .where = .local, - .where_index = @intCast(u32, addr), - .payload = .{ .page_off = .{ .kind = .got } }, + .target = .{ .local = @intCast(u32, addr) }, + .addend = 0, + .subtractor = null, + .pcrel = false, + .length = 2, + .@"type" = @enumToInt(std.macho.reloc_type_arm64.ARM64_RELOC_GOT_LOAD_PAGEOFF12), }); } else { return self.fail("TODO implement genSetReg for PIE GOT indirection on this platform", .{}); @@ -4814,9 +4822,12 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { // Load reloc for LEA instruction. try decl.link.macho.relocs.append(self.bin_file.allocator, .{ .offset = offset - 4, - .where = .local, - .where_index = @intCast(u32, x), - .payload = .{ .load = .{ .kind = .got } }, + .target = .{ .local = @intCast(u32, x) }, + .addend = 0, + .subtractor = null, + .pcrel = true, + .length = 2, + .@"type" = @enumToInt(std.macho.reloc_type_x86_64.X86_64_RELOC_GOT), }); } else { return self.fail("TODO implement genSetReg for PIE GOT indirection on this platform", .{}); |
