authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-03-18 23:10:44-04:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-21 08:49:54+01:00
log80427796df5f8eb23ac7ca8ee03ac572b737757f
treed29cb1a6945d359ad427abd4f8157529db180625
parent53ec2a955eb02dc829af8610f17af42717d512fb

x86_64: implement @returnAddress and @frameAddress


2 files changed, 9 insertions(+), 3 deletions(-)

src/arch/x86_64/CodeGen.zig+9-2
...@@ -4119,12 +4119,19 @@ fn airBreakpoint(self: *Self) !void {...@@ -4119,12 +4119,19 @@ fn airBreakpoint(self: *Self) !void {
4119}4119}
41204120
4121fn airRetAddr(self: *Self, inst: Air.Inst.Index) !void {4121fn airRetAddr(self: *Self, inst: Air.Inst.Index) !void {
4122 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airRetAddr for x86_64", .{});4122 const result: MCValue = if (self.liveness.isUnused(inst))
4123 .dead
4124 else
4125 .{ .stack_offset = -@as(i32, @divExact(self.target.cpu.arch.ptrBitWidth(), 8)) };
4123 return self.finishAir(inst, result, .{ .none, .none, .none });4126 return self.finishAir(inst, result, .{ .none, .none, .none });
4124}4127}
41254128
4126fn airFrameAddress(self: *Self, inst: Air.Inst.Index) !void {4129fn airFrameAddress(self: *Self, inst: Air.Inst.Index) !void {
4127 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airFrameAddress for x86_64", .{});4130 const result = if (self.liveness.isUnused(inst)) .dead else result: {
4131 const dst_mcv = try self.allocRegOrMem(inst, true);
4132 try self.genBinOpMir(.mov, Type.usize, dst_mcv, .{ .register = .rbp });
4133 break :result dst_mcv;
4134 };
4128 return self.finishAir(inst, result, .{ .none, .none, .none });4135 return self.finishAir(inst, result, .{ .none, .none, .none });
4129}4136}
41304137
test/behavior/return_address.zig-1
...@@ -7,7 +7,6 @@ fn retAddr() usize {...@@ -7,7 +7,6 @@ fn retAddr() usize {
77
8test "return address" {8test "return address" {
9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO10 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO11 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO12 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO