authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-12 13:07:19+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-13 11:47:51+02:00
log887da399eb266b166d1a109bdfe631f4533ead64
tree866f092cff4383a1f2842ca93e7dd4a0ba9bf5f5
parentfd52d4537a86fc312e4491206228ab3aeabe0f2c

x86_64: fix load() and store() to accommodate TLV


1 files changed, 23 insertions(+), 6 deletions(-)

src/arch/x86_64/CodeGen.zig+23-6
......@@ -3656,10 +3656,31 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
36563656 else => return self.fail("TODO implement loading from register into {}", .{dst_mcv}),
36573657 }
36583658 },
3659 .memory, .linker_load => {
3659 .memory => {
36603660 const reg = try self.copyToTmpRegister(ptr_ty, ptr);
36613661 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);
36623662 },
3663 .linker_load => |load_struct| {
3664 const addr_reg = (try self.register_manager.allocReg(null, gp)).to64();
3665 const addr_reg_lock = self.register_manager.lockRegAssumeUnused(addr_reg);
3666 defer self.register_manager.unlockReg(addr_reg_lock);
3667
3668 const atom_index = if (self.bin_file.cast(link.File.MachO)) |macho_file| blk: {
3669 const atom = try macho_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
3670 break :blk macho_file.getAtom(atom).getSymbolIndex().?;
3671 } else if (self.bin_file.cast(link.File.Coff)) |coff_file| blk: {
3672 const atom = try coff_file.getOrCreateAtomForDecl(self.mod_fn.owner_decl);
3673 break :blk coff_file.getAtom(atom).getSymbolIndex().?;
3674 } else unreachable;
3675
3676 switch (load_struct.type) {
3677 .import => unreachable,
3678 .got, .direct => try self.asmMovLinker(addr_reg, atom_index, load_struct),
3679 .tlv => try self.genTlvPtr(addr_reg, atom_index, load_struct),
3680 }
3681
3682 try self.load(dst_mcv, .{ .register = addr_reg }, ptr_ty);
3683 },
36633684 }
36643685}
36653686
......@@ -3879,11 +3900,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
38793900 switch (load_struct.type) {
38803901 .import => unreachable,
38813902 .got, .direct => try self.asmMovLinker(addr_reg, atom_index, load_struct),
3882 .tlv => {
3883 try self.genTlvPtr(addr_reg, atom_index, load_struct);
3884 // Load the pointer, which is stored in memory
3885 try self.asmRegisterMemory(.mov, addr_reg, Memory.sib(.qword, .{ .base = addr_reg }));
3886 },
3903 .tlv => try self.genTlvPtr(addr_reg, atom_index, load_struct),
38873904 }
38883905 },
38893906 else => unreachable,