authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-19 13:47:39+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:41+01:00
log5c951cd21175c935215979f7599e8e340d86845b
tree42b70e111de0f1ec26603d6ea5d9f1ef4b8a7bd1
parenta8629fb8501275d826912085ccd120eb48a53199

macho: again fix symbol index dereference in codegen wrt ZigObject


5 files changed, 17 insertions(+), 10 deletions(-)

src/arch/x86_64/Emit.zig+3-2
......@@ -51,10 +51,11 @@ pub fn emitMir(emit: *Emit) Error!void {
5151 } else if (emit.lower.bin_file.cast(link.File.MachO)) |macho_file| {
5252 // Add relocation to the decl.
5353 const atom = macho_file.getSymbol(symbol.atom_index).getAtom(macho_file).?;
54 const sym_index = macho_file.getZigObject().?.symbols.items[symbol.sym_index];
5455 try atom.addReloc(macho_file, .{
5556 .tag = .@"extern",
5657 .offset = end_offset - 4,
57 .target = symbol.sym_index,
58 .target = sym_index,
5859 .addend = 0,
5960 .type = .branch,
6061 .meta = .{
......@@ -170,7 +171,7 @@ pub fn emitMir(emit: *Emit) Error!void {
170171 try atom.addReloc(macho_file, .{
171172 .tag = .@"extern",
172173 .offset = @intCast(end_offset - 4),
173 .target = data.sym_index,
174 .target = sym_index,
174175 .addend = 0,
175176 .type = @"type",
176177 .meta = .{
src/arch/x86_64/Lower.zig+2-1
......@@ -424,7 +424,8 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
424424 else => unreachable,
425425 };
426426 } else if (lower.bin_file.cast(link.File.MachO)) |macho_file| {
427 const macho_sym = macho_file.getSymbol(sym.sym_index);
427 const sym_index = macho_file.getZigObject().?.symbols.items[sym.sym_index];
428 const macho_sym = macho_file.getSymbol(sym_index);
428429
429430 if (macho_sym.flags.tlv) {
430431 @panic("TODO lower TLS access on macOS");
src/link/MachO.zig+2
......@@ -1617,6 +1617,8 @@ fn scanRelocs(self: *MachO) !void {
16171617 const tracy = trace(@src());
16181618 defer tracy.end();
16191619
1620 if (self.getZigObject()) |zo| try zo.scanRelocs(self);
1621
16201622 for (self.objects.items) |index| {
16211623 try self.getFile(index).?.object.scanRelocs(self);
16221624 }
src/link/MachO/ZigObject.zig+9-7
......@@ -346,7 +346,7 @@ pub fn getDeclVAddr(
346346 try parent_atom.addReloc(macho_file, .{
347347 .tag = .@"extern",
348348 .offset = @intCast(reloc_info.offset),
349 .target = sym.nlist_idx,
349 .target = sym_index,
350350 .addend = reloc_info.addend,
351351 .type = .unsigned,
352352 .meta = .{
......@@ -372,7 +372,7 @@ pub fn getAnonDeclVAddr(
372372 try parent_atom.addReloc(macho_file, .{
373373 .tag = .@"extern",
374374 .offset = @intCast(reloc_info.offset),
375 .target = sym.nlist_idx,
375 .target = sym_index,
376376 .addend = reloc_info.addend,
377377 .type = .unsigned,
378378 .meta = .{
......@@ -1102,15 +1102,17 @@ pub fn getOrCreateMetadataForDecl(
11021102 const gop = try self.decls.getOrPut(gpa, decl_index);
11031103 if (!gop.found_existing) {
11041104 const any_non_single_threaded = macho_file.base.comp.config.any_non_single_threaded;
1105 _ = any_non_single_threaded;
11051106 const sym_index = try self.addAtom(macho_file);
11061107 const mod = macho_file.base.comp.module.?;
11071108 const decl = mod.declPtr(decl_index);
1109 _ = decl;
11081110 const sym = macho_file.getSymbol(sym_index);
1109 if (decl.getOwnedVariable(mod)) |variable| {
1110 if (variable.is_threadlocal and any_non_single_threaded) {
1111 sym.flags.tlv = true;
1112 }
1113 }
1111 // if (decl.getOwnedVariable(mod)) |variable| {
1112 // if (variable.is_threadlocal and any_non_single_threaded) {
1113 // sym.flags.tlv = true;
1114 // }
1115 // }
11141116 if (!sym.flags.tlv) {
11151117 sym.flags.needs_zig_got = true;
11161118 }
src/link/MachO/synthetic.zig+1
......@@ -24,6 +24,7 @@ pub const ZigGotSection = struct {
2424 const entry = &zig_got.entries.items[index];
2525 entry.* = sym_index;
2626 const symbol = macho_file.getSymbol(sym_index);
27 assert(symbol.flags.needs_zig_got);
2728 symbol.flags.has_zig_got = true;
2829 try symbol.addExtra(.{ .zig_got = index }, macho_file);
2930 return index;