diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-19 13:47:39 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-24 12:34:41 +0100 |
| commit | 5c951cd21175c935215979f7599e8e340d86845b (patch) | |
| tree | 42b70e111de0f1ec26603d6ea5d9f1ef4b8a7bd1 /src | |
| parent | a8629fb8501275d826912085ccd120eb48a53199 (diff) | |
| download | zig-5c951cd21175c935215979f7599e8e340d86845b.tar.gz zig-5c951cd21175c935215979f7599e8e340d86845b.zip | |
macho: again fix symbol index dereference in codegen wrt ZigObject
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/Emit.zig | 5 | ||||
| -rw-r--r-- | src/arch/x86_64/Lower.zig | 3 | ||||
| -rw-r--r-- | src/link/MachO.zig | 2 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 16 | ||||
| -rw-r--r-- | src/link/MachO/synthetic.zig | 1 |
5 files changed, 17 insertions, 10 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index 08209f5198..97899f224d 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -51,10 +51,11 @@ pub fn emitMir(emit: *Emit) Error!void { } else if (emit.lower.bin_file.cast(link.File.MachO)) |macho_file| { // Add relocation to the decl. const atom = macho_file.getSymbol(symbol.atom_index).getAtom(macho_file).?; + const sym_index = macho_file.getZigObject().?.symbols.items[symbol.sym_index]; try atom.addReloc(macho_file, .{ .tag = .@"extern", .offset = end_offset - 4, - .target = symbol.sym_index, + .target = sym_index, .addend = 0, .type = .branch, .meta = .{ @@ -170,7 +171,7 @@ pub fn emitMir(emit: *Emit) Error!void { try atom.addReloc(macho_file, .{ .tag = .@"extern", .offset = @intCast(end_offset - 4), - .target = data.sym_index, + .target = sym_index, .addend = 0, .type = @"type", .meta = .{ diff --git a/src/arch/x86_64/Lower.zig b/src/arch/x86_64/Lower.zig index eb3ed88b37..0b48afe0c6 100644 --- a/src/arch/x86_64/Lower.zig +++ b/src/arch/x86_64/Lower.zig @@ -424,7 +424,8 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand) else => unreachable, }; } else if (lower.bin_file.cast(link.File.MachO)) |macho_file| { - const macho_sym = macho_file.getSymbol(sym.sym_index); + const sym_index = macho_file.getZigObject().?.symbols.items[sym.sym_index]; + const macho_sym = macho_file.getSymbol(sym_index); if (macho_sym.flags.tlv) { @panic("TODO lower TLS access on macOS"); diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 5eb45981a6..df96318e7b 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -1617,6 +1617,8 @@ fn scanRelocs(self: *MachO) !void { const tracy = trace(@src()); defer tracy.end(); + if (self.getZigObject()) |zo| try zo.scanRelocs(self); + for (self.objects.items) |index| { try self.getFile(index).?.object.scanRelocs(self); } diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index af805600c5..4b677d3d61 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -346,7 +346,7 @@ pub fn getDeclVAddr( try parent_atom.addReloc(macho_file, .{ .tag = .@"extern", .offset = @intCast(reloc_info.offset), - .target = sym.nlist_idx, + .target = sym_index, .addend = reloc_info.addend, .type = .unsigned, .meta = .{ @@ -372,7 +372,7 @@ pub fn getAnonDeclVAddr( try parent_atom.addReloc(macho_file, .{ .tag = .@"extern", .offset = @intCast(reloc_info.offset), - .target = sym.nlist_idx, + .target = sym_index, .addend = reloc_info.addend, .type = .unsigned, .meta = .{ @@ -1102,15 +1102,17 @@ pub fn getOrCreateMetadataForDecl( const gop = try self.decls.getOrPut(gpa, decl_index); if (!gop.found_existing) { const any_non_single_threaded = macho_file.base.comp.config.any_non_single_threaded; + _ = any_non_single_threaded; const sym_index = try self.addAtom(macho_file); const mod = macho_file.base.comp.module.?; const decl = mod.declPtr(decl_index); + _ = decl; const sym = macho_file.getSymbol(sym_index); - if (decl.getOwnedVariable(mod)) |variable| { - if (variable.is_threadlocal and any_non_single_threaded) { - sym.flags.tlv = true; - } - } + // if (decl.getOwnedVariable(mod)) |variable| { + // if (variable.is_threadlocal and any_non_single_threaded) { + // sym.flags.tlv = true; + // } + // } if (!sym.flags.tlv) { sym.flags.needs_zig_got = true; } diff --git a/src/link/MachO/synthetic.zig b/src/link/MachO/synthetic.zig index 5a6e316da5..b749d7daec 100644 --- a/src/link/MachO/synthetic.zig +++ b/src/link/MachO/synthetic.zig @@ -24,6 +24,7 @@ pub const ZigGotSection = struct { const entry = &zig_got.entries.items[index]; entry.* = sym_index; const symbol = macho_file.getSymbol(sym_index); + assert(symbol.flags.needs_zig_got); symbol.flags.has_zig_got = true; try symbol.addExtra(.{ .zig_got = index }, macho_file); return index; |
