diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-20 21:53:40 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-01-24 12:34:42 +0100 |
| commit | 080ad94249101ed167c06761eebbaf1f5d47cfa9 (patch) | |
| tree | 85c543c368babffd25a33c1d5e54622949e1be91 | |
| parent | 6ad4062bf2b5066808d728071b87d4084d710e5b (diff) | |
| download | zig-080ad94249101ed167c06761eebbaf1f5d47cfa9.tar.gz zig-080ad94249101ed167c06761eebbaf1f5d47cfa9.zip | |
x86_64: save TLS to stack for MachO
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 2cc5fe267e..f427e284e6 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -16051,26 +16051,27 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue { if (!gop.found_existing) gop.value_ptr.* = InstTracking.init(init: { const const_mcv = try self.genTypedValue(.{ .ty = ty, .val = Value.fromInterned(ip_index) }); switch (const_mcv) { - .lea_tlv => |tlv_sym| if (self.bin_file.cast(link.File.Elf)) |_| { - if (self.mod.pic) { - try self.spillRegisters(&.{ .rdi, .rax }); - } else { - try self.spillRegisters(&.{.rax}); - } - const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{ - .size = 8, - .alignment = .@"8", - })); - try self.genSetMem( - .{ .frame = frame_index }, - 0, - Type.usize, - .{ .lea_symbol = .{ .sym = tlv_sym } }, - ); - break :init .{ .load_frame = .{ .index = frame_index } }; - } else if (self.bin_file.cast(link.File.MachO)) |_| { - return self.fail("TODO implement saving TLV variable to stack", .{}); - } else break :init const_mcv, + .lea_tlv => |tlv_sym| switch (self.bin_file.tag) { + .elf, .macho => { + if (self.mod.pic) { + try self.spillRegisters(&.{ .rdi, .rax }); + } else { + try self.spillRegisters(&.{.rax}); + } + const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{ + .size = 8, + .alignment = .@"8", + })); + try self.genSetMem( + .{ .frame = frame_index }, + 0, + Type.usize, + .{ .lea_symbol = .{ .sym = tlv_sym } }, + ); + break :init .{ .load_frame = .{ .index = frame_index } }; + }, + else => break :init const_mcv, + }, else => break :init const_mcv, } }); |
