@@ -8223,11 +8223,14 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
8223
8223
const sym = elf_file.symbol(sym_index);
8224
8224
sym.flags.needs_got = true;
8225
8225
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
8226
- const got_addr = sym.gotAddress(elf_file);
8227
- try self.asmMemory(.{ ._, .call }, Memory.sib(.qword, .{
8228
- .base = .{ .reg = .ds },
8229
- .disp = @intCast(got_addr),
8230
- }));
8226
+ _ = try self.addInst(.{
8227
+ .tag = .call,
8228
+ .ops = .direct_got_reloc,
8229
+ .data = .{ .reloc = .{
8230
+ .atom_index = try self.owner.getSymbolIndex(self),
8231
+ .sym_index = sym.esym_index,
8232
+ } },
8233
+ });
8231
8234
} else if (self.bin_file.cast(link.File.Coff)) |coff_file| {
8232
8235
const atom = try coff_file.getOrCreateAtomForDecl(owner_decl);
8233
8236
const sym_index = coff_file.getAtom(atom).getSymbolIndex().?;
@@ -10290,12 +10293,24 @@ fn genLazySymbolRef(
10290
10293
const sym = elf_file.symbol(sym_index);
10291
10294
sym.flags.needs_got = true;
10292
10295
_ = try sym.getOrCreateGotEntry(sym_index, elf_file);
10293
- const got_addr = sym.gotAddress(elf_file);
10294
- const got_mem =
10295
- Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = @intCast(got_addr) });
10296
+ const reloc = Mir.Reloc{
10297
+ .atom_index = try self.owner.getSymbolIndex(self),
10298
+ .sym_index = sym.esym_index,
10299
+ };
10296
10300
switch (tag) {
10297
- .lea, .mov => try self.asmRegisterMemory(.{ ._, .mov }, reg.to64(), got_mem),
10298
- .call => try self.asmMemory(.{ ._, .call }, got_mem),
10301
+ .lea, .mov => _ = try self.addInst(.{
10302
+ .tag = .mov,
10303
+ .ops = .direct_got_reloc,
10304
+ .data = .{ .rx = .{
10305
+ .r1 = reg.to64(),
10306
+ .payload = try self.addExtra(reloc),
10307
+ } },
10308
+ }),
10309
+ .call => _ = try self.addInst(.{
10310
+ .tag = .call,
10311
+ .ops = .direct_got_reloc,
10312
+ .data = .{ .reloc = reloc },
10313
+ }),
10299
10314
else => unreachable,
10300
10315
}
10301
10316
switch (tag) {
0 commit comments