authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-20 21:53:40+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:42+01:00
log080ad94249101ed167c06761eebbaf1f5d47cfa9
tree85c543c368babffd25a33c1d5e54622949e1be91
parent6ad4062bf2b5066808d728071b87d4084d710e5b

x86_64: save TLS to stack for MachO


1 files changed, 21 insertions(+), 20 deletions(-)

src/arch/x86_64/CodeGen.zig+21-20
...@@ -16051,26 +16051,27 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue {...@@ -16051,26 +16051,27 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue {
16051 if (!gop.found_existing) gop.value_ptr.* = InstTracking.init(init: {16051 if (!gop.found_existing) gop.value_ptr.* = InstTracking.init(init: {
16052 const const_mcv = try self.genTypedValue(.{ .ty = ty, .val = Value.fromInterned(ip_index) });16052 const const_mcv = try self.genTypedValue(.{ .ty = ty, .val = Value.fromInterned(ip_index) });
16053 switch (const_mcv) {16053 switch (const_mcv) {
16054 .lea_tlv => |tlv_sym| if (self.bin_file.cast(link.File.Elf)) |_| {16054 .lea_tlv => |tlv_sym| switch (self.bin_file.tag) {
16055 if (self.mod.pic) {16055 .elf, .macho => {
16056 try self.spillRegisters(&.{ .rdi, .rax });16056 if (self.mod.pic) {
16057 } else {16057 try self.spillRegisters(&.{ .rdi, .rax });
16058 try self.spillRegisters(&.{.rax});16058 } else {
16059 }16059 try self.spillRegisters(&.{.rax});
16060 const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{16060 }
16061 .size = 8,16061 const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{
16062 .alignment = .@"8",16062 .size = 8,
16063 }));16063 .alignment = .@"8",
16064 try self.genSetMem(16064 }));
16065 .{ .frame = frame_index },16065 try self.genSetMem(
16066 0,16066 .{ .frame = frame_index },
16067 Type.usize,16067 0,
16068 .{ .lea_symbol = .{ .sym = tlv_sym } },16068 Type.usize,
16069 );16069 .{ .lea_symbol = .{ .sym = tlv_sym } },
16070 break :init .{ .load_frame = .{ .index = frame_index } };16070 );
16071 } else if (self.bin_file.cast(link.File.MachO)) |_| {16071 break :init .{ .load_frame = .{ .index = frame_index } };
16072 return self.fail("TODO implement saving TLV variable to stack", .{});16072 },
16073 } else break :init const_mcv,16073 else => break :init const_mcv,
16074 },
16074 else => break :init const_mcv,16075 else => break :init const_mcv,
16075 }16076 }
16076 });16077 });