aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-20 21:53:40 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-24 12:34:42 +0100
commit080ad94249101ed167c06761eebbaf1f5d47cfa9 (patch)
tree85c543c368babffd25a33c1d5e54622949e1be91 /src
parent6ad4062bf2b5066808d728071b87d4084d710e5b (diff)
downloadzig-080ad94249101ed167c06761eebbaf1f5d47cfa9.tar.gz
zig-080ad94249101ed167c06761eebbaf1f5d47cfa9.zip
x86_64: save TLS to stack for MachO
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig41
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,
}
});