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...@@ -3656,10 +3656,31 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
3656 else => return self.fail("TODO implement loading from register into {}", .{dst_mcv}),3656 else => return self.fail("TODO implement loading from register into {}", .{dst_mcv}),
3657 }3657 }
3658 },3658 },
3659 .memory, .linker_load => {3659 .memory => {
3660 const reg = try self.copyToTmpRegister(ptr_ty, ptr);3660 const reg = try self.copyToTmpRegister(ptr_ty, ptr);
3661 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);3661 try self.load(dst_mcv, .{ .register = reg }, ptr_ty);
3662 },3662 },
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 },
3663 }3684 }
3664}3685}
36653686
...@@ -3879,11 +3900,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type...@@ -3879,11 +3900,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
3879 switch (load_struct.type) {3900 switch (load_struct.type) {
3880 .import => unreachable,3901 .import => unreachable,
3881 .got, .direct => try self.asmMovLinker(addr_reg, atom_index, load_struct),3902 .got, .direct => try self.asmMovLinker(addr_reg, atom_index, load_struct),
3882 .tlv => {3903 .tlv => try self.genTlvPtr(addr_reg, atom_index, load_struct),
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 },
3887 }3904 }
3888 },3905 },
3889 else => unreachable,3906 else => unreachable,